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

时间:2012-03-11 13:10:20

标签: php mysql web

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

它通常有效...但有时我得到地址127.255.255.255,当显然是在常规互联网连接上的用户试图连接网站。这有什么理由吗?

4 个答案:

答案 0 :(得分:3)

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

如果您确定是外部用户,则应检查您网站上的code injection种可能性。

答案 1 :(得分:1)

问题是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的原因。

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

答案 2 :(得分:0)

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

但是,它可能会被服务器网络中的某些防火墙或代理混淆。

另外令人困惑的是127.255.255.255是一个广播地址,不应该是HTTP连接的源(TCP,只有Unicast)。

答案 3 :(得分:0)

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

如果您的列是签名int,则数据会被截断,并且所有大于127.255.255.255的IP地址都会保存。

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

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