2026-03-24 16:13:32 +08:00
# **4.3 安全编码规范 (防御性编程)**
防御性编程的核心思想是:**假设所有的外部输入都是恶意的,假设内部的依赖调用随时会失败**。安全漏洞一旦在生产环境被利用,对业务和公司声誉的打击往往是毁灭性的。
本规范规定了团队在日常编码中必须遵守的安全底线。
### **4.3.1 常见 Web 漏洞防护底线**
#### **1\. SQL 注入 (SQL Injection) 绝对防线**
* **红线**: **绝对禁止**使用字符串拼接(如 Python 的 f-string 或 %s, Java 的 \+)来构造 SQL 语句。
* **规范**:
* 默认必须使用框架提供的 ORM 工具(如 Django ORM, SQLAlchemy, MyBatis 动态标签)。
* 如果极其特殊的复杂查询必须执行原生 SQL, **必须**使用参数化查询( Parameterized Queries) , 将变量作为参数安全传递给数据库驱动。
#### **2\. 跨站脚本攻击 (XSS \- Cross-Site Scripting) 防护**
* **输入校验**:在后端接口层(如 DRF Serializer 或 Pydantic) 必须严格校验输入数据的格式与长度。
* **输出转义**:
* 现代前端框架( Vue/React) 默认防范了 DOM 型 XSS, 但如果后端需要渲染模板( 如 Django Template) , **严禁滥用 |safe 过滤器**。
* **富文本处理**:如果业务确实需要接收和展示用户提交的 HTML 富文本,后端在入库前**必须**使用白名单过滤库(如 Python 的 bleach, Java 的 OWASP Java HTML Sanitizer) 对危险标签( 如 \<script\>, \<iframe\>, onload) 进行清洗。
#### **3\. 跨站请求伪造 (CSRF) 防护**
* **无状态 Token 场景(如 JWT) **:客户端将 Token 存放在 localStorage 并通过 Header (如 Authorization: Bearer) 发送时,天然免疫 CSRF, 无需额外配置。
* **Cookie 鉴权场景**:如果项目使用 Cookie 存放 Session ID 或 Token:
* 必须为 Cookie 设置 HttpOnly=True( 防止 XSS 窃取)和 SameSite=Lax 或 Strict( 防止 CSRF 跨站携带)。
* 涉及状态修改的接口( POST/PUT/DELETE) , 必须开启并验证 CSRF Token。
### **4.3.2 敏感数据处理规范 (数据安全红线)**
敏感数据(如用户密码、手机号、身份证号、银行卡号、支付凭证)的生命周期必须受到极其严格的管控。
#### **1\. 传输层加密**
* **规范**:生产环境的所有 API 请求、后台管理系统访问,**强制使用 HTTPS (TLS 1.2 及以上版本)**。绝对禁止敏感数据在公网明文传输。
#### **2\. 密码存储红线**
* **红线**: **任何情况下,绝对禁止以明文形式存储用户密码。**
* **规范**:
* 密码必须使用强单向哈希算法(如 Bcrypt, Argon2, 或 Django 默认的 PBKDF2) 进行加密存储。
* **禁止使用 MD5 或 SHA1** 作为密码的哈希算法(极其容易被彩虹表破解)。
* 加密过程必须加盐( Salt) , 且每个用户的盐值必须随机且唯一。
#### **3\. PII (个人身份信息) 的存储与加密**
* **需解密还原的数据**(如业务人员需要查看真实手机号、发货地址):必须使用强大的对称加密算法(如 AES-256-GCM) 进行**落地加密( Encryption at Rest) **, 且加密密钥( KMS) 必须与数据库物理隔离。
* **无需解密的数据**(如仅用于用户登录匹配的手机号):建议直接使用带盐哈希存储,业务逻辑只做哈希比对。
#### **4\. 数据展示与脱敏 (Data Masking)**
* **红线**: **前端展示所需的数据脱敏,必须在后端完成!绝对禁止后端返回完整明文数据,依靠前端代码去隐藏或打星号。**
* **规范**:通过 API 返回给用户终端的敏感信息,必须提前进行掩码截断。
* 手机号: 138\*\*\*\*1234
* 身份证: 110105\*\*\*\*\*\*\*\*1234
* 银行卡:\*\*\*\* \*\*\*\* \*\*\*\* 1234
* 姓名:张\*三 或 \*三
#### **5\. 日志安全红线**
* **红线**: **日志中绝对禁止打印明文密码、鉴权 Token、完整的银行卡号/CVV 码、加密密钥。**
* **规范**: 在全局中间件或切面( AOP) 记录请求和响应日志时, 必须配置**敏感字段过滤规则**。如果请求体中包含 "password": "xxx",写入日志时必须替换为 "password": "\*\*\*"。
### **4.3.3 业务安全与防暴破机制**
* **水平越权防护 (IDOR/BOLA)**:
* 永远不要相信用户提交的资源 ID。在修改或删除任何记录( 如 POST /orders/123/cancel) 时, 除了判断 ID 存在,**必须**在数据库查询层面加上归属校验(如 WHERE order\_id=123 AND user\_id={当前登录用户ID})。*(详见 3.2.7 数据隔离规范)*。
2026-03-30 11:19:22 +08:00
* **接口防刷与限流 (Rate Limiting)**:
* 对于发送短信验证码、注册、登录等极易被黑客利用进行暴力破解或“薅羊毛”的接口,必须在网关层或应用层配置**频次限制**(如同一 IP 每分钟最多 5 次,同一手机号每天最多 10 次)。
* **失败提示模糊化**:
* 登录失败时,无论是因为“账号不存在”还是“密码错误”,**统一定义返回**:“账号或密码错误”。禁止明确告知攻击者账号是否存在,防止黑客进行“撞库”和账号枚举。
## 🤖 [附加] AI 助手执行协议 (AI Output Schema)
**绝对红线**:提供安全漏洞与架构越权的排查 Checklist。规定 AI 必须逐项回复检查结果( True/False) , 一旦发现违规必须输出重构后的安全代码。