02-安全最佳实践
本章讲解 Python 开发中的安全最佳实践。
常见安全漏洞
SQL 注入
python
# ❌ 危险:字符串拼接 SQL
query = f"SELECT * FROM users WHERE username = '{username}'"
# ✅ 安全:使用参数化查询
query = "SELECT * FROM users WHERE username = %s"
cursor.execute(query, (username,))XSS 攻击
python
from markupsafe import escape
# ✅ 安全:转义 HTML
def render_comment(comment: str):
return f"<div>{escape(comment)}</div>"CSRF 攻击
python
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)密码安全
密码哈希
python
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"])
# 哈希密码
hashed = pwd_context.hash("password")
# 验证密码
is_valid = pwd_context.verify("password", hashed)生成安全随机数
python
import secrets
# 生成安全 token
token = secrets.token_hex(32)
# 生成验证码
code = str(secrets.randbelow(1000000)).zfill(6)敏感信息管理
环境变量
python
# ❌ 危险:硬编码密钥
API_KEY = "sk-1234567890"
# ✅ 安全:使用环境变量
import os
API_KEY = os.getenv("API_KEY").env 文件
bash
# .env(不要提交到 Git)
API_KEY=sk-xxx
DATABASE_URL=postgresql://user:password@localhost/db
SECRET_KEY=your-secret-key.gitignore 配置
gitignore
.env
.env.local
*.pem
*.key
credentials.json依赖安全
检查漏洞依赖
bash
# 使用 pip-audit
uv add --dev pip-audit
uv run pip-audit
# 使用 safety
uv add --dev safety
uv run safety checkWeb 安全
速率限制
python
from flask_limiter import Limiter
limiter = Limiter(app, default_limits=["200 per day"])
@app.route("/login")
@limiter.limit("5 per minute")
def login():
pass安全响应头
python
@app.after_request
def add_security_headers(response):
response.headers['X-Frame-Options'] = 'DENY'
response.headers['X-Content-Type-Options'] = 'nosniff'
response.headers['Strict-Transport-Security'] = 'max-age=31536000'
return response输入验证
python
from pydantic import BaseModel, EmailStr, Field
class UserCreate(BaseModel):
username: str = Field(..., min_length=3, max_length=32)
email: EmailStr
password: str = Field(..., min_length=8)安全清单
✅ 必须遵守
- 永远不要信任用户输入
- 密码必须哈希存储
- 密钥不得硬编码
- 生产环境必须使用 HTTPS
- 定期检查依赖漏洞
✅ 推荐做法
- 使用成熟的安全库
- 实现速率限制
- 添加安全响应头
- 使用 Pydantic 验证输入
- 定期进行安全审计
本章小结
┌─────────────────────────────────────────────────────────────┐
│ 安全最佳实践 知识要点 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 常见漏洞: │
│ ✓ SQL 注入 → 参数化查询 │
│ ✓ XSS → 转义 HTML │
│ ✓ CSRF → Token 验证 │
│ │
│ 密码安全: │
│ ✓ 使用 bcrypt 哈希 │
│ ✓ 使用 secrets 生成随机数 │
│ │
│ 敏感信息: │
│ ✓ 使用环境变量 │
│ ✓ .env 文件加入 .gitignore │
│ │
└─────────────────────────────────────────────────────────────┘