信任$ _SERVER 是否安全?

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

写这样的东西是否安全?

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

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

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

$_SERVER['REMOTE_ADDR']是TCP连接的IP地址。 虽然技术上可以双向欺骗互联网上的IP地址(通过通过BGP宣布犯规路由),但这种攻击很可能被发现,而典型的攻击者无法使用 – 基本上,攻击者必须能够控制ISP或运营商。 目前还没有针对TCP的可行的单向欺骗攻击。 尽pipe在局域网上双向IP欺骗是微不足道的。

另请注意,它可能不是IPv4,而是IPv6地址。 你目前的检查在这方面没有问题,但是如果你想检查1.2.3.4只发生在$_SERVER['REMOTE_ADDR'] 任何地方 ,攻击者可以简单地从2001:1234:5678::1.2.3.4

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

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