假设$ _SERVER ['SERVER_ADDR'] === $ _SERVER ['REMOTE_ADDR'],服务器是发出请求的服务器,这是多么安全?

时间:2013-06-22 23:09:37

标签: php security ip-address

嗯,这个问题说明了一切,我想知道,比较有多安全:

if ($_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']) {
    // yeah, it's the server, go ahead do this.
}

我要问的原因是识别来自服务器本身的一些web api调用。

我知道可以欺骗$_SERVER['REMOTE_ADDR']来运行请求,但不能从中获取结果。如果是这种情况,那么在谈论Rest时,例如,对于GET请求,这没有问题,但DELETE请求如何,不需要解析来自服务器的响应。
如果上述陈述是正确的,则意味着您不应该相信后面提到的比较? 有什么替代方案(让我们从这里排除CLI)?

2 个答案:

答案 0 :(得分:1)

这不是一个安全的假设。正如@TimWolla所提到的那样,有$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR'] true没有请求来自服务器的请求。还要考虑LAN上的其他设备。考虑一下这种情况:

  • 您的服务器的本地IP为192.168.1.2
  • 网络上的恶意用户的本地IP为192.168.1.3
  • 您的网络的公开IP为1.2.3.4

如果您的服务器正在收听1.2.3.4:80,那么来自1.2.3.4:80的恶意客户端的请求将$_SERVER['REMOTE_ADDR'] = '1.2.3.4'

因此,如果只有您的服务器需要能够访问此功能,则不应公开将此端口公开给Internet。您应该在另一个端口(比如81)和防火墙端口上配置一个单独的apache虚拟主机,以便它拒绝所有不是来自服务器本身的传入连接。

答案 1 :(得分:1)

最佳解决方案是使用安全密码。

只要您的检查只允许正确的密码,您就不必担心伪造的IP地址或其他可能的不安全检查方式。

if ($_GET['password'] === 'my_password') {
    // code
}

考虑使用secure compare function来避免计时攻击。