承接上篇,本文提供八大層層疊加的防禦策略,從輸入過濾、參數化、權限最小化到加密儲存,構建纵深防禦體系。
八大防禦策略
1. 動態 SQL 輸入淨化(最基礎、最脆弱)
- 單引號雙化:
' → '',破壞注入語法結構。
- 移除註釋符號:
--、/* */、#,防止截斷後續 SQL。
- 限制資料庫帳號權限: 查詢、新增、修改、刪除使用不同帳號,
SELECT 帳號無 INSERT/UPDATE/DELETE 權限。
2. 全面採用預存程序與參數化查詢(核心防線)
- 參數傳遞機制將資料與程式碼徹底分離,單引號、註釋符號視為字面值而非 SQL 語法。
- 資料庫權限僅授與
EXECUTE 特定預存程序,不授與直接存取資料表權限。
- 所有使用者輸入受限於預存程序定義的參數型別、長度、範圍。
3. 限制表單/查詢字串輸入長度
- 帳號最長 10 字元 → 前端
maxlength="10"、後端 If Len(input) > 10 Then Reject。
- 大幅增加攻擊者構造惡意 Payload 的難度(空間不足)。
4. 輸入合法性驗證(白名單機制)
- 客戶端驗證: 使用
RegularExpressionValidator 等內建驗證控制項,自動產生 JavaScript 提升使用者體驗。
- 伺服器端驗證(必要): 客戶端可繞過,伺服器端必須重新驗證。可複用驗證控制項的
ServerValidate 事件或自訂 CustomValidator。
- 白名單範例:帳號僅允許英數字、底線;Email 符合 RFC 格式;身分證符合格式與校驗碼。
5. 敏感資料加密儲存(資料層防護)
- 密碼以
FormsAuthentication.HashPasswordForStoringInConfigFile(password, "SHA1") 雜湊儲存(建議改用 PBKDF2/BCrypt/Argon2)。
- 驗證時對使用者輸入同樣雜湊後比對,輸入資料不再具備 SQL 語法意義,等同「消毒」處理。
6. 查詢結果筆數檢核
- 預期回傳單筆(如登入驗證),若
DataReader.Read() 讀到多筆 → 視為異常拒絕。
- 防止
OR '1'='1 導致多筆匹配繞過驗證。
7. 錯誤訊息最小化
- 生產環境關閉詳細錯誤頁面(
customErrors mode="RemoteOnly"),避免洩露資料庫結構、SQL 片段、堆疊追蹤資訊。
8. 定期安全性測試與程式碼審查
- 自動化掃描工具(OWASP ZAP、SQLMap)定期掃描。
- 程式碼審查檢查清單:所有資料存取是否參數化、權限是否最小化、錯誤處理是否洩露資訊。
總結:防禦優先順序
- 參數化查詢 / 預存程序(根治)
- 最小權限資料庫帳號(限制損害範圍)
- 伺服器端白名單驗證(攔截惡意輸入)
- 輸入長度限制(增加攻擊成本)
- 敏感資料加密儲存(資料層最後防線)
- 錯誤訊息最小化(減少情報洩露)
- 動態 SQL 淨化(僅作為舊代碼緩解措施)
- 定期滲透測試(持續驗證)