核心价值: 一人公司的安全最脆弱,因为没有安全团队审查。但也可以用 AI 弥补这个缺口。


4.1 一人公司的安全现实

威胁模型

真正面临的威胁(按概率排序):

  1. 水平越权(最常见):用户 A 访问用户 B 的数据
  2. 认证绕过:过期/伪造 JWT token
  3. API 滥用:无限制爬取数据
  4. 依赖包漏洞:未及时更新的第三方库
  5. 配置泄漏:.env 文件进了 git

4.2 OWASP Top 10 实战防御

A01 访问控制失效(最高优先级)

水平越权防御模式

# ✅ 正确:每次查询都验证 owner
async def get_project(db, project_id: UUID, user_id: UUID):
    result = await db.execute(
        select(Project).where(
            Project.id == project_id,
            Project.owner_id == user_id
        )
    )

A02 加密失败

密码存储

from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

# 存储时 hash
hashed = pwd_context.hash(plain_password)
# 验证
is_valid = pwd_context.verify(plain_password, stored_hash)

A03 注入攻击

SQLAlchemy ORM 已防止大部分 SQL 注入,但仍需注意:

# ✅ 安全:用参数化查询
result = await db.execute(
    select(Ad).where(Ad.name.ilike(f"%{search_term}%"))
)

4.3 密钥与配置管理

层次化密钥管理策略

开发环境:   .env 文件(不提交 git)
测试 CI:    GitHub Actions Secrets
生产容器:   Docker/K8s Secret

.gitignore 黄金规则

# 永远不要提交这些
.env
.env.*
*.pem
*.key
*secret*
*password*

4.4 API 安全最佳实践

输入验证(Pydantic 是第一道防线)

class SnapshotCreate(BaseModel):
    name: str = Field(min_length=1, max_length=100)
    ads: list[AdInput] = Field(max_length=10000)

小结与行动项

本章学到:

  1. 水平越权是最常见的安全问题
  2. JWT 要区分 access/refresh token
  3. 密钥分层管理
  4. Pydantic schema 是第一道输入防线

行动项:

  • 搜索代码中的 db.get(Model, id) 调用
  • 检查 .gitignore 是否覆盖 secret 文件
  • 用安全审查 Prompt 检查 API 端点

上一章 → 第3章:代码编写工程实践
下一章 → 第5章:完整案例:Market Vault