• nginx的ngx_http_realip_module模块和http头X-Forwarded-For、X-Real-IP


    ngx_http_realip_module模块

    realip模块作用:当本机的nginx处于反向代理的后端时可以获取到用户的真实ip。可以让accesslog记录用户真实IP地址。

    set_real_ip_from IP1;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    
    • set_real_ip_from —— 设置反向代理服务器,即信任服务器IP
    • real_ip_header X-Forwarded-For —— 用户真实IP存在X-Forwarded-For请求头中
    • real_ip_recursive
      • off —— 会将real_ip_header指定的HTTP头中的最后一个IP作为真实IP
      • on —— 会将real_ip_header指定的HTTP头中的最后一个不是信任服务器的IP当成真实IP

    参考

    http头中的X-Forwarded-For(XFF)和X-Real-IP、Remote Address

    XFF位于HTTP请求头,是HTTP的扩展header,已经是事实上的标准。

    X-Forwarded-For用于表示HTTP请求端真实IP。
    格式如下:

    X-Forwarded-For: client, proxy1, proxy2
    

    nginx代理一般配置

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-For $remote_addr; #不合理,nginx之前的代理信息都被抹掉
    

    说明:
    1、X-Forwarded-For:最后一节是nginx追加上去的,但前面部分来源于nginx收到的请求头,这部分内容完全不可信。符合IP格式的才可以使用,否则容易引发XSS或者SQL注入漏洞。
    2、Remote Address:HTTP协议没有IP的概念,Remote Address来自于TCP连接,表示与服务端建立TCP连接的设备IP,因此,Remote Address无法伪造。
    3、X-Real-IP:HTTP代理用于表示与它产生TCP连接的设备IP,可能是其他代理,也可能是真正的请求端。

    结论:
    1、直接对外提供服务的web应用,在进行与安全有关的操作的时候,只能通过Remote Address获取IP,不能相信任何请求头。
    2、使用nginx等web server进行反向代理的web应用,要使用X-Forwarded-For的最后一节或者 X-Real-IP来获取IP,同时还应该进行web应用直接对外提供服务。
    3、在与安全无关的场景,可以通过 X-Forwarded-For的靠前位置获取IP,但是需要校验IP的合法性。

  • 相关阅读:
    yii2自带的backend,frontend不够用,添加一个后台模块怎么做?
    用yii2给app写接口(上)
    .htaccees什么鬼?怎么用?
    Nginx的伪静态是什么
    论中国为什么造不出cpu和操作系统
    Linux上查看用户名和组并把特定用户放到特定的组之下
    CentOS7上LNMP安装包一步搭建LNMP环境
    杭州考驾照-2017.4
    深入理解Nginx
    CentOS7上安装并配置Nginx、PHP、MySql
  • 原文地址:https://www.cnblogs.com/amyzhu/p/9610056.html
Copyright © 2020-2023  润新知