實踐中發現:用戶輸入 ___ 或 .__ 等關鍵字進行 LIKE 查詢時,會匹配返回全表數據。根因在於 MySQL LIKE 語法中 _ 代表「任意單字符」,% 代表「任意長度字符」,未經轉義直接拼接 SQL 將導致語義異常。
-- 用戶輸入 "___"
SELECT * FROM articles WHERE title LIKE '___'; -- 等價於任意三字符標題,極大概率全表命中
-- 用戶輸入 ".__"
SELECT * FROM articles WHERE title LIKE '.__'; -- 任意單字符開頭 + 任意字符結尾
| 通配符 | 含義 |
|---|---|
% | 匹配任意長度字符(含零字符) |
_ | 匹配任意單個字符 |
在拼接 SQL 前,將用戶輸入中的 _、%、\ 進行轉義:
// PHP 示例
$safe = str_replace(['\\', '_', '%'], ['\\\\', '\\_', '\\%'], $user_input);
$sql = "SELECT * FROM articles WHERE title LIKE '$safe'";
或使用預處理語句(參數化查詢),由驅動層自動處理轉義,徹底消除注入與語義異常。
經驗證,IPB、PHPBB 等主流論壇早期版本均存在此缺陷,vBulletin 已內建過濾。所有構建動態 LIKE 查詢的應用均需排查修復。
mysqli_prepare/PDO::prepare)。看似微小的語法細節,實則是資安防線的一環。開發規範與自動化掃描相結合,方能避免此類低級邏輯漏洞。