别家的云可以通过其他方式来获取连接到 cdn 节点的真实 IP (例如将真实 IP 写入特定的 HTTP 头部),腾讯云 cdn 还只能用 x-forward-for 这种会被伪造的有安全风险的方式来获取
我有些 PHP 网站需要通过这个来判断要不要弹验证码(策略是:同一个 IP 输错多少次验证码或者密码就弹验证码,要是用户伪造了 x-forward-for,我的验证码就失效了)
加这个功能没有多少技术难度吧。
1
surfire91 2018-06-12 15:07:43 +08:00
瞎猜:
其实 x-forward-for 也可以?如果腾讯云 CDN 内部不转发,直接拿最后一段,也就是直连腾讯云 CDN 的 ip。 |
2
Felldeadbird 2018-06-12 15:17:51 +08:00
x-forward-for 是腾讯拿回来给你的客户真实 IP。 如果按照常理来看,确实是会被伪造。但是,我觉得腾讯的技术人员应该不会犯这种低级玩意吧? 他们应该是将他们获取到的客户真实 IP,header 到 x-forward-for 而已。
|
3
mydns 2018-06-12 15:20:09 +08:00
前年提交的 CDN 工单 直接告知页面 10 秒超时改不了
|
4
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 就完了 |
5
widdy 2018-06-12 15:33:11 +08:00
楼主先伪造一个 x-forward-for,看看 CDN 转发给你的对不对,在来喷啊。
|
6
phithon 2018-06-12 15:34:05 +08:00
别家的云可以通过其他方式来获取连接到 cdn 节点的真实 IP (例如将真实 IP 写入特定的 HTTP 头部),腾讯云 cdn 还只能用 x-forward-for 这种会被伪造的有安全风险的方式来获取
可以考虑再理解一下 x-forward-for 是什么。 |
7
Reficul 2018-06-12 16:02:37 +08:00 via Android
x-forward-for 不是头?这个头的确可以伪造,所以你要加 ip 白名单,不能信任非来自 CDN 的找个头。
|
8
tencentcloud 2018-06-12 16:11:08 +08:00
@changwei 您好,非常抱歉之前的工单答复给您造成误解。腾讯云 CDN 可以通过 x-forward-for 字段和访问日志两种方式来获取用户 IP。x-forward-for 字段是后端通过配置,获取真实客户端 IP 然后写入的,我们也可以支持后端特殊配置为其他字段来获取用户 IP。
如您需要添加此项配置,欢迎您在工单里面反馈,我们会及时为您处理。感谢您的理解与支持。 |
9
feverzsj 2018-06-12 16:27:19 +08:00
http 就别用 ip 判断,本身就不靠谱
|
10
Hardrain 2018-06-12 16:28:12 +08:00 2
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 参数。 ------- 可算是把饭"喂到嘴"了,恁可以自己去查查文档吗? |
11
zhuzhenyu 2019-06-25 20:16:08 +08:00 1
问题来了,腾讯云 CDN 的 IPv4 和 IPv6 的 地址段是多少,想设置在信任列表里。腾讯云 CDN 文档中没有找到像 cloudflare 这样的 [IP Ranges]( https://www.cloudflare.com/ips/) 页面.
|