Files
cps-develop-docs/04 - Quality & Review/4.3 安全编码规范.md

76 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# **4.3 安全编码规范 (防御性编程)**
防御性编程的核心思想是:**假设所有的外部输入都是恶意的,假设内部的依赖调用随时会失败**。安全漏洞一旦在生产环境被利用,对业务和公司声誉的打击往往是毁灭性的。
本规范规定了团队在日常编码中必须遵守的安全底线。
### **4.3.1 常见 Web 漏洞防护底线**
#### **1\. SQL 注入 (SQL Injection) 绝对防线**
* **红线****绝对禁止**使用字符串拼接(如 Python 的 f-string 或 %sJava 的 \+)来构造 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 的 bleachJava 的 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 数据隔离规范)*。
* **接口防刷与限流 (Rate Limiting)**
* 对于发送短信验证码、注册、登录等极易被黑客利用进行暴力破解或“薅羊毛”的接口,必须在网关层或应用层配置**频次限制**(如同一 IP 每分钟最多 5 次,同一手机号每天最多 10 次)。
* **失败提示模糊化**
* 登录失败时,无论是因为“账号不存在”还是“密码错误”,**统一定义返回**:“账号或密码错误”。禁止明确告知攻击者账号是否存在,防止黑客进行“撞库”和账号枚举。
## 🤖 [附加] AI 助手执行协议 (AI Output Schema)
**绝对红线**:提供安全漏洞与架构越权的排查 Checklist。规定 AI 必须逐项回复检查结果True/False一旦发现违规必须输出重构后的安全代码。