都 8012 年了,腾讯云 cdn 居然还不能获取访问 cdn 节点的用户 ip

2018-06-12 14:57:19 +08:00
 changwei

别家的云可以通过其他方式来获取连接到 cdn 节点的真实 IP (例如将真实 IP 写入特定的 HTTP 头部),腾讯云 cdn 还只能用 x-forward-for 这种会被伪造的有安全风险的方式来获取

我有些 PHP 网站需要通过这个来判断要不要弹验证码(策略是:同一个 IP 输错多少次验证码或者密码就弹验证码,要是用户伪造了 x-forward-for,我的验证码就失效了)

加这个功能没有多少技术难度吧。

4348 次点击
所在节点    全球工单系统
11 条回复
surfire91
2018-06-12 15:07:43 +08:00
瞎猜:
其实 x-forward-for 也可以?如果腾讯云 CDN 内部不转发,直接拿最后一段,也就是直连腾讯云 CDN 的 ip。
Felldeadbird
2018-06-12 15:17:51 +08:00
x-forward-for 是腾讯拿回来给你的客户真实 IP。 如果按照常理来看,确实是会被伪造。但是,我觉得腾讯的技术人员应该不会犯这种低级玩意吧? 他们应该是将他们获取到的客户真实 IP,header 到 x-forward-for 而已。
mydns
2018-06-12 15:20:09 +08:00
前年提交的 CDN 工单 直接告知页面 10 秒超时改不了
zpf124
2018-06-12 15:23:06 +08:00
连接到 cdn 节点的真实 ip 按道理作为一个代理服务器 cdn 会给你添加到 x-forward-for 这个头里啊。

所以最终结果就两种,
(之前多段 ip), 连接到 cdn 的 ip
或者
(之前多段 ip), 连接到 cdn 的 ip, cdn 的 ip

你抓一个请求头看看包不包含 cdn 自己的 ip 就完了
widdy
2018-06-12 15:33:11 +08:00
楼主先伪造一个 x-forward-for,看看 CDN 转发给你的对不对,在来喷啊。
phithon
2018-06-12 15:34:05 +08:00
别家的云可以通过其他方式来获取连接到 cdn 节点的真实 IP (例如将真实 IP 写入特定的 HTTP 头部),腾讯云 cdn 还只能用 x-forward-for 这种会被伪造的有安全风险的方式来获取

可以考虑再理解一下 x-forward-for 是什么。
Reficul
2018-06-12 16:02:37 +08:00
x-forward-for 不是头?这个头的确可以伪造,所以你要加 ip 白名单,不能信任非来自 CDN 的找个头。
tencentcloud
2018-06-12 16:11:08 +08:00
@changwei 您好,非常抱歉之前的工单答复给您造成误解。腾讯云 CDN 可以通过 x-forward-for 字段和访问日志两种方式来获取用户 IP。x-forward-for 字段是后端通过配置,获取真实客户端 IP 然后写入的,我们也可以支持后端特殊配置为其他字段来获取用户 IP。

如您需要添加此项配置,欢迎您在工单里面反馈,我们会及时为您处理。感谢您的理解与支持。
feverzsj
2018-06-12 16:27:19 +08:00
http 就别用 ip 判断,本身就不靠谱
Hardrain
2018-06-12 16:28:12 +08:00
1. XFF header 的规则是这样,每经过一个代理 /CDN,这个代理 /CDN 就把上一个代理 /CDN/用户的 IP 附加到 XFF 后面,逗号分隔。这符合 HTTP 对于一个 Header 多个参数的规范。
例: 后端----前端(反代)------CDN/缓存------负载均衡器------用户

后端收到的 XFF 内容如下:用户 IP, 负载均衡器 IP, CDN/缓存 IP

参考: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For

2. 关于获取 XFF 中用户的 IP:
Apache 和 Nginx 都有相关模块,请参考文档。
https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html
http://nginx.org/en/docs/http/ngx_http_realip_module.html

3. PHP 获取 XFF header 的内容:
关于 PHP 获取 Header: https://secure.php.net/manual/zh/function.getallheaders.php
不过这个只适用于 Apache+mod_php,底下评论里有 Apache+PHP-FPM/Nginx 这类只能用 FPM 的 HTTP Server 所适用的解决方案

如果 XFF 有多个 IP,用 explode()逗号做 delimiter 转成数组再处理

4. 关于伪造 XFF,楼主想必看了些关于"伪造 XFF 绕过基于 IP 的 ACL"的文章。但我不得不说,you're so rigid. XFF 是 header,改个名字(X-Real-IP, X-Client-IP, etc)就不能被伪造了?

对付伪造, @Reficul 所说的才是有效的解决方案。你需要的是白名单,即只接受(你所用 CDN 的)指定 IP 发来的请求中的 XFF。

参考 Apache mod_remoteip 的 RemoteIPTrustedProxy 和 RemoteIPTrustedProxyList 参数
Nginx 的 set_real_ip_from 参数。

-------

可算是把饭"喂到嘴"了,恁可以自己去查查文档吗?
zhuzhenyu
2019-06-25 20:16:08 +08:00
问题来了,腾讯云 CDN 的 IPv4 和 IPv6 的 地址段是多少,想设置在信任列表里。腾讯云 CDN 文档中没有找到像 cloudflare 这样的 [IP Ranges]( https://www.cloudflare.com/ips/) 页面.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/462472

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX