DedeCMS 5.7 SP1 為防 SQL 注入,在 include/dedesql.class.php 引入 safeCheck 機制。當提交內容包含 union|sleep|benchmark|load_file|outfile 等關鍵字時觸發攔截,顯示「Safe Alert: Request Error step 1/2」或「step 2」。本文提供兩種解決方案及風險提示。
編輯 include/dedesql.class.php,找到建構函數(約第 50 行):
// 原代碼 $this->safeCheck = true; // 修改為 $this->safeCheck = FALSE;
效果:所有 SQL 執行跳過關鍵字檢查,錯誤即時消失。
風險:失去注入防護,若前端未做嚴格過濾,極易被攻擊。
適用場景:因緩存衝突導致誤判的 step 1/2;對 step 2(直接 SQL 檢查觸發)通常無效。
在執行已知安全的 SQL 前臨時關閉,執行完恢復:
$dsql->safeCheck = false; $dsql->ExecuteNoneQuery($sql); $dsql->safeCheck = true;
或在 dedesql.class.php 的 SetQuery/Execute 方法中,針對特定表/欄位跳過檢查(需二次開發能力)。
dedesql.class.php,與模板引擎無關。htmlspecialchars()、addslashes() 或 Dede 內建 HtmlReplace() 過濾。data/logs/ 下的 SQL 執行日誌,發現異常及時封鎖 IP。在安全與易用之間取得平衡,才是解決 DedeCMS Safe Alert 的正確姿勢。