開場白
今天 D24 聚焦 Web 應用三大常見弱點:XSS(跨站腳本)、SQL Injection(資料庫注入)、以及 Broken Access Control(存取控制缺陷)。
本篇以「設計思維(資料流:輸入→處理→輸出)」為主軸,強調如何在設計階段減少風險,而非展示漏洞利用步驟(本日為非實作日)。
一、XSS(Cross-Site Scripting)
原理簡述:攻擊者將惡意腳本注入網頁,當其他使用者載入時執行,可能竊取 Cookie/Session 或竄改頁面行為。
類型與要點:
-
Reflected XSS:透過 URL 或表單即時回顯 → 重點:避免未處理的回顯輸出。
-
Stored XSS:惡意內容儲存在伺服器(留言、留言板)→ 重點:後端儲存前檢查與輸出時轉義。
-
DOM-based XSS:前端直接操作 DOM(例如 innerHTML)導致執行→ 重點:前端勿用未處理的 raw HTML 注入。
防禦原則(摘要):
- 輸出時一律 Escape / Encode Output(依上下文:HTML、JS、URL)。
- 輸入時做型別/長度檢查與必要的 Sanitization(但不要只依賴輸入清理)。
- 部署 Content Security Policy (CSP) 作為降低風險的補強。
二、SQL Injection(資料庫注入)
原理簡述:攻擊者注入惡意 SQL 片段,使資料庫執行非預期指令(資料洩漏、繞過認證、資料破壞)。
典型防禦:
-
Prepared Statements / Parameterized Queries(最核心)。
- 絕不以字串拼接使用者輸入建構 SQL。
- 限縮資料庫帳號權限(最小權限原則)。
- 建立 SQL 錯誤日誌的敏感資訊遮蔽,避免回傳完整錯誤給前端。
三、Broken Access Control(存取控制缺陷)
原理簡述:未在後端嚴格驗證資源存取授權,導致未授權讀寫或權限提升。
常見形式:
-
IDOR(Insecure Direct Object Reference):直接傳遞資源 ID(如 /file?id=123),未校驗是否為該使用者可存取。
-
水平 / 垂直權限升級:同級別或跨等級存取未受控。
-
缺乏功能層級授權檢查:僅檢查「是否登入」而非「是否有此功能權限」。
防禦原則:
- 後端「每一個資源存取」都要驗證 AuthN 與 AuthZ(不可只信前端)。
- 使用不可預測的資源識別(避免直接暴露內部 ID)並採行功能層級授權(role/ACL)。
- 在設計時將授權檢查作為流程節點(不可被跳過)。
四、資料流(Input → Process → Output)檢查
-
輸入(Input):型別、長度、格式驗證(白名單優先)。
-
處理(Process):避免以使用者輸入拼接命令或查詢;最小化信任面。
-
輸出(Output):依上下文做適當轉義;不要回傳敏感內部錯誤或結構資訊。
高維提醒:授權錯誤常藏在「業務規則」與「功能邏輯」中,測試時別只測輸入驗證,務必檢查完整業務流程的授權邊界。
小結
XSS、SQLi、Broken Access Control 的根源多半不是語言或框架,而是設計與授權思維。
以「資料流」檢視每個功能(輸入→處理→輸出),在後端強制驗證授權,並定期以功能檢查表追蹤修正進度,能大幅降低被攻擊的機率與影響範圍。