V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xzYao
V2EX  ›  程序员

请教一个后端获取用户真实 IP 的问题

  •  
  •   xzYao · 2019-06-19 12:38:51 +08:00 · 4734 次点击
    这是一个创建于 1977 天前的主题,其中的信息可能已经有所发展或是发生改变。

    后端 PHP,想要获取客户端的真实 IP。网上查阅资料,可以通过 remote_addr 和 x_forwarded_for 这两个头信息来获取。

    在中间没有代理的时候,remote_addr 代表客户端的 IP,但是有代理的时候 remote_addr 存的是代理机器 IP。 而当使用代理时,x_forwarded_for 会把代理 IP 拼接在后面,第一个始终是客户端真实 IP。但是 x_forwarded_for 客户端可以伪造。

    然后有资料说通过 nginx 配置: proxy_set_header X-Forward-For $remote_addr; 将 remote_addr 覆盖 x_forwarded_for,从而覆盖客户端伪造的信息,将客户端真实 IP 始终放在第一个,已获取客户端真实 IP。

    这里我的疑问是:就算我最外层的 nginx 代理(反向代理)通过配置,将 remote_addr 放在了 x_forwarded_for 的第一位,让后端可以通过获取 x_forwarded_for 第一位来获取用户真实 IP,如果最外层 nginx 和用户之间,存在用户的代理呢?此时 remote_addr 存的不就是用户代理的 IP 了么?

    21 条回复    2019-06-20 14:38:37 +08:00
    momocraft
        1
    momocraft  
       2019-06-19 12:54:05 +08:00
    是,没办法(其实如果有办法就是安全漏洞了)
    locoz
        2
    locoz  
       2019-06-19 13:06:09 +08:00
    没办法的,你不能保证用户自己不使用代理服务器进行转发。
    leishi1313
        3
    leishi1313  
       2019-06-19 13:23:50 +08:00 via Android
    后端没有办法的,只能给啥就是啥,前端还可以请求位置什么的
    Livid
        4
    Livid  
    MOD
       2019-06-19 13:24:52 +08:00
    Jirajine
        5
    Jirajine  
       2019-06-19 13:41:12 +08:00 via Android
    这个要是让你获得那还了得;前端还可以用点阴招偷到,所以浏览器必须要禁用 WebRTC,hyperlink ping 之类的。要是能让你取得这个那代理还有什么意义
    wuqingdzx
        6
    wuqingdzx  
       2019-06-19 14:48:03 +08:00
    用户辛辛苦苦用个代理就是不想让你知道用户的真实 IP 啊
    botsonar
        7
    botsonar  
       2019-06-19 14:50:45 +08:00
    有办法的,可以看看 webrtc
    xiangyuecn
        8
    xiangyuecn  
       2019-06-19 16:36:40 +08:00
    一棍子打死吧,永远不要使用 x_forwarded_for (包括类似的头)里面 不是自己控制(非反代设置的)的 ip。

    另外欢迎围观另外一种情况,14 年的帖子(真实 ip 的 真实 ip 到底特么是什么真实 ip ),https://bbs.csdn.net/topics/390727207,要多简单就会有多简单,要多复杂也会有多复杂 😂
    phpfpm
        9
    phpfpm  
       2019-06-19 16:40:30 +08:00
    就一句话:
    为了安全,如果 remote_addr 是你信任的节点,就用 xff 的 ip
    否则用 remoteaddr
    jay0726
        10
    jay0726  
       2019-06-19 17:07:02 +08:00
    AndroidEngineer
        11
    AndroidEngineer  
       2019-06-19 21:00:45 +08:00
    我用 tor 你能有办法?
    botsonar
        12
    botsonar  
       2019-06-19 21:19:06 +08:00
    @AndroidEngineer tor 也有办法的,现在也可以查出来你用没有用 tor
    vZexc0m
        13
    vZexc0m  
       2019-06-19 21:34:11 +08:00 via Android
    这个应该是无解的,只有 remote_addr 无法伪造,但是用户用了代理,你也无法获取真实 IP。
    hasoidhaio
        14
    hasoidhaio  
       2019-06-19 22:26:43 +08:00
    @botsonar tor 有公开出口节点
    botsonar
        15
    botsonar  
       2019-06-19 23:00:14 +08:00
    @hasoidhaio 嗯 这是一个好办法
    ChristopherWu
        16
    ChristopherWu  
       2019-06-19 23:16:28 +08:00
    请看: https://www.v2ex.com/t/543304, 我有详尽的解释这些关系。另外可以用 http://nginx.org/en/docs/http/ngx_http_realip_module.html 的。
    AndroidEngineer
        17
    AndroidEngineer  
       2019-06-20 12:47:03 +08:00
    @botsonar VPN + tor 你确定你能追溯到源 IP ?
    AndroidEngineer
        18
    AndroidEngineer  
       2019-06-20 12:48:17 +08:00
    @botsonar 我还可以加虚拟机
    xzYao
        19
    xzYao  
    OP
       2019-06-20 14:07:29 +08:00
    感谢各位大佬的回答,受教了
    botsonar
        20
    botsonar  
       2019-06-20 14:09:22 +08:00
    @AndroidEngineer 没办法追查源 IP 有 tor 的情况基本上都没有办法,只能监测出来有没有用 tor
    AndroidEngineer
        21
    AndroidEngineer  
       2019-06-20 14:38:37 +08:00
    @botsonar 如果真的考虑那么严格的话,可以考虑 tor 的流量混淆,这个我没有做过,但是在相关资料上看过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2960 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:50 · PVG 16:50 · LAX 00:50 · JFK 03:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.