1

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

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)?

4

3 回答 3

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 虚拟主机,并为该端口设置防火墙,以便它拒绝所有非来自服务器本身的传入连接。

于 2013-06-22T23:29:11.297 回答
1

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

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

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

考虑使用安全比较功能来避免定时攻击。

于 2013-06-22T23:29:51.697 回答
0

我会说它是安全的,只要它不执行任何有害的操作。

如果有人欺骗了 IP 地址,那么他们将不会收到响应,因为服务器会将响应发送给自己而不是攻击者。

因此,显示堆栈跟踪应该没问题,但是,如果您基于此执行了一些特殊操作,那么攻击者可能会在没有看到响应的情况下造成破坏。

于 2021-08-15T10:10:07.693 回答