Summing Up#
本書的最後一章提供了 21 條 Web 安全準則,濃縮了每個章節的核心教訓。遵循這些步驟,被駭客攻擊的機率將趨近於零。
1. Automate Your Release Process#
- 能用單一指令建構程式碼
- 將程式碼保存在版本控制系統中,決定分支策略
- 將設定與程式碼分離,方便建置測試環境
- 自動化每個環境的部署流程
- 發布流程必須是 reliable(可靠)、reproducible(可重現)、revertible(可回滾)的
2. Do (Thorough) Code Reviews#
- 每個程式碼變更在發布前至少由一位非原作者的團隊成員審查
- 確保團隊成員有足夠時間批判性地評估程式碼
- 審查程式碼與撰寫程式碼同等重要
3. Test Your Code (to the Point of Boredom)#
- 撰寫 unit tests 對程式碼的關鍵部分進行斷言
- 在 CI 伺服器上自動執行測試
- 追蹤並持續提高 code coverage
- 在修復 bug 之前先寫測試來重現它
4. Anticipate Malicious Input#
- HTTP 請求的所有部分都可能被駭客操控
- 使用 parameterized statements(參數化語句)建構資料庫查詢和作業系統指令
- 防範 injection attacks
5. Neutralize File Uploads#
- 確保使用者上傳的檔案不能被執行
- 理想做法是上傳到 CDN
- 需要細粒度權限時,使用 CMS 管理
- 最後手段:儲存在獨立磁碟分割區,確保檔案不具有可執行權限
6. Escape Content While Writing HTML#
- 確保所有動態內容在寫入網頁時都經過 escape 處理
- 將 HTML 控制字元替換為安全的 entity encoding
- 客戶端和伺服器端都需要做
- 使用
Content-Security-Policyheader 停用 inline JavaScript 的執行
7. Be Suspicious of HTTP Requests from Other Sites#
- 確保
GET請求是 side-effect free(無副作用) - 在 HTML 表單和 JavaScript 發起的 HTTP 請求中加入 anti-forgery cookies
- 為
Set-Cookieheader 加入SameSite屬性,防止 cookie 被跨網域請求攜帶
8. Hash and Salt Your Passwords#
- 使用強單向 hash 函數(如 bcrypt)加密密碼
- 為每個 hash 添加 salt 增加隨機性
9. Don’t Admit Who Your Users Are#
- 登入表單和密碼重設頁面的錯誤訊息應保持通用
- 不要透露使用者名稱是否存在
10. Protect Your Cookies#
- 為
Set-Cookieheader 加入HttpOnly防止 JavaScript 讀取 cookie - 加入
Secure確保 cookie 只透過 HTTPS 傳送
11. Protect Sensitive Resources (Even If You Don’t Link to Them)#
- 回傳任何敏感資源前,檢查使用者是否具有存取權限
- 即使資源未列在搜尋頁面或未被外部連結
12. Avoid Using Direct File References#
- 避免在 HTTP 請求中傳遞和評估檔案路徑
- 使用網頁伺服器內建的 URL 解析,或以不透明識別碼引用檔案
13. Don’t Leak Information#
- 關閉 HTTP 回應中的
Serverheader - 確保 session parameter 名稱是通用的
- 避免在 URL 中出現洩露技術堆疊的副檔名
- 在正式環境關閉詳細的客戶端錯誤報告
- 在建構過程中 obfuscate(混淆)JavaScript 函式庫
14. Use Encryption (Correctly)#
- 購買並安裝安全憑證
- 將所有流量導向 HTTPS
- 為
Set-Cookie加入Secure關鍵字 - 定期更新網頁伺服器以跟上加密標準
15. Secure Your Dependencies (and Services)#
- 使用 package manager 匯入第三方程式碼,固定版本號
- 持續關注安全公告並定期更新套件
- 敏感設定存放在原始碼控制之外
- 廣告使用 SafeFrame 標準
16. Defuse Your XML Parser#
- 關閉 XML parser 中 inline DTD 的處理
17. Send Email Securely#
- 使用 SPF 記錄設定允許從你的網域發送郵件的伺服器白名單
- 使用 DKIM 讓收件方驗證郵件的
From位址並偵測竄改
18. Check Your Redirects (If You Have Any)#
- 重導向到儲存在 HTTP 請求中的 URL 時,檢查該 URL 是否指向你的網域而非外部網站
- 防止 open redirects 被用於偽裝惡意連結
19. Don’t Allow Your Site to Be Framed#
- 除非有特定需求,否則不允許網站被嵌入
<iframe> - 加入
Content-Security-Policy: frame-ancestors 'none'header
20. Lock Down Your Permissions#
- 遵循 principle of least privilege(最小權限原則)
- 每個程序和軟體元件只應擁有完成任務所需的最低權限
- 確保網頁伺服器不以 root 帳號執行
- 限制網頁伺服器可存取的磁碟目錄
- 防止不必要的對外網路呼叫
- 資料庫連線使用權限受限的帳號
21. Detect and Be Ready for Surges in Traffic#
- 使用即時監控偵測高流量
- 透過 CDN、客戶端快取、caching、非同步處理等方式建構可擴展的架構
- 能夠輕鬆增加伺服器數量
- 必要時部署防火牆、intrusion prevention system,或簽約 DDoS 防護服務
這 21 條準則涵蓋了本書所有章節的精華。Web 安全不是一次性的工作,而是需要持續關注的實踐。將這些準則融入你的開發流程中,可以大幅降低被攻擊的風險。