【问题标题】:Is it safe to trust $_SERVER['REMOTE_ADDR']?信任 $_SERVER['REMOTE_ADDR'] 是否安全?
【发布时间】:2011-06-14 00:34:10
【问题描述】:

信任$_SERVER['REMOTE_ADDR'] 是否安全?可以通过更改请求的标头或类似的东西来代替吗?

这样写安全吗?

if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
    $grant_all_admin_rights = true;
}

【问题讨论】:

  • 添加到现有答案中,它始终是向您的服务器发出请求的 IP 地址,但这并不意味着它是启动请求的计算机的 IP 地址。您和最终用户之间可以有任意数量的代理服务器,最接近您的是您获得的 IP 地址。
  • 是的,它是安全的,因为不能用其他技巧或作弊来代替。但请确保为 $grant_all_admin_rights 变量添加更多检查。
  • 任何 $_SERVER 变量都可以被欺骗——例如curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: $ip", "HTTP_X_FORWARDED_FOR: $ip"));所以这完全取决于上下文:如果攻击者期待响应,它将返回到 $ip。如果他们不关心响应,他们当然可以欺骗标头。如果标题检查后的代码改为:“open_the_door_to_badguys();”你会有问题。
  • @TMG 您不能通过设置 HTTP 请求标头来欺骗 $_SERVER['REMOTE_ADDR'] 变量。在 $_SERVER 超全局中创建键时,PHP 会自动为所有 HTTP 请求标头添加 HTTP_ 前缀。

标签: php security ip-address


【解决方案1】:

是的,它是安全的。它是 TCP 连接的源 IP,不能通过更改 HTTP 标头来代替。

您可能需要担心的一种情况是,如果您使用反向代理,在这种情况下,REMOTE_ADDR 将始终是代理服务器的 IP,并且用户 IP 将在 HTTP 标头中提供(例如 @987654321 @)。但对于正常用例,读取 REMOTE_ADDR 就可以了。

【讨论】:

  • IP 地址欺骗怎么办?
  • @Abdull 可以做到这一点的人通常是可以物理访问您的盒子的人。所以不用太担心。
  • @Abdull IP 欺骗只能以一种方式发送消息,您不能欺骗您的 IP 并获得消息作为回报。
  • 互联网路由器不检查源 IP 和目标 IP 以路由数据包吗?我怀疑欺骗性数据包是否会跨互联网节点到达目的地。
【解决方案2】:

$_SERVER['REMOTE_ADDR'] 是 TCP 连接进入的 IP 地址。虽然在 Internet 上双向欺骗 IP 地址在技术上是可行的(通过通过 BGP 宣布恶意路由),但这种攻击很可能被发现并且对典型的攻击者不可用 - 基本上,您的攻击者必须控制 ISP 或运营商。目前还没有针对 TCP 的可行单向欺骗攻击。不过,双向 IP 欺骗在 LAN 上是微不足道的。

还要注意,它可能不是 IPv4,而是 IPv6 地址。您当前的检查在这方面没有问题,但如果您检查1.2.3.4 仅出现在$_SERVER['REMOTE_ADDR']任何地方,攻击者可以简单地从2001:1234:5678::1.2.3.4 连接。

总之,对于关键(银行/军事/潜在损害 >50.000 欧元)应用程序以外的任何应用程序,如果您可以排除本地网络中的攻击者,则可以使用远程 IP 地址。

【讨论】:

  • 您听起来对 Internet 协议非常了解。
  • @phihag,$_SERVER['REMOTE_ADDR'] 是否是 TCP 连接的 IP 地址完全取决于您的 SAPI。
  • 对于 WEP/WPA WLAN 上的攻击者来说,踢出真正的客户端并欺骗该 IP 地址远非不可行 - WEP 和 WPA 都存在使欺骗 you have been kicked off the wlan 数据包易于创建的弱点使用正确的工具。谷歌WPA downgrade test,例如
  • IP地址是IP级别而不是TCP级别。
【解决方案3】:

如上所述,它不是绝对安全的。但这并不意味着您不应该使用它。考虑将其与其他一些身份验证方法结合使用,例如检查 COOKIE 值。

【讨论】:

  • 欺骗IP地址后,更改http请求,发送虚假cookie是小菜一碟.....(或cookie)
  • 请解释一下您所说的“不是绝对安全”是什么意思
猜你喜欢
  • 2021-03-12
  • 2011-08-15
  • 2017-01-03
  • 2012-08-26
  • 1970-01-01
  • 2012-01-01
  • 2010-11-23
  • 2013-06-19
  • 1970-01-01
相关资源
最近更新 更多