Php 假设$#u SERVER[';SERVER#ADDR';]==$#u SERVER[';REMOTE#ADDR';]是发出请求的服务器吗?

Php 假设$#u SERVER[';SERVER#ADDR';]==$#u SERVER[';REMOTE#ADDR';]是发出请求的服务器吗?,php,security,ip-address,Php,Security,Ip Address,这个问题说明了一切,我想知道,这样的比较有多安全: if ($_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']) { // yeah, it's the server, go ahead do this. } 我之所以这样问,是为了识别一些来自服务器本身的web api调用 我知道可以欺骗$\u服务器['REMOTE\u ADDR']来运行请求,但不能从中获取结果。如果是这样的话,例如在谈到Rest时,GET请求就不会出现问题,但是删

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

if ($_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']) {
    // yeah, it's the server, go ahead do this.
}
我之所以这样问,是为了识别一些来自服务器本身的web api调用

我知道可以欺骗
$\u服务器['REMOTE\u ADDR']
来运行请求,但不能从中获取结果。如果是这样的话,例如在谈到Rest时,GET请求就不会出现问题,但是删除请求又如何呢?在这种情况下,不需要解析来自服务器的响应。
如果上述陈述正确,则表示您不应相信后面提到的比较?

有哪些替代方案(让我们从这里排除CLI)?

这不是一个安全的假设。正如@TimWolla所提到的,有一些请求,
$\u服务器['SERVER\u ADDR']==$\u服务器['REMOTE\u ADDR']
将是
true
,而不会在服务器上发出请求。也可以考虑局域网上的其他设备。考虑这种情况:

  • 您的服务器的本地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
发出的请求将具有
$\u服务器['REMOTE\u ADDR']='1.2.3.4'


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

最好的解决方案是使用安全密码

你不必担心伪造的ip地址或其他不安全的检查,只要你的检查只允许正确的密码

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

考虑使用a以避免定时攻击。

使用某种密码如何?可以安全地假设,如果
$\u服务器['REMOTE\u ADDR']
127.0.0.1
$\u服务器['SERVER\u ADDR']
,则请求来自服务器本身,但是,如果您不是服务器中唯一运行脚本的人,或者服务器正在运行Squid之类的代理服务,那么您可能会遇到麻烦。应该像TimWolla建议的那样更多地依赖于某种身份验证层。--TimWolla是的,你有一个观点,检查密码也会更聪明。-Havenard-好的,但是攻击者不能欺骗它的ip为127.0.0.1,因此它会欺骗机制吗?你不能使用欺骗的ip来稳定TCP会话或与任何服务器的任何类型的双向通信。在这里你不必担心这些。@Havenard-好的,谢谢你澄清:)是的,不。TCP不是这样工作的。。。REMOTE_ADDR是需要传递响应的客户端的IP地址。因此,如果
REMOTE\u ADDR
是与服务器相同的
192.168.1.2
,则请求来自服务器。。。这是在设计TCP和IP时考虑到的…@ircmaxell在我假设的情况下,
REMOTE\u ADDR
SERVER\u ADDR
不会相同,即使请求来自LAN上的另一个客户端?不。
REMOTE\u ADDR
始终是TCP数据包的接收者。因此,如果
REMOTE\u ADDR
=
SERVER\u ADDR
,要么服务器出现了问题(这可能会发生),要么您的路由器已经受损。不管怎样,这都不是常见的事情,也不是你应该依赖(或不依赖)的。。。