一、OWASP Top 10
1.注入漏洞
(1)SQL 注入
- 原理:通過用戶輸入注入惡意SQL代碼
- 示例:
sql
-- 惡意輸入 ' OR '1'='1 -- 可能被注入的SQL SELECT * FROM users WHERE username = '' OR '1'='1' AND password = ''
(2)防護措施:
- 使用參數化查詢
- 使用ORM框架
- 實施最小權限原則
2.失效的訪問控制
(1)常見問題:
- 不安全的直接對象引用 (IDOR)
- 權限提升
- CORS配置錯誤
(2)示例:
http
GET /api/user/123 HTTP/1.1 Host: example.com Authorization: Bearer <user_token_for_id_456>
(3)防護
- 實現適當的訪問控制檢查
- 使用隨機ID而非自增ID
- 實施最小權限原則
3.加密失效
(1)常見問題
- 使用弱加密算法
- 不安全的密鑰管理
- 使用HTTP明文傳輸敏感數據
(2)防護
python
# 使用安全的加密庫 from cryptography.fernet import Fernet# 生成密鑰 key = Fernet.generate_key() cipher_suite = Fernet(key)# 加密 cipher_text = cipher_suite.encrypt(b"Secret message")
4.不安全的依賴項
(1)風險:
- 使用含有已知漏洞的第三方庫
- 過時的依賴項
(2)檢查工作:
bash
# 使用 pip-audit 檢查Python依賴 pip install pip-audit pip-audit# 使用 OWASP Dependency-Check
5.安全配置錯誤
(1)常見問題:
- 默認憑證未修改
- 不必要的服務開啟
- 錯誤配置的CORS
(2)防護:
- 定期進行安全審計
- 自動化配置檢查
- 最小化安裝原則
6.易受攻擊和過時的組件
(1)管理策略:
- 維護完整的軟件物料清單(SBOM)
- 定期更新依賴
- 訂閱安全公告
7.認證和授權失敗
(1)防護措施:
- 實施多因素認證
- 密碼策略
- 賬戶鎖定機制
(2)示例:
python
# 密碼強度檢查示例 import redef is_strong_password(password):if len(password) < 12:return Falseif not re.search(r"[A-Z]", password):return Falseif not re.search(r"[a-z]", password):return Falseif not re.search(r"[0-9]", password):return Falseif not re.search(r"[!@#$%^&*(),.?\":{}|<>]", password):return Falsereturn True
8.軟件和數據完整性故障
(1)防護:
- 代碼簽名
- 依賴驗證
- 完整性檢查
9.安全日志和監控不足
python
import logging from logging.handlers import RotatingFileHandler# 配置日志 logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',handlers=[RotatingFileHandler('app.log', maxBytes=1024*1024, backupCount=5),logging.StreamHandler()] )logger = logging.getLogger(__name__)# 記錄安全事件 def log_security_event(user_id, event_type, details):logger.warning("Security Event - User: %s, Type: %s, Details: %s",user_id, event_type, details)
10.服務器端請求偽造(SSRF)
(1)防護措施:
- 實施白名單
- 驗證和清理用戶輸入
- 使用網絡分段
(2)
python
import requests from urllib.parse import urlparsedef safe_fetch_url(url):# 驗證URLparsed = urlparse(url)allowed_domains = ['api.trusted.com', 'cdn.trusted.com']if parsed.netloc not in allowed_domains:raise ValueError("訪問被拒絕: 未授權的域名")response = requests.get(url, timeout=5)return response.content