V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xingzhi
V2EX  ›  问与答

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

  •  1
     
  •   xingzhi · 2014-10-13 23:48:48 +08:00 · 8813 次点击
    这是一个创建于 3697 天前的主题,其中的信息可能已经有所发展或是发生改变。

    说明

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

    你看完这篇文字,理解了里面的 internalProxies 和 trustedProxies 大概就明白应该怎么做才能在得到真实IP和安全性(IP伪造)之间得到折衷了
    zyx89513
        9
    zyx89513  
       2014-10-14 04:59:54 +08:00   ❤️ 1
    如果你不介意付费的话, 可以试试这个产品 https://www.maxmind.com/en/proxy
    cevincheung
        10
    cevincheung  
       2014-10-14 06:52:11 +08:00
    @zyx89513 感觉这东西没用,临时搭建一批proxy太容易了
    zyx89513
        11
    zyx89513  
       2014-10-14 07:57:40 +08:00
    @cevincheung 那倒是, 可能他们是收集了一些主流的代理服务商把
    z4213489
        12
    z4213489  
       2014-10-14 09:53:08 +08:00
    看场景吧
    对真实性要求不高的可以用http头(部分伪造的可以忽略),如果真实性要求高的只能忽略代理情况直接用remote_addr了
    jookr
        13
    jookr  
       2014-10-14 11:18:04 +08:00
    只有REMOTE_ADDR伪造不了 不用这个还用哪个
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2762 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:24 · PVG 23:24 · LAX 07:24 · JFK 10:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.