Web服务器变量$

我一般认为,在一个PHP脚本中,我可以测试$_SERVER['REMOTE_ADDR']来建立发起请求的IP地址。 但是,我开始怀疑事情是不是更复杂一点。 这是场景

  • 我运行了许多服务器,称它们为ABC--用户必须在其上“注册”
  • 我运行一个单独的注册服务器,将其称为S ,在向服务器A,B和C发出完整注册请求之前首先验证用户的凭证等
  • 该请求将作为

    file_get_contents('https://url?data=value')
    

    在服务器A,B和C上,我非常天真地测试$_SERVER['REMOTE_ADDR']来确定请求实际上来自服务器S。 令我惊讶的是,结果竟然是不完整和可变的

  • REMOTE_ADDR中的值是与注册服务器S交互的人类用户的IP地址
  • 在值REMOTE_ADDR是注册服务器,S的IP地址-我所希望看到所有的时间
  • REMOTE_ADDR中的值是来自主机服务器S所在虚拟服务器上IP地址池中的另一个IP地址
  • 我并不需要执行这个额外的验证测试,因此我可以完全放弃它。 尽管如此,这个结果让我感到惊讶,所以我很好奇,看看这里的某个人是否能够点亮发生的事情。

    我应该提到,我在服务器A,B和C上的Lighttpd上运行PHP 5.5 ,并在服务器S上的Apache 2上运行PHP 5.3


    REMOTE_ADDR是Apache(或任何其他Web容器)填充的变量,它包含通信另一端的终端IP地址。

    它可靠吗? 是。

    它安全吗? 取决于,如果您使用它,并认为它向您提供了拨打电话的用户的IP地址,那么您错了,任何代理站在路上都会破坏信息。

    在你的情况下,发出HTTP调用的服务器应该提供它的IP地址,所以情况2应该始终发生。 我不知道什么时候出了什么问题,但它的奇怪。

    为了响应Dany Caissy,不要依赖HTTP_X_FORWARDED_FOR ,它可以很容易地修改,因为它是一个HTTP头,而不是TCP / IP属性。


    REMOTE_ADDR不是获得IP地址的唯一方式,还有:

    HTTP_CLIENT_IP
    HTTP_X_FORWARDED_FOR
    HTTP_X_FORWARDED
    HTTP_X_CLUSTER_CLIENT_IP
    HTTP_FORWARDED_FOR
    HTTP_FORWARDED
    

    它们以不同的方式设置,可能意味着不同的事情,最终,获得您想要的IP地址非常困难。

    编辑:他们中唯一可靠并且不能被用户修改的是REMOTE_ADDR,但它并不总是完全按照你想要的来做,所以你必须使用其他的,不管怎样'不安全“每个人都说他们是。

    链接地址: http://www.djcxy.com/p/42269.html

    上一篇: Is the web server variable $

    下一篇: how reliable is $