“用 PDO 來防止 SQL 注入。”大概學過 PHP 的都聽說過這句話。程式碼中出現了 PDO 就行了嗎?答案肯定是否定的。接下來給大家介紹幾種使用了 PDO 還是不能防止 SQL Injection的情況。
原文出處:https://mp.weixin.qq.com/s/LPmE52XU0A01p4ZYv4wwzA
波波觀點:用了 PDO 不等於自動安全
PDO 是防禦 SQL Injection 的重要工具,但前提是正確使用 prepared statement。若程式仍把使用者輸入拼進 SQL 字串,或在欄位名、排序、表名等位置直接使用外部輸入,仍然可能產生注入風險。
常見錯誤
- 只在部分參數使用 bind,其他片段仍用字串拼接。
- 把 ORDER BY、LIMIT、欄位名、表名當成普通值處理。
- 錯誤使用 emulated prepares,導致行為與預期不一致。
- 把輸入過濾當成唯一防線,忽略資料庫 API 的正確用法。
審計建議
檢查 PDO 程式時,重點是看 SQL 字串最後如何生成。若查詢結構需要由使用者選擇,應使用白名單映射,例如前端傳 sort=date,後端只允許對應到固定欄位,而不是直接拼接。
若專案使用多個資料存取層,也要確認所有路徑都遵守同一套安全規則。常見問題是新功能使用 ORM,舊功能仍保留原始 SQL,導致防護品質不一致。













