修改discuz的IP检测方式,防止虚假ip的骚扰

最近几个论坛经常被注册机光顾,但是发现那些ip段实际上已经被用防火墙封了。
后来发现是discuz的ip检测方式:


if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
	$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
	$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
	$onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
	$onlineip = $_SERVER['REMOTE_ADDR'];
}

这种检测固然可以检测到代理或者nat后面的所谓“真实”的客户端ip,但这是对于那些正常用户,
对于流氓的注册机,除了REMOTE_ADDR,其他都是可以通过发送header来伪装,这样,就造成了在
discuz中记录的ip是虚假的!

其实,即便是使用代理服务器,如果有不良行为,直接封闭代理服务器的ip,你也无法封闭
真正的客户端ip,所以,我建议一定要记录REMOTE_ADDR,可以补充附加的ip。

UPDATE:
如果使用Squid方式来对后端程序负载的话,后端程序使用上述获取IP的方式是正确的。

« Previous Page