浏览器保护用户的IP地址吗


do browsers protect users IP address?

我正在用PHP编写代码,我想检测客户端的IP地址。我一直在使用$_SERVER['REMOTE_ADDR']。

它通常工作。。。但有时我会得到地址127.255.255.255.255,显然是一个经常上网的用户试图连接网站。这有原因吗?

127.255.255.255是来自内部服务器(环回)的广播

如果你确定它是一个外部用户,你应该在你的网站上检查代码注入的可能性。

问题不在于您在寻找什么。事实上,当使用inet_aton$_SERVER['REMOTE_ADDR']存储在mysql中时,必须确保该列定义为int (11) unsigned

如果您的列是带符号的int,则数据将被截断,并且所有大于127.255.255.255.255的IP地址都将按此方式保存。

您需要在mysql表上运行此查询(更改表和列名):

ALTER TABLE  `stats` CHANGE `ip` `ip` INT( 11 ) UNSIGNED;

问题是ip2long将返回一个大到4294967295(表示255.255.255.255)的数字,并且您的INT MySQL字段(如果已签名)接受2147483647的最大值(来源:http://dev.mysql.com/doc/refman/5.0/en/integer-types.html),因此任何高于2147483647的值都将被存储为2147483647。这就是为什么你的数据库中有很多127.255.255.255.255。

我想将数据库列转换为BIGINT或无符号INT会解决这个问题,但请注意,ip2long()的某些实现(我认为是32位与64位)会返回负数,要小心。

要回答标题中的问题:REMOTE_ADDR由相应的Web服务器设置,用户不能修改(除非使用代理等)。它是在任何HTTP发生之前根据传入的TCP连接确定的。

然而,它可能会被服务器网络中的一些防火墙或代理混淆。

另外令人困惑的是127.255.255.255.255是一个广播地址,不应该是HTTP连接(即TCP,仅限于单播)的源。