嗯,这个问题说明了一切,我想知道,比较有多安全:
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)?
答案 0 :(得分:1)
这不是一个安全的假设。正如@TimWolla所提到的那样,有$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']
true
没有请求来自服务器的请求。还要考虑LAN上的其他设备。考虑一下这种情况:
192.168.1.2
192.168.1.3
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来避免计时攻击。