Skip to content

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 check

Web 安全

速率限制

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)

安全清单

✅ 必须遵守

  1. 永远不要信任用户输入
  2. 密码必须哈希存储
  3. 密钥不得硬编码
  4. 生产环境必须使用 HTTPS
  5. 定期检查依赖漏洞

✅ 推荐做法

  1. 使用成熟的安全库
  2. 实现速率限制
  3. 添加安全响应头
  4. 使用 Pydantic 验证输入
  5. 定期进行安全审计

本章小结

┌─────────────────────────────────────────────────────────────┐
│                    安全最佳实践 知识要点                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   常见漏洞:                                                 │
│   ✓ SQL 注入 → 参数化查询                                   │
│   ✓ XSS → 转义 HTML                                        │
│   ✓ CSRF → Token 验证                                      │
│                                                             │
│   密码安全:                                                 │
│   ✓ 使用 bcrypt 哈希                                        │
│   ✓ 使用 secrets 生成随机数                                 │
│                                                             │
│   敏感信息:                                                 │
│   ✓ 使用环境变量                                            │
│   ✓ .env 文件加入 .gitignore                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘