信任 $_SERVER['REMOTE_ADDR'] 安全吗?

2022-08-30 07:54:23

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

写这样的东西安全吗?

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

答案 1

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

您可能需要担心的一种情况是,如果您位于反向代理后面,在这种情况下,REMOTE_ADDR将始终是代理服务器的IP,并且用户IP将在HTTP标头中提供(例如X-Forwarded-For)。但对于正常的用例,阅读REMOTE_ADDR是可以的。


答案 2

$_SERVER['REMOTE_ADDR']是 TCP 连接传入的 IP 地址。虽然从技术上讲,可以双向欺骗互联网上的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地址。


推荐