游客可见游客发布的待审核帖子的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会员充话费服务——不能用!
GRD4杂片
解析QQ互联的模板文件module.htm代码
一直没搞明白QQ互联的module.htm的代码是如何解析的,模板里并不是真正的html代码。
这里截取一部分模板代码,如下:
{eval function tpl_global_login_extra() { global $_G; } {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);
这段代码是用来处理类似下面的模板代码:
解析的机制为:
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 .= <<"; }