用戶輸入被拼接進 SQL 語句,未經過濾導致邏輯被篡改,執行非預期操作(查詢繞過、數據刪除、權限提升等)。
MySQL
mysql_query()不支持多語句執行(單語句 API),但mysqli_multi_query()、PDO、其他數據庫(PostgreSQL、SQLite)均支持疊加執行,風險極大。核心防護:參數化查詢(預處理)
bind_param("s", $name); // 3. 執行 $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { ... } $stmt->close(); $mysqli->close(); ?>舊代碼修復:轉義函數(不推薦新代碼使用)
缺點:需手動調用、易漏、字符集相關、不如預處理徹底。PHP 5.4+ 移除
get_magic_quotes_gpc()。LIKE 查詢特殊處理
bind_param("s", $safe . '%'); // 前綴匹配 $stmt->execute();多層防護體系
- 參數化查詢(核心,強制)
- 輸入驗證:白名單正則、長度、類型、格式
- 最小權限原則:應用賬號僅擁有必要表的 SELECT/INSERT/UPDATE/DELETE,無 DROP/ALTER
- WAF/防火牆:網絡層攔截明顯攻擊特徵
- 審計日誌:記錄所有失敗查詢、異常錯誤