我正在用PHP编写代码,我想检测客户端的IP地址。 我一直在使用$ _SERVER ['REMOTE_ADDR']。
它通常有效...但有时我得到地址127.255.255.255,当显然是在常规互联网连接上的用户试图连接网站。这有什么理由吗?
答案 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;