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


89

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

这样写安全吗?

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

3
除了现有答案外,向您的服务器发出请求的始终是IP地址,但这并不意味着是启动请求的计算机的IP地址。您和最终用户之间可以有任意数量的代理服务器,最接近的是您获得的IP地址。
丹·格罗斯曼

是的,它很安全,因为它不能被其他技巧或作弊所代替。但请确保为$ grant_all_admin_rights变量添加更多检查。
尤达·普拉维拉

任何$ _SERVER变量都可以被欺骗-例如curl_setopt($ ch,CURLOPT_HTTPHEADER,array(“ REMOTE_ADDR:$ ip”,“ HTTP_X_FORWARDED_FOR:$ ip”)); 因此,这完全取决于上下文:如果攻击者期望得到响应,它将返回到$ ip。如果他们不关心响应,那么他们当然可以欺骗标头。如果您的代码在标头后面检查则改为:“ open_the_door_to_badguys();” 你会有问题。
TMG

3
@TMG您不能通过$_SERVER['REMOTE_ADDR']设置HTTP请求标头来欺骗变量。HTTP_$_SERVER超全局变量中创建键时,PHP会自动为所有HTTP请求标头添加前缀。
MrWhite 2015年

Answers:


110

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

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


4
IP地址欺骗呢?
阿卜杜勒2015年

1
@Abdull可以执行此操作的人通常与可以实际访问您的盒子的人相同。所以不用那么担心。
Behrooz

5
@Abdull IP欺骗只能以一种方式发送消息,您不能欺骗IP并获得消息作为回报。

1
互联网路由器不是在检查源IP和目标IP来路由数据包吗?我怀疑欺骗性数据包是否会跨Internet节点到达目的地。
维克多·乔拉斯

57

$_SERVER['REMOTE_ADDR']是TCP连接进入的IP地址。尽管从技术上讲可以双向欺骗Internet上的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地址。


4
您听起来非常了解Internet协议。
Brian Peterson

@ phihag,$_SERVER['REMOTE_ADDR']TCP连接进入的IP地址是否完全取决于您的SAPI。
Pacerier,2015年

对于WEP / WPA WLAN上的攻击者来说,启动真正的客户端并欺骗该ip地址绝非不可能-WEP和WPA都有弱点,这些弱点使得you have been kicked off the wlan使用正确的工具轻松创建欺骗数据包。WPA downgrade test例如google
hanshenrik

IP地址是IP级别而不是TCP级别。
维克多·乔拉斯

3

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


6
欺骗IP地址后,更改http请求并发送虚假cookie真是小菜一碟..(或一块cookie)
Uri Goren

1
请解释“不是绝对安全”的意思
杰克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.