# 安全编码规则

## 你必须遵守的核心安全原则

### 1. 输入验证原则（必须严格执行）

**执行要求：**

- **必须**：永远不要信任用户输入
- **必须**：验证所有输入数据的格式和范围
- **必须**：使用白名单而非黑名单进行验证
- **禁止**：直接使用未验证的用户输入

**验证要求：**

- 验证数据类型（字符串、数字、日期等）
- 验证数据格式（邮箱、URL、电话号码等）
- 验证数据范围（长度、数值范围等）
- 验证数据内容（不允许特殊字符、SQL 注入字符等）

### 2. 最小权限原则（必须遵守）

**执行要求：**

- **必须**：使用最小必要的权限
- **必须**：避免使用管理员权限运行应用
- **必须**：限制文件系统访问范围
- **禁止**：使用过高的权限运行应用

**权限管理：**

- 文件系统：只授予必要的目录访问权限
- 网络访问：只允许访问必要的服务
- 数据库：使用最小权限的数据库用户
- 系统资源：限制 CPU、内存等资源使用

### 3. 敏感数据保护原则（必须遵守）

**执行要求：**

- **禁止**：在代码中硬编码密码、密钥、API Key
- **必须**：使用环境变量或密钥管理服务存储敏感信息
- **必须**：加密存储敏感数据
- **必须**：使用 HTTPS 传输敏感数据

**敏感数据处理：**

- 密码：必须加密存储（使用哈希算法，如 bcrypt）
- API 密钥：存储在环境变量或密钥管理服务中
- 令牌：使用安全的令牌生成和验证机制
- 个人信息：遵守数据保护法规（如 GDPR）

## 你必须防范的常见安全问题

### 1. SQL 注入（必须防范）

**禁止行为：**

- **禁止**：拼接 SQL 语句
- **禁止**：直接将用户输入插入 SQL 语句

**必须行为：**

- **必须**：使用参数化查询
- **必须**：使用 ORM 框架的查询方法
- **必须**：验证和转义所有输入

**示例：**

```python
# ❌ 错误：SQL 注入风险
query = f"SELECT * FROM users WHERE id = {user_id}"

# ✅ 正确：参数化查询
query = "SELECT * FROM users WHERE id = ?"
cursor.execute(query, (user_id,))
```

### 2. XSS (跨站脚本攻击)（必须防范）

**必须行为：**

- **必须**：对用户输入进行转义
- **必须**：使用内容安全策略 (CSP)
- **必须**：验证和清理 HTML 内容

**防护措施：**

- 输出转义：对所有输出到 HTML 的内容进行转义
- CSP 头：设置内容安全策略，限制脚本执行
- 输入验证：拒绝包含脚本标签的输入

### 3. CSRF (跨站请求伪造)（必须防范）

**必须行为：**

- **必须**：使用 CSRF token
- **必须**：验证请求来源
- **必须**：对敏感操作使用 POST 请求

**防护措施：**

- 生成并验证 CSRF token
- 检查 Referer 头
- 使用 SameSite Cookie 属性

### 4. 敏感信息泄露（必须防范）

**禁止行为：**

- **禁止**：在日志中记录敏感信息（密码、密钥、令牌）
- **禁止**：在错误消息中暴露系统细节
- **禁止**：在代码注释中留下敏感信息

**必须行为：**

- **必须**：在记录日志前过滤敏感信息
- **必须**：使用通用的错误消息，不暴露内部细节
- **必须**：定期检查代码和配置文件中的敏感信息

## 安全编码检查清单

在提交代码前，你必须确认：

**输入验证：**

- [ ] 所有用户输入都经过验证
- [ ] 使用白名单而非黑名单
- [ ] 验证了数据类型、格式和范围

**敏感数据处理：**

- [ ] 没有硬编码的密码或密钥
- [ ] 敏感信息存储在环境变量或密钥管理服务中
- [ ] 敏感数据被加密存储
- [ ] 使用 HTTPS 传输敏感数据

**数据库安全：**

- [ ] 使用参数化查询（防止 SQL 注入）
- [ ] 使用最小权限的数据库用户
- [ ] 数据库连接使用加密

**输出安全：**

- [ ] 所有输出都经过转义（防止 XSS）
- [ ] 错误消息不泄露系统信息
- [ ] 日志中不包含敏感信息

**访问控制：**

- [ ] 实施了适当的访问控制
- [ ] 使用 CSRF token 保护表单
- [ ] 验证了用户权限

**依赖安全：**

- [ ] 定期更新依赖库
- [ ] 检查依赖库的安全漏洞
- [ ] 使用安全的随机数生成器
