首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

ThinkPHP 自動轉義導致富文本編輯器內容顯示異常的解決方案

     編輯:PHP 綜合知識

問題現象

使用 KindEditor / UEditor / CKEditor 等富文本編輯器儲存文章,資料庫存入時正常,但讀出顯示時,HTML 標籤變成實體字元 (如 <p> 顯示為 &lt;p&gt;),頁面出現原始碼而非渲染結果。

根因分析

ThinkPHP Conf/Convention.php 預設開啟:

'DEFAULT_FILTER' => 'htmlspecialchars', // 所有 I() 輸入自動經過 htmlspecialchars

導致富文本內容在寫入資料庫前被轉義,讀出時又被瀏覽器當作純文字顯示。

解決方案

方法一:關閉全域預設過濾 (推薦)

修改 Conf/Convention.php 或專案 Conf/config.php:

'DEFAULT_FILTER' => '', // 關閉自動過濾

需要時手動呼叫:I('post.content', '', 'htmlspecialchars')。

方法二:僅對特定欄位跳過過濾

在模型 _filter 屬性排除:

class ArticleModel extends Model {
    protected $_filter = ['content' => '']; // content 欄位不自動過濾
}

方法三:儲存前手動處理 (不推薦,易漏)

$data = I('post.');
$data['content'] = htmlspecialchars_decode($data['content']); // 還原
$model->add($data);

安全性補充

  • 關閉全域過濾後,**務必在輸出到 HTML 時**使用 {$vo.content|htmlspecialchars} 或模板引擎預設輸出轉義。
  • 富文本內容建議配合 HTMLPurifier 做白名單過濾,防止 XSS。
  • 資料庫層面使用參數綁定 (ThinkPHP 內建已處理),防 SQL 注入。

驗證

修改設定後重新測試:編輯器輸入帶圖片、樣式的內容 → 送出 → 列表頁正常渲染 HTML,不再出現實體字元。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved