【发布时间】:2011-06-14 00:34:10
【问题描述】:
信任$_SERVER['REMOTE_ADDR'] 是否安全?可以通过更改请求的标头或类似的东西来代替吗?
这样写安全吗?
if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
$grant_all_admin_rights = true;
}
【问题讨论】:
-
添加到现有答案中,它始终是向您的服务器发出请求的 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 您不能通过设置 HTTP 请求标头来欺骗
$_SERVER['REMOTE_ADDR']变量。在$_SERVER超全局中创建键时,PHP 会自动为所有 HTTP 请求标头添加HTTP_前缀。
标签: php security ip-address