代码之家  ›  专栏  ›  技术社区  ›  Rosamunda

关于[http_x_forwarded]的安全问题,我应该使用它而不是[remote_addr]?

  •  0
  • Rosamunda  · 技术社区  · 6 年前

    我试图创建一个PHP计数器,为了不计算来自同一个访问者的重复访问,我一直在考虑 saving the visitor's IP address into the database 我应该转向 $_SERVER

    我读过这个 sample funtion by @Dusza 看起来很好也很方便:

    <?php
    function get_IP() {
    
    // ADDRESS IP
       if     (getenv('HTTP_CLIENT_IP'))       $ipaddress = getenv('HTTP_CLIENT_IP');
       else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
       else if(getenv('HTTP_X_FORWARDED'))     $ipaddress = getenv('HTTP_X_FORWARDED');
       else if(getenv('HTTP_FORWARDED_FOR'))   $ipaddress = getenv('HTTP_FORWARDED_FOR');
       else if(getenv('HTTP_FORWARDED'))       $ipaddress = getenv('HTTP_FORWARDED');
       else if(getenv('REMOTE_ADDR'))          $ipaddress = getenv('REMOTE_ADDR');
       else                                    $ipaddress = 'UNKNOWN';
    //return $ipaddress;
        }
    ?>
    

    但我已经做到了 some research here 发现其中存在一个安全漏洞,因为用户可以欺骗除远程地址之外的所有值,远程地址可以由代理修改。

    所以我猜,当他们说存在安全漏洞时,这意味着当我将用户的输入插入数据库进行绑定时,我应该清理它。

    还有其他预防措施吗?

    考虑到所有其他值都不可靠,我应该避免全部使用它们?

    但是远程地址的un-spofing值呢?可以由代理修改。

    我该走哪条路有什么建议?

    如果你想投反对票,或者投票决定要关闭或删除的问题, 请离开 我对为什么 ,这样我可以改进我的问题。谢谢。

    1 回复  |  直到 6 年前
        1
  •  4
  •   deceze    6 年前

    REMOTE_ADDR 是通过3路TCP/IP握手建立的IP地址。响应将被发送回的IP。这是服务器唯一验证过的。其他一切都只是任意的HTTP头 任何人 可以设置。

    现在,如果 你知道的 您的服务器运行在代理(例如负载均衡器)后面,该代理会屏蔽访问者的IP地址(您的服务器只会看到代理的IP),但是 你知道的 代理在HTTP报头中帮助您转发访问者的IP(作为解决这种情况的方法,这样您的服务器仍然可以看到访问者的IP)。 然后,直到那时 您可以使用这些HTTP头中的一个,并且只使用您知道您的代理正在设置的那个。 如果服务器不在代理之后,请使用 远程地址 仅限于此。否则,请参考您的代理手册,并根据情况进行实施。

    network diagram