在連續實作了 Command Injection、SQL Injection、XSS(Reflected & Stored)以及 CSRF 後,我們已經掌握了 Web 開發中最常見的幾大核心漏洞。今天不進行任何程式實作,我們從「攻擊者的思維」切回「防禦者的視角」,將這五天學到的漏洞進行橫向對比,並建立一套完整的 Web 安全防禦框架。
1.Command Injection:
核心成因:後端直接將使用者輸入拼接到作業系統指令中執行。
攻擊影響:攻擊者可執行任意系統指令,直接取得伺服器控制權。
關鍵防禦:盡量避免呼叫OS指令,若必須使用則實施嚴格的白名單過濾或參數轉義。
2.SQL Injection
核心成因:後端直接將使用者輸入拼接到SQL查詢字串中,改變了原本的SQL語法結構。
攻擊影響:繞過身分驗證、盜取、篡改甚至刪除資料庫內的所有資料。
關鍵防禦:強制使用預編譯查詢,將指令與資料徹底分離。
核心成因:後端接收請求參數後,未經過濾與轉義就直接「反射」渲染回網頁上。
攻擊影響:一次性攻擊,攻擊者可誘騙受害者點擊連結,藉此竊取Cookie或跳轉至惡意網站。
關鍵防禦:進行上下文相關的 HTML 實體轉義與設定CSP策略。
核心成因:惡意腳本被寫入資料庫(如留言板),每次頁面載入時都會從資料庫讀取並渲染。
攻擊影響:持久性危害,所有造訪該頁面的正常使用者都會自動「中招」,常用於大規模帳號劫持。
關鍵防禦:資料輸出時進行HTML轉義、限制輸入長度與格式,並啟用HttpOnly Cookie。
核心成因:伺服器過度信任瀏覽器自動帶上的Cookie/Session,未驗證請求是否真的來自使用者本人在該頁面的主動操作。
攻擊影響:冒充已登入的使用者發送敏感請求(如悄悄修改密碼或進行資金轉帳)。
關鍵防禦:導入Anti-CSRF Token、設定Cookie的SameSite屬性,並在敏感操作加上二次驗證。
要有效防止上述漏洞,開發團隊不能只靠單點防禦,而是要建立多層次的防禦機制
原則:永遠不要信任使用者的任何輸入。
作法:採用白名單驗證優於黑名單。例如限制欄位只能輸入數字、IP格式或特定長度,從源頭阻絕異常字元。
語法隔離:在資料庫操作時,強制使用預編譯查詢,將「指令」與「資料」徹底分離,這是根治SQL Injection 的唯一解法。
上下文轉義:在將資料印到HTML頁面時,將所有特殊符號轉義為HTML實體,防止瀏覽器誤認為腳本。
即便程式碼不小心留下漏洞,適當的安全機制依然能阻斷攻擊:
HttpOnly Cookie:防止 XSS 腳本讀取敏感Session ID。
SameSite=Strict/Lax Cookie:阻斷跨站請求時自動帶上Cookie,大幅降低CSRF危害。
Anti-CSRF Token:確保每個敏感請求都經過使用者主動認證。
Content Security Policy (CSP):限制網頁只能執行白名單來源的JavaScript,封鎖未授權的內聯腳本。