Don 发布的文章

游客可见游客发布的待审核帖子的bug分析

话说好久没捉虫了,今天突然发现个,哈哈~
此bug在Discuz! x2版本上发现。

具体表现为:
版块开启游客发表权限,发表新主题进入待审核。
在游客下发布帖子,提示进入审核,但游客状态下可以直接浏览。

代码分析:
source\function\function_forum.php文件,有如下代码

if(!$_G['forum_auditstatuson'] && !empty($_G['thread'])
		&& !($_G['thread']['displayorder'] >= 0 || (in_array($_G['thread']['displayorder'], array(-4,-3,-2)) && $_G['thread']['authorid'] == $_G['uid']))) {
	$_G['thread'] = null;
}

这里后面的$_G['thread']['authorid'] == $_G['uid']没有对$_G['uid']是否存在进行判断。

修复方案:
在$_G['thread']['authorid'] == $_G['uid']后面加上下面的代码:

 && $_G['uid']

此bug在Discuz! x25下未发现。

坑爹的QQ会员充话费服务——不能用!

尼玛的,用QQ会员充话费提示对不起,仅QQ会员和QQ准会员可尊享话费充值特权!

哥是会员啊,有木有!!!

既然您认为哥不是会员,那干毛哥用拍拍充完话费,你又给哥返回会员成长值!!!

尼玛,QQ会员太坑爹了,有木有!!!
100元话费会员下充值98,拍拍充值要98.9,不能用的服务就不要摆出来好不!!!

解析QQ互联的模板文件module.htm代码

一直没搞明白QQ互联的module.htm的代码是如何解析的,模板里并不是真正的html代码。
这里截取一部分模板代码,如下:

{eval
function tpl_global_login_extra() {
global $_G;
}

	

{lang qqconnect:connect_header_login}

{lang qqconnect:connect_header_login_tip}

{eval } function tpl_global_usernav_extra1() { }

为了搞清楚Discuz是如何解析的,需要从模板机制上分析。
找到source\class\class_template.php文件,其中有下面的代码片段:

$template = preg_replace("/[\n\r\t]*\{eval\s+(.+?)\s*\}[\n\r\t]*/ies", "\$this->evaltags('\\1')", $template);

这段代码是用来处理类似下面的模板代码的:

{eval
function tpl_global_login_extra() {
global $_G;
}

这句代码解析后的代码为:

解析的机制为:

function evaltags($php) {
	$php = str_replace('\"', '"', $php);
	$i = count($this->replacecode['search']);
	$this->replacecode['search'][$i] = $search = "";
	$this->replacecode['replace'][$i] = "";
	return $search;
}
$template = preg_replace("/[\n\r\t]*\{block\s+([a-zA-Z0-9_\[\]]+)\}(.+?)\{\/block\}/ies", "\$this->stripblock('\\1', '\\2')", $template);

这段代码是用来处理类似下面的模板代码:


	

{lang qqconnect:connect_header_login}

{lang qqconnect:connect_header_login_tip}

这句代码解析后的代码为:

解析的机制为:

function stripblock($var, $s) {
	$s = str_replace('\\"', '"', $s);
	$s = preg_replace("/<\?=\\\$(.+?)\?>/", "{\$\\1}", $s);
	preg_match_all("/<\?=(.+?)\?>/e", $s, $constary);
	$constadd = '';
	$constary[1] = array_unique($constary[1]);
	foreach($constary[1] as $const) {
		$constadd .= '$__'.$const.' = '.$const.';';
	}
	$s = preg_replace("/<\?=(.+?)\?>/", "{\$__\\1}", $s);
	$s = str_replace('?>', "\n\$$var .= <<";
}