服务端安全规约
1. 总体原则
1.1 安全目标
- 保证数据:机密性、完整性、可用性(CIA)
- 默认不信任任何请求(Zero Trust)
- 所有输入都是不可信的
- 安全优先于功能便利
1.2 基本原则
- 最小权限原则(Least Privilege)
- 防御纵深(Defense in Depth)
- 不依赖前端做安全校验
- 安全与业务解耦
2. 身份认证(Authentication)
2.1 登录认证规范
必须使用 HTTPS
禁止明文传输密码
密码必须:
- 使用 bcrypt / scrypt / argon2 哈希
- 不可逆
- 带 salt
禁止存储明文密码
2.2 Token 规范
使用 JWT / Session Token
Token 必须:
- 有过期时间(exp)
- 可刷新
- 绑定用户 ID
敏感操作必须二次验证
2.3 多因素认证(可选)
- 高风险操作:修改密码、提现、删除数据
- 推荐:短信 / 邮件 / TOTP
3. 权限控制(Authorization)
3.1 权限模型
推荐模型:
- RBAC(角色权限)
- 或 RBAC + 数据权限
3.2 鉴权原则
- 每个 API 必须校验权限
- 禁止通过前端控制权限
- 后端统一鉴权中间件
示例:
text
/user/delete -> admin role
/order/view -> owner only4. 输入校验(Input Validation)
4.1 基本要求
所有参数必须校验:
- 类型
- 长度
- 范围
- 格式
不信任任何外部输入
4.2 防注入
防止:
- SQL 注入
- 命令注入
- XSS
- JSON 注入
规范:
- 使用预编译 SQL
- 禁止拼接 SQL 字符串
- HTML 输出必须转义
5. 数据安全
5.1 敏感数据保护
敏感字段:
- 密码
- 身份证
- 手机号
- 银行卡
- Token / Secret
规范:
- 数据库存储加密(AES)
- 返回接口必须脱敏
示例:
text
138****12345.2 日志安全
日志禁止打印:
- 密码
- Token
- 身份证
- 银行卡号
日志需分级:
- INFO
- WARN
- ERROR
6. 接口安全
6.1 防重放攻击
使用:
- timestamp
- nonce
- 签名(sign)
6.2 防刷与限流
- IP 限流
- 用户限流
- 接口限流
示例:
text
10 req/s/user6.3 接口幂等性
支付 / 创建订单必须幂等
使用:
- 幂等 ID
- 去重表
7. 文件与上传安全
- 限制文件大小
- 校验文件类型
- 重命名文件
- 禁止执行权限
- 文件存储隔离
8. 配置与密钥管理
8.1 配置规范
密钥不得写入代码仓库
使用环境变量或配置中心
区分环境:
- dev
- test
- prod
8.2 Key 管理
- 定期轮换
- 权限最小化
- 不共用 Key
9. 网络与部署安全
- 禁止暴露数据库端口公网访问
- 内网通信
- 使用防火墙
- 安全组限制 IP
10. 错误与异常处理
- 不返回堆栈信息
- 不暴露系统结构
- 错误信息统一格式
- 对外返回业务错误码
11. 第三方依赖安全
- 定期升级依赖库
- 使用漏洞扫描工具(SCA)
- 禁止使用未知来源包
12. 审计与监控
- 登录日志
- 操作日志
- 异常行为监控
- 告警机制
13. 常见攻击防御清单
| 攻击类型 | 防御措施 |
|---|---|
| SQL 注入 | 预编译 SQL |
| XSS | 输出转义 |
| CSRF | Token 校验 |
| 暴力破解 | 限流 |
| 重放攻击 | nonce+timestamp |
| 文件木马 | 类型校验 |
14. 安全测试
必须做:
- 单元测试
- 接口安全测试
建议:
- 渗透测试
- 漏洞扫描
15. 安全事件响应
- 发现漏洞立即封禁接口
- 记录事件
- 复盘
- 修复
- 更新规范
16. 核心安全红线(必须遵守)
❌ 禁止:
- 明文密码
- 硬编码密钥
- 拼接 SQL
- 返回敏感字段
- 暴露服务器信息
- 关闭鉴权调试接口
17. 推荐安全组件
- HTTPS
- WAF
- API Gateway
- OAuth2 / JWT
- Rate Limiter
- Vault / KMS
