多層次防禦策略
1. 關鍵字過濾函數
function inject_check($sql_str) {
return preg_match('/select|insert|update|delete|and|\\*|\\/\\*|\\*|\\.\\.\\/|\\.\\/|union|into|load_file|outfile/i', $sql_str);
}
2. 系統內建函數轉義
addslashes($input); // 在 ', ", \, NULL 前加反斜線
3. php.ini 關鍵安全設定
register_globals = Off ; 關閉全域變數註冊
magic_quotes_gpc = On ; 開啟 GPC 自動轉義(舊版相容)
display_errors = Off ; 生產環境關閉錯誤顯示
4. SQL 撰寫規範
-- 不規範
SELECT * FROM table WHERE id=2
-- 規範(加反引號與引號)
SELECT * FROM `table` WHERE `id`='2'
5. 參數接收與封裝
- 明確使用
$_POST、$_GET、$_SESSION,勿依賴 register_globals
- 資料表/欄位命名增加複雜度,避免通用名稱
- 將常用查詢封裝為函數/類別,避免 SQL 直接暴露在業務邏輯中