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-Policy header 停用 inline JavaScript 的執行

7. Be Suspicious of HTTP Requests from Other Sites#

  • 確保 GET 請求是 side-effect free(無副作用)
  • 在 HTML 表單和 JavaScript 發起的 HTTP 請求中加入 anti-forgery cookies
  • Set-Cookie header 加入 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-Cookie header 加入 HttpOnly 防止 JavaScript 讀取 cookie
  • 加入 Secure 確保 cookie 只透過 HTTPS 傳送
  • 回傳任何敏感資源前,檢查使用者是否具有存取權限
  • 即使資源未列在搜尋頁面或未被外部連結

12. Avoid Using Direct File References#

  • 避免在 HTTP 請求中傳遞和評估檔案路徑
  • 使用網頁伺服器內建的 URL 解析,或以不透明識別碼引用檔案

13. Don’t Leak Information#

  • 關閉 HTTP 回應中的 Server header
  • 確保 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 安全不是一次性的工作,而是需要持續關注的實踐。將這些準則融入你的開發流程中,可以大幅降低被攻擊的風險。