phpcms內容頁評論有個bug,當發布評論之后,跳轉到“完整評論列表”的頁面,而不是回到當前評論框的頁面,后來phpcms的一次升級修復了這個bug.
這種小問題卻非常讓人頭疼,讓我們來分析一下這個bug是怎么產生的?
phpcms是通過iframe一個評論頁面到內容頁實現評論功能的,這個評論頁面的表單,提交到{APP_PATH}index.php?m=comment&c=index&a=post&commentid={$commentid}進行處理.
我們可以到comment模塊的index控制器的post方法查看,看到_show_msg()方法,它又調用了showmessage()方法,showmessage()引入了提示模板,代碼如下:
- function showmessage($msg, $url_forward = 'goback', $ms = 600, $dialog = '') {
- if(defined('IN_ADMIN')) {
- include(admin::admin_tpl('showmessage', 'admin'));
- } else {
- include(template('content', 'message'));
- }
- exit;
- }
然后我們打開模板下content下的message模板頁面,頁面的跳轉都是它來實現的,代碼如下:
<a href="{remove_xss($url_forward)}">如果您的瀏覽器沒有自動跳轉,請點擊這里</a>
問題就在這里remove_xss(),我們看看remove_xss()方法,代碼如下:
- $parm1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
- $parm2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
這里只是節選,發現它把帶有iframe的html給過濾掉了,這樣跳轉到之前的頁面/index.php?m=comment&c=index&a=init&commentid=content_13-20-1&iframe=1,這里的iframe就不見了,再看看init方法,代碼如下:
- if (isset($_GET['iframe'])) {
- if (strpos($url,APP_PATH) === 0) {
- $domain = APP_PATH;
- } else { www.111cn.net
- $urls = parse_url($url);
- $domain = $urls['scheme'].'://'.$urls['host'].(isset($urls['port']) && !emptyempty($urls['port']) ? ":".$urls['port'] : '').'/';
- } //開源軟件:Vevb.com
- include template('comment', 'show_list');
- } else {
- include template('comment', 'list');
- }
恍然大悟了,當iframe存在的時候,就調用show_list頁面,否則就是“查看全部評論”的頁面.
修改方法:
把message頁面提示模板的remove_xss方法改成trim_script()方法,代碼如下:
- function trim_script($str) {
- if(is_array($str)){
- foreach ($str as $key => $val){
- $str[$key] = trim_script($val);
- }
- }else{
- $str = preg_replace ( '//<([//]?)script([^/>]*?)/>/si', '<//1script//2>', $str );
- $str = preg_replace ( '//<([//]?)iframe([^/>]*?)/>/si', '<//1iframe//2>', $str );
- $str = preg_replace ( '//<([//]?)frame([^/>]*?)/>/si', '<//1frame//2>', $str );
- $str = str_replace ( 'javascript:', 'javascript:', $str );
- }
- return $str;
- }
用這個方法進行安全過濾.
新聞熱點
疑難解答