信任$ _SERVER ['REMOTE_ADDR']是否安全?

时间:2011-01-23 13:07:51

标签: php security ip-address

信任$_SERVER['REMOTE_ADDR']是否安全?是否可以通过更改请求标题或类似内容来替换它?

写这样的东西是否安全?

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

3 个答案:

答案 0 :(得分:98)

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

您可能需要担心的一种情况是,如果您在反向代理之后,在这种情况下,REMOTE_ADDR将始终是代理服务器的IP,并且用户IP将在HTTP标头中提供(例如{{ 3}})。但对于正常使用案例,REMOTE_ADDR很好。

答案 1 :(得分:55)

$_SERVER['REMOTE_ADDR']是TCP连接的IP地址。虽然在技术上可以在互联网上双向欺骗IP地址(通过BGP宣布犯规路线),但这种攻击很可能被发现并且不可用于典型的攻击者 - 基本上,攻击者必须能够控制ISP或运营商。尚未对TCP进行可行的单向欺骗攻击(尚未)。然而,在LAN上双向IP欺骗是微不足道的。

另请注意,它可能不是IPv4,而是IPv6地址。在这方面,您当前的检查没有问题,但是如果您检查1.2.3.4只在$_SERVER['REMOTE_ADDR']> ,则攻击者只能从2001:1234:5678::1.2.3.4进行连接。< / p>

总之,除了关键(银行/军事/潜在损害> 50.000€)应用程序以外的任何其他应用程序,如果您可以排除本地网络中的攻击者,则可以使用远程IP地址。

答案 2 :(得分:3)

如上所述,它并非绝对安全。但这并不意味着你不应该使用它。考虑将此与其他一些身份验证方法结合使用,例如检查COOKIE值。