1. 程式人生 > >dede文章增加HTML自定義欄位字元被過濾問題

dede文章增加HTML自定義欄位字元被過濾問題

  在dedecms後臺頻道模型增加自定義欄位,一般HTML文字編輯器能解決使用者編輯問題,當然還包括純單行或多行文字編輯。但發現dedecms會自動過濾掉某些敏感的字元,比如style樣式,百度地圖js呼叫問題。下面主要圍繞著兩個問題分享一下新聞發言人開放時候的一些經驗。

      建立自定義欄位可以參考《dedecms如何新增自定義欄位與前臺呼叫內容》

HTML文字樣式編輯亂碼問題

       dedecms預設的文字編輯器雖然不太美觀,但是最簡潔,我更換過百度神器:ueditor,功能強大,滿足了絕大使用者的編輯需要,但是替換的時候還需要二次開發,比如上傳圖集問題,點不了本地上傳的按鈕等,所以還是選擇用預設的文字編輯器。

       自定義的HTML編輯器功能強大,但是還是不如預設模型的文字編輯器,為了資料安全,比如用在評論的地方,會過濾掉某些敏感詞,或者某些非法竊取資料的程式碼。dede使用include\helpers\filter.helper.php進行過濾,被過濾的可以找到如下欄位:

       $ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');

       根據實際需要刪除style即可,就可以解決HTML文字編輯器的樣式亂碼問題。

百度地圖js失效問題

       百度地圖生成器地址(http://api.map.baidu.com/lbsapi/createmap/index.html),設定完了之後點選複製程式碼,多餘的程式碼可以不要,只需要複製  <script type="text/javascript"> 到 </script >之間的程式碼即可,其他程式碼,根據實際情況直接寫在內容頁模板裡面,這裡需要注意的是百度需要提供開發金鑰,站長們去申請就好了,直接寫在內容模板裡。把顯示地圖的區域程式碼放在適合的位置,程式碼如下:

    <!--百度地圖容器,樣式根據實際情況修改,id預設為map-->
 

 <div style="width:700px;height:550px;border:#ccc solid 1px;font-size:12px" id="map"></div>

       接下來就把js部分全部複製貼上到自定義的文字框內,如果怕字元數限制,可以自己調大點。具體可以參考 好品牌

 把工作做完了之後,在前臺能看到一切正常,會發現再次進入編輯的時候,某些字元會被過濾,比如:title,script等,變成sc<x>ript等亂七八糟的字元,讓地圖顯示失效。同樣按照上述,

 

     $ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');

      刪除title、script、javascript。但是農業經網認為第二次進去編輯的時候,前臺地圖仍然失效,通過文字對比工具發現,還有“,”逗號也被過濾了。在朋友的幫助下,還是圍繞include\helpers\filter.helper.php這個檔案下功夫。

       在大概68行

     

  $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);

       改成

       $val = preg_replace('/([\x00-\x08|\x0b-\x0c|\x0e-\x19])/', '', $val);

      問題得到解決。但不知道是否涉及到安全問題,如果不刪除上述這些欄位,還有其他實現方法。其實地圖亂碼應該修改68行的程式碼就足夠了,在include\helpers\filter.helper.php發現以下這個欄位,把它刪除就能解決樣式亂碼問題。