一、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