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

时间:2014-06-24 14:05:18

标签: php superglobals

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

  • 我运行了多个服务器,称之为 A B C - 用户必须在这些服务器上注册& #34;
  • 我运行一个单独的注册服务器,称之为 S ,其中用户'在向服务器 A,B和C
  • 发送完整的注册请求之前,首先会验证凭据等

请求以

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

在服务器上 A,B和C 我非常天真地测试$_SERVER['REMOTE_ADDR']以确定该请求实际上来自服务器 S 。令我惊讶的是,结果证明是零散且可变的

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

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

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

2 个答案:

答案 0 :(得分:3)

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

可靠吗?是。

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

在您的情况下,发出HTTP调用的服务器应提供其IP地址,因此方案2应始终发生。我不知道什么时候出了什么问题,但它很奇怪。

要回复Dany Caissy,不要依赖HTTP_X_FORWARDED_FOR,它可以轻松修改,因为它是HTTP标头,而不是TCP / IP属性。

答案 1 :(得分:2)

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,但它并不总能完全符合您的要求,因此您无需使用其他的,无论如何每个人都说他们是多么'不安全'。