如何正确获取用户 IP (避免透明代理,避免伪造 HTTP_X_FORWARDED_FOR)

2014-10-13 23:48:48 +08:00
 xingzhi

说明

217.33.193.179:3128 为透明代理。

11.11.11.11 为用户真实IP(打码)。

匿名代理无解,现希望在用户使用透明代理的情况下,正确获取他的真实IP。

nginx 相关设置:

uwsgi_param   Host                 $host;
uwsgi_param   X-Real-IP            $remote_addr;
uwsgi_param   X-Forwarded-For      $proxy_add_x_forwarded_for;
uwsgi_param   X-Forwarded-Proto    $http_x_forwarded_proto;

CASE 1 仅使用透明代理

curl -x 217.33.193.179:3128 http://test.com

获取的META信息:

'HTTP_X_FORWARDED_FOR': '11.11.11.11'
'REMOTE_ADDR': '217.33.193.179'

'X-Real-IP': '217.33.193.179'
'X-Forwarded-For': '11.11.11.11, 217.33.193.179'

CASE 2 使用透明代理加伪造X-Forwarded-For

curl -x 217.33.193.179:3128 -H "X-Forwarded-For:192.168.0.1, 192.168.0.2" http://test.com

获取的META:

'HTTP_X_FORWARDED_FOR': '192.168.0.1, 192.168.0.2, 11.11.11.11'
'REMOTE_ADDR': '217.33.193.179'

'X-Real-IP': '217.33.193.179'
'X-Forwarded-For': '192.168.0.1, 192.168.0.2, 11.11.11.11, 217.33.193.179'

CASE3 仅使用伪造X-Forwarded-For

curl -H "X-Forwarded-For:192.168.0.1, 192.168.0.2" http://test.com

获取的META:

'HTTP_X_FORWARDED_FOR': '192.168.0.1, 192.168.0.2'
'REMOTE_ADDR': '11.11.11.11'

'X-Real-IP': '11.11.11.11'
'X-Forwarded-For': '192.168.0.1, 192.168.0.2, 11.11.11.11'

CASE4 正常访问

curl http://test.com

获取的META:

'HTTP_X_FORWARDED_FOR': None
'REMOTE_ADDR': '11.11.11.11'

'X-Real-IP': '11.11.11.11'
'X-Forwarded-For': '11.11.11.11'
8683 次点击
所在节点    问与答
13 条回复
oott123
2014-10-13 23:58:08 +08:00
不要信任任何 HTTP 头。
也就是说,直接用 remote address 吧。
鬼知道用户会不会伪装成一个透明代理?
xingzhi
2014-10-13 23:59:29 +08:00
@oott123 HTTP 头可伪造,但如果直接用REMOTE_ADDR的话,当使用透明代理时,就无法获取真实IP了,难度无解了?
oott123
2014-10-14 00:01:58 +08:00
@xingzhi 现在用透明代理的有几个啊…那都是上古的事情了吧。
说拿 IP,确实无解了,但用户的真实 IP 又有什么用呢?这可能有其它的方法来实现你的需求了。
xingzhi
2014-10-14 00:08:02 +08:00
@oott123 只能说 X_FORWARDED_FOR 太鸡肋了。 恩,确实可以从其它方法实现需求。 感谢回复:)
cevincheung
2014-10-14 00:13:58 +08:00
从来都直接获取remote_addr,一直无视用户使用代理情况,误杀就误杀了。
joyqi
2014-10-14 00:44:34 +08:00
kevinv
2014-10-14 00:47:17 +08:00
曾经也曾被获取ip的问题折腾过,真心没有办法,只能换其他的思路去解决问题。
SoloCompany
2014-10-14 01:00:08 +08:00
https://code.google.com/p/xebia-france/wiki/RemoteIpValve

你看完这篇文字,理解了里面的 internalProxies 和 trustedProxies 大概就明白应该怎么做才能在得到真实IP和安全性(IP伪造)之间得到折衷了
zyx89513
2014-10-14 04:59:54 +08:00
如果你不介意付费的话, 可以试试这个产品 https://www.maxmind.com/en/proxy
cevincheung
2014-10-14 06:52:11 +08:00
@zyx89513 感觉这东西没用,临时搭建一批proxy太容易了
zyx89513
2014-10-14 07:57:40 +08:00
@cevincheung 那倒是, 可能他们是收集了一些主流的代理服务商把
z4213489
2014-10-14 09:53:08 +08:00
看场景吧
对真实性要求不高的可以用http头(部分伪造的可以忽略),如果真实性要求高的只能忽略代理情况直接用remote_addr了
jookr
2014-10-14 11:18:04 +08:00
只有REMOTE_ADDR伪造不了 不用这个还用哪个

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

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

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

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

© 2021 V2EX