【问题标题】:Is the web server variable $_SERVER['REMOTE_ADDR'] reliable?Web 服务器变量 $_SERVER['REMOTE_ADDR'] 是否可靠?
【发布时间】:2014-08-14 20:10:02
【问题描述】:

我通常假设在 PHP 脚本中我可以测试 $_SERVER['REMOTE_ADDR'] 来确定发起请求的 IP 地址。然而,我开始怀疑事情是不是有点复杂。这是场景

  • 我运行许多服务器,分别称为 ABC - 用户必须在这些服务器上“注册”李>
  • 我运行一个单独的注册服务器,称为 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 的虚拟服务器上 IP 地址池中的另一个 IP 地址

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

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

【问题讨论】:

  • 您使用 PHP 作为module 还是fcgi/fpm?请同时检查变量$_SERVER['HTTP_CLIENT_IP']$_SERVER['HTTP_X_FORWARDED_FOR'],因为在使用不同的服务器、(反向)代理和配置时,所有三个变量的填充方式都不同。
  • 重复:12。你的确切问题是什么?如果它是“REMOTE_ADDR 不可靠”,答案是“是的,如果您希望它始终包含某些特定的计算机地址。它告诉某台计算机的 ip 连接来自的方式是可靠的”。
  • IP 地址$_SERVER['REMOTE_ADDR'] 是直接响应的公共 IP 地址 - 不可能伪造它(除非攻击者不关心接收响应)。从问题的内容来看:您的测试方式存在缺陷,因为它不是这样工作的。
  • 如果你在做服务器到服务器的通信(服务器S到服务器A),不可能在REMOTE_ADDR中有人类访问者的IP。
  • @AD7six REMOTE_ADDR 可以指向防火墙、代理、VPN 端点或其他东西。对于我正在使用的这台计算机,我可以选择我想要的任何代理,因此告诉我正在使用什么计算机是不可靠的。这与服务器向客户端发送响应的能力无关。

标签: php superglobals


【解决方案1】:

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

可靠吗?是的。

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

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

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

【讨论】:

  • 我知道您的意图是有充分理由的 :),对于第一次阅读本文的人来说,值得一提的是,这样做 $myCustomersIP = $_SERVER["HTTP_X_FORWARDED_FOR"]; 是错误的。但我完全同意你的看法:)
  • @Shotgun getallheaders()['X-Forwarded-For'] 最终成为解决令人头疼的问题的理想解决方案。谢谢!
【解决方案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,但它并不总是完全符合您的要求,因此无论如何您都必须使用其他的每个人都说他们有多“不安全”。

【讨论】:

  • 众神之恩 - 不。不要想着依赖X_FORWARDED_FOR
  • @AlmaDo X_FORWARDED_FOR 在某些情况下是可以信赖的。特别是当您在服务器前面有一个缓存/负载平衡器并始终清除任何外部 x-forwarded-for 标头时。只有用户提供的值不应该被信任。
  • 它可以被检查(充其量 - 获取一些信息)。但它不应该永远依赖
  • 依赖X_FORWADED_FOR 是一个巨大的安全漏洞。参见例如this postit is very difficult to get the IP Address you want to have. - 不,不是 =)。问题是询问发起请求的机器的 IP 地址,而不是例如终端客户端的公共 IP。
  • 没有什么可依赖的了。如果您为任何事情运行自己的前端代理,则必须依赖 x-forwarded-for。或其他具有完全相同功能的标头。要提高信任度,您唯一能做的就是在该字段上签名,但我不知道有什么软件能够开箱即用。
猜你喜欢
  • 2011-10-06
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2011-03-29
  • 2011-07-02
  • 2011-05-14
  • 2011-06-14
相关资源
最近更新 更多