信任$_SERVER['REMOTE_ADDR']
是否安全?是否可以通过更改请求标题或类似内容来替换它?
写这样的东西是否安全?
if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
$grant_all_admin_rights = true;
}
答案 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值。