目錄
一、OWASP十大WEB弱點防護守則
二、防護守則
1、權限控制失效
2、加密失誤
3、注入
4、不安全設計
5、安全配置缺陷
6、易受攻擊和過時的組件
7、身份認證和會話管理失效
8、缺乏完整性校驗
9、缺乏監控與日志記錄
10、服務端請求偽造
三、核心防護原則總結
一、OWASP十大WEB弱點防護守則
OWASP Top 10 是目前全球最權威、最具影響力的Web應用安全風險清單,由開放Web應用安全項目(OWASP)定期更新(2021版)。
排名 | 風險名稱 | 簡述 |
---|---|---|
A01 | Broken Access Control | 權限控制失效,導致用戶可以訪問未授權的數據或功能。 |
A02 | Cryptographic Failures | 加密失誤,如未加密敏感數據或使用不安全的算法(舊稱“敏感數據泄露”)。 |
A03 | Injection | 注入,包括 SQL、NoSQL、命令注入等,攻擊者通過惡意輸入操控后端。 |
A04 | Insecure Design | 不安全設計,應用本身的設計缺陷,未考慮安全機制。 |
A05 | Security Misconfiguration | 安全配置缺陷,配置錯誤或默認設置未更改,導致系統暴露。 |
A06 | Vulnerable and Outdated Components | 易受攻擊和過時的組件,使用了已知漏洞的軟件組件,如庫、框架。 |
A07 | Identification and Authentication Failures | 身份認證和會話管理失效,身份驗證機制不當,如弱密碼、暴力破解。 |
A08 | Software and Data Integrity Failures | 缺乏完整性校驗,例如更新過程未驗證簽名。 |
A09 | Security Logging and Monitoring Failures | 缺乏監控與日志記錄,無法及時響應攻擊。 |
A10 | Server-Side Request Forgery (SSRF) | 服務端請求偽造,服務器被誘導請求外部資源,可能造成內網信息泄露。 |
二、防護守則
1、權限控制失效
-
強制實施最小權限原則:?默認拒絕所有訪問,明確授予每個用戶/角色執行其任務所需的最小權限。
-
集中化訪問控制檢查:?在服務器端使用統一的、經過嚴格測試的授權機制(如RBAC, ABAC),避免在客戶端進行關鍵權限判斷。
-
禁用目錄列表:?確保Web服務器不會列出目錄內容。
-
記錄和監控訪問失敗:?記錄失敗的授權嘗試并設置告警(尤其是管理員操作)。
-
API速率限制:?防止暴力破解和數據枚舉。
-
強制所有權檢查:?對訪問對象(如文件、數據庫記錄)的操作前,必須驗證當前用戶是否擁有該對象(
/users/{id}
?中驗證?{id}
?屬于當前用戶)。 -
唯一、不可預測的訪問令牌:?使用JWT時設置短有效期,注銷時使其失效。
2、加密失誤
-
敏感數據加密:?對傳輸中的敏感數據(密碼、個人信息、支付信息、健康數據等)強制使用強TLS(最新版如TLS 1.3),對存儲的敏感數據使用強加密算法(如AES-256)和安全的密鑰管理(HSM/KMS)。
-
禁用舊協議/弱算法:?禁用SSL、早期TLS版本、弱密碼套件(如RC4, DES, MD5, SHA1)。
-
使用強哈希存儲密碼:?使用自適應哈希算法(如Argon2id, scrypt, bcrypt, PBKDF2)并加鹽。
-
禁止緩存敏感數據:?在HTTP響應頭設置?
Cache-Control: no-store
。 -
最小化數據收集和存儲:?只收集和存儲業務絕對必需的敏感數據,及時刪除不再需要的數據。
-
避免在代碼/配置中硬編碼密鑰:?使用安全的密鑰管理系統。
3、注入
-
使用安全的API:?優先使用提供自動參數化或安全對象關系映射(ORM)的API。絕對禁止拼接查詢/命令。
-
參數化化查詢:?對SQL、NoSQL、OS命令、LDAP查詢等所有解釋型語句,使用參數化查詢(預編譯語句)或存儲過程。
-
輸入驗證與輸出編碼:?對不受信任的輸入進行嚴格的、基于白名單的驗證(類型、長度、格式、范圍)。在將數據輸出到不同上下文(HTML, JavaScript, CSS, URL, SQL)時,使用上下文相關的輸出編碼。
-
使用ORM框架的安全方法:?避免使用可能引入注入的拼接方法。
-
LIMIT 防止大規模數據泄露:?在SQL查詢中使用LIMIT等子句限制返回行數。
4、不安全設計
-
威脅建模:?在設計和開發生命周期早期(SDLC)進行威脅建模,識別潛在威脅并設計安全控制措施。
-
安全設計模式:?采用成熟的安全設計模式和原則(如深度防御、最小權限、失效安全)。
-
安全需求定義:?明確定義安全需求(如認證、授權、審計、加密、輸入驗證)。
-
參考架構和安全控制庫:?使用經過驗證的安全參考架構和可重用的安全組件。
-
安全編碼標準與培訓:?制定并強制執行安全編碼標準,對開發人員進行安全培訓。
-
濫用案例建模:?考慮攻擊者可能如何濫用應用功能,并設計相應的防護。
5、安全配置缺陷
-
最小化安裝:?移除不必要的功能、組件、文檔、示例和未使用的賬戶。
-
加固配置:?為操作系統、框架、庫、應用程序設置安全、強化的配置(關閉調試模式、禁用管理接口、設置安全HTTP頭如CSP, HSTS, X-Content-Type-Options等)。
-
自動化配置管理:?使用自動化工具(IaC如Terraform, Ansible)確保開發、測試、生產環境配置一致且安全。避免使用默認憑據。
-
及時更新和打補丁:?建立流程,及時更新和修補操作系統、框架、依賴庫和應用程序。
-
分離組件:?將不同安全級別的組件部署在隔離的網絡分段或容器中。
-
安全掃描:?定期進行配置審計和安全掃描。
6、易受攻擊和過時的組件
-
組件清單管理:?維護所有客戶端和服務器端組件(框架、庫、模塊)及其版本的準確清單(使用SCA工具)。
-
持續監控漏洞:?訂閱安全通告(CVE),使用軟件成分分析(SCA)工具持續監控組件漏洞。
-
及時更新/打補丁:?僅從官方渠道獲取組件,在評估風險后及時應用安全補丁或升級到安全版本。優先考慮有活躍維護的組件。
-
移除無用/過時組件:?清理不再使用的依賴項。
-
安全許可:?在引入新組件前進行安全評估和許可。
7、身份認證和會話管理失效
-
實施強認證:?支持多因素認證(MFA),尤其是關鍵操作和高權限賬戶。防止弱密碼(使用密碼策略、密碼強度檢查器、阻止常見密碼)。
-
安全的會話管理:?使用服務器端生成的、長且隨機的會話ID,通過安全Cookie傳輸(
Secure
,?HttpOnly
,?SameSite
?屬性),設置合理的會話超時(空閑和絕對超時)。 -
安全的密碼管理:?使用強哈希存儲密碼(見A02),安全地處理密碼重置/忘記流程(避免知識問答、發送明文密碼),提供安全的密碼更改功能。
-
防止憑證填充/暴力破解:?實施賬戶鎖定或遞增延遲機制,記錄失敗嘗試并監控。對登錄嘗試進行速率限制。
-
統一錯誤消息:?登錄、注冊、密碼找回等環節使用統一的模糊錯誤消息(如“用戶名或密碼錯誤”),避免枚舉攻擊。
8、缺乏完整性校驗
-
代碼/配置完整性驗證:?使用數字簽名驗證軟件來源和完整性(如代碼簽名、容器鏡像簽名)。確保CI/CD管道安全,防止未授權修改。
-
依賴來源可信:?只從官方、受信任的源獲取依賴項和插件。驗證其簽名或哈希值。
-
反序列化安全:?避免使用包含遠程代碼執行功能的危險反序列化器。如必須使用,實施嚴格的輸入驗證、類型限制(白名單)和沙箱隔離。
-
CI/CD安全:?保護構建管道,確保代碼倉庫、構建服務器的訪問控制和安全配置。
-
關鍵數據完整性保護:?對關鍵配置或數據使用數字簽名或MAC(消息認證碼)驗證其未被篡改。
9、缺乏監控與日志記錄
-
記錄關鍵安全事件:?確保記錄登錄(成功/失敗)、訪問控制失敗、輸入驗證失敗、系統錯誤、關鍵操作(如密碼修改、權限變更)、API調用等。
-
日志包含足夠上下文:?日志條目應包含時間戳、源IP、用戶標識、事件描述、操作結果等,便于調查。
-
集中化日志管理:?將日志發送到受保護的、集中的日志管理系統(如SIEM),防止本地篡改或丟失。
-
實時監控與告警:?建立實時監控機制,對可疑活動(如大量登錄失敗、異常數據訪問模式)設置告警閾值,確保告警能被及時響應。
-
定期審計與測試:?定期審計日志配置和內容,進行滲透測試驗證監控的有效性。
-
保護日志數據:?確保日志存儲的安全性和完整性,控制對日志的訪問權限。
10、服務端請求偽造
-
輸入驗證與過濾:?對用戶提供的URL或主機名/IP進行嚴格的基于白名單的驗證和過濾。避免直接使用用戶輸入構造請求。
-
網絡層控制:?實施網絡分段,將后端應用部署在隔離網絡(DMZ),限制其只能訪問必要的內部資源。使用防火墻策略限制應用服務器出站連接的目標地址和端口。
-
應用層控制:?使用應用層代理或具有嚴格目標限制的API網關來轉發請求。
-
禁用非必要URL Schema:?僅允許?
http
/https
,禁用?file
,?ftp
,?gopher
,?dict
?等危險schema。 -
驗證響應:?不要將原始響應直接返回給客戶端,檢查響應內容是否合法。
-
使用受信解析庫:?避免直接使用底層網絡庫處理用戶輸入。
三、核心防護原則總結
-
縱深防御:?在多個層面實施安全控制。
-
最小權限:?只授予完成任務所必需的最小權限。
-
默認安全:?默認配置應是最安全的。
-
永不信任用戶輸入:?對所有輸入進行嚴格驗證、過濾和輸出編碼。
-
保持簡單:?減少攻擊面(移除不必要的功能、組件)。
-
持續更新:?及時打補丁和升級。
-
安全開發生命周期:?將安全融入設計、開發、測試、部署、運維全過程(DevSecOps)。
-
監控與響應:?具備檢測、響應和恢復能力。