Web服务器变量$ _SERVER ['REMOTE_ADDR']是否可靠?

Dro*_*dOS 10 php superglobals

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

  • 我运行了许多服务器,称之为A,BC - 用户必须"注册"
  • 我运行一个单独的注册服务器,称之为S,在向服务器A,B和C发送完整的注册请求之前,首先验证用户的凭据等.

该请求以

file_get_contents('https://url?data=value')
Run Code Online (Sandbox Code Playgroud)

在服务器A,B和C,我很天真地测试$_SERVER['REMOTE_ADDR'],以确定该请求实际上由服务器来小号.令我惊讶的是,结果变得曲解和变化

  1. 值in REMOTE_ADDR是与注册服务器S交互的人类用户的IP地址
  2. 值in REMOTE_ADDR是注册服务器的IP地址,S - 我一直希望看到
  3. REMOTE_ADDR是来自我托管服务器S的虚拟服务器上的IP地址池中的另一个IP地址

我真的不需要执行这个额外的验证测试,所以我可以完全放弃它.尽管如此,这个结果让我感到意外,所以我很想知道这里是否有人可以了解正在发生的事情.

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

Dan*_*ssy 2

REMOTE_ADDR 不是获取 IP 地址的唯一方法,还有:

HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
HTTP_X_FORWARDED
HTTP_X_CLUSTER_CLIENT_IP
HTTP_FORWARDED_FOR
HTTP_FORWARDED
Run Code Online (Sandbox Code Playgroud)

它们的设置方式不同,含义也不同,最终很难获得您想要的 IP 地址。

编辑:其中唯一可靠且用户无法修改的是 REMOTE_ADDR,但它并不总是完全按照您的要求行事,因此您必须使用其他的,无论多么“不安全” ’每个人都说他们是。

  • 众神发誓——不。甚至不要考虑依赖“X_FORWARDED_FOR” (3认同)