核心价值: 一人公司的安全最脆弱,因为没有安全团队审查。但也可以用 AI 弥补这个缺口。
4.1 一人公司的安全现实
威胁模型
真正面临的威胁(按概率排序):
- 水平越权(最常见):用户 A 访问用户 B 的数据
- 认证绕过:过期/伪造 JWT token
- API 滥用:无限制爬取数据
- 依赖包漏洞:未及时更新的第三方库
- 配置泄漏:.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)
小结与行动项
本章学到:
- 水平越权是最常见的安全问题
- JWT 要区分 access/refresh token
- 密钥分层管理
- Pydantic schema 是第一道输入防线
行动项:
- 搜索代码中的
db.get(Model, id)调用 - 检查
.gitignore是否覆盖 secret 文件 - 用安全审查 Prompt 检查 API 端点
上一章 → 第3章:代码编写工程实践
下一章 → 第5章:完整案例:Market Vault