security-reviewlisted
Install: claude install-skill Wade-DevCode/awesome-coding-skills-cn
# 安全审查
## 何时用
- 新功能上线前做安全审查。
- 代码涉及用户输入处理、认证鉴权、数据库查询、文件操作时。
- 接到安全漏洞报告,需要定位和评估影响范围时。
- 引入第三方依赖或集成外部 API 前。
## 核心规则
### 1. 输入即不可信:防注入(SQL / 命令 / XSS)
**规则:** 所有来自外部的数据(HTTP 参数、请求体、文件内容、消息队列、环境变量)默认不可信;SQL 查询用参数化语句,系统命令用参数列表而非字符串拼接,HTML 输出做转义。
**为什么:** AI 生成数据库查询时极容易回退到字符串拼接:`"SELECT * FROM users WHERE id=" + userId`。在 userId 为 `"1 OR 1=1"` 时整张表被泄露,为 `"1; DROP TABLE users--"` 时数据被删除。2023 年 OWASP Top 10 注入漏洞仍居首位,AI 代码贡献了相当比例的新增漏洞。
**怎么做:**
```python
# 反例:字符串拼接
query = f"SELECT * FROM users WHERE name='{name}'"
cursor.execute(query)
# 正例:参数化查询
cursor.execute("SELECT * FROM users WHERE name = %s", (name,))
```
```python
# 反例:os.system 拼接
os.system(f"ffmpeg -i {filename} output.mp4")
# 正例:参数列表,不经 shell 解释
subprocess.run(["ffmpeg", "-i", filename, "output.mp4"], check=True)
```
- 前端输出用模板引擎的自动转义(如 Jinja2 的 `{{ var }}`),禁止用 `innerHTML = userInput`。
---
### 2. 认证与会话:加盐哈希、有效期、防爆破
**规则:** 密码存储用 bcrypt/Argon2(禁用 MD5/SHA1/SHA256 直接哈希);session token 和 JWT 设置合理有效期并支持服务端撤销;登录接口做频率限制防爆破。
**为什么:** AI 实现用户注册时,最常见的错误是 `hashlib.sha256(password.encode()).hexdigest()` 存库。SHA256 无盐、速度极快,彩虹表或 GPU 暴力破解成本极低;一旦数据库泄露,大量账号密码几分钟内被还原。另一个常见问题:AI 生成的 JWT 不设 `exp` 字段,token 一旦泄露永久有效,撤销无从实现。
**怎么做:**
```python
import bcrypt
# 存储:自动加盐
hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))
# 验证
bcrypt.checkpw(password.encode(), hashed)
```
```python
import jwt
from datetime import datetime, timedelta, timezone
token = jwt.encode({
"sub": user_id,
"exp": datetime.now(timezone.u