Discuz获取IP的bug问题分析,坑爹的玩意

discuz的获取IP的方法是如下代码,每个版本位置不同,2.5的版本在 \source\class\discuz\discuz_application.php:


	private function _get_client_ip() {
		$ip = $_SERVER['REMOTE_ADDR'];
		if (isset($_SERVER['HTTP_CLIENT_IP']) 
&& preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
			$ip = $_SERVER['HTTP_CLIENT_IP'];
		} elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) 
AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', 
$_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
			foreach ($matches[0] AS $xip) {
				if (!preg_match('#^(10|172\.16|192\.168)\.#',
 $xip)) {
					$ip = $xip;
					break;
				}
			}
		}
		return $ip;
	}
这个代码获取IP有问题,为什么说获取有问题呢,因为以上代码是可以通过CURL伪造的:


注意CURL可以伪造 $_SERVER['HTTP_CLIENT_IP']    $_SERVER['HTTP_X_FORWARDED_FOR'] 全局变量。


那问题来了,discuz的这个获取IP的函数,默认是获取

$_SERVER['REMOTE_ADDR']
的,但是当通过CURL伪造的时候,就可以让 $_SERVER['HTTP_CLIENT_IP']    $_SERVER['HTTP_X_FORWARDED_FOR'] 不为空,这样,就会导致IP变量被覆盖,导致的问题可想而知。


获取的全都是伪造的IP,如果我们利用这个函数进行判断,限制用户操作、屏蔽IP的时候,那么其实也是鸟用没有的

至于改造,其实,也很简单,我就不说了,

关键词: ip的bug , discuz

上一篇: xcode7下pod install报错Assertion failed: _initializationCompletedSuccessfully
下一篇: 昨天正在申请上架一款IOS 的app

#1
回复 roushan 2015-10-21, 12:09 AM
图片压缩lrz。js时常内存溢出,在微信浏览器直接就跳转到首页了,请帮忙解答,提供点优化方案。
回复 jincon 2015-10-27, 12:59 PM
@roushan: 你说的问题,貌似我没有遇到啊~~
发表评论

评论内容 (必填):