安全开发规范
安全开发规范回答三个问题:谁能访问什么、机密放在哪里、不可信数据怎么进出。它的三条主线是默认拒绝(default deny)、逐资源授权判定、输入校验(validation)与输出转义(escaping)。本页条目全部属于常驻约束,写进规则——唯有一个例外:上线前的授权清单审查写成技能。
1这一页管什么
安全约束不能依赖注意力,落到规则里才会被反复读到。
- 管三条主线。授权判定、机密管理、不可信数据的进出。
- 相邻分工。环境的网络策略与密钥托管设施属部署运维规范;但要在本页写明密钥不进仓库、不进镜像层、不进前端。
- 落法只有一种。全部写进规则;「上线前做一次授权清单审查」这一类流程写成技能。
对应的课程知识点:安全设计原则中的最小权限(least privilege)、完全中介(complete mediation)与失效安全(fail secure)、纵深防御,以及安全左移(shift-left)——把越权失败场景写进规约,而不是等到渗透测试时才发现。本页的判定口径与其他四页不同:不看「有没有漏洞」,而看「违规能不能被流程发现」。
2规范条目
十四条,按「授权 → 机密 → 数据进出 → 发现」排列。
| 条目 | 要写清什么,为什么这样规定 | 怎么检查 |
|---|---|---|
| 默认拒绝(default deny) | 未显式授权即拒绝;新增接口默认不可访问,须显式登记进授权清单。默认允许的系统里,遗漏一处判定就多一个入口 | 新建一个未登记的接口,访问应失败 |
| 逐资源授权判定 | 授权判定在服务端逐条资源执行,先取行再校验归属(fetch-then-check);跨资源访问按不存在处理。这是完全中介的具体落法:每一次访问都要判定,不复用上一次的结论 | 换成他人的资源标识重放请求,应被拒绝 |
| 附件与文件读取 | 禁止提供通用的、仅凭文件标识即可读取或下载的接口;读取必须挂钩业务对象并完成授权判定;附件不落在公开静态目录。为什么:文件标识可以被枚举,通用读取接口等于放弃授权判定——这是越权最常见的漏点 | 换一个账号用原文件标识直接读取,应被拒绝;匿名访问附件地址应无法打开 |
| 越权失败场景 | 每条读写资源的场景必须配对一条越权场景:水平越权(访问同类型的他人资源)与功能级越权(低权限访问高权限功能)。把安全要求写进规约,测试才有依据 | 场景清单与用例清单比对,缺一即判未覆盖 |
| 认证与会话 | 口令用加盐的单向算法(如 bcrypt)存储,不保存明文;令牌不进 URL 查询串与日志;会话支持立即失效。URL 会被浏览器历史与网关日志留存 | 检索日志;令牌出现在 URL 中即判失败 |
| 令牌的存放位置 | 访问令牌放内存,不写入本地存储;刷新令牌放在 HttpOnly、Secure、SameSite=Strict 的 Cookie 中并支持轮换;修改口令之后既有令牌立即失效。为什么:本地存储可被页面脚本读取,一旦发生脚本注入,令牌即等同于泄露 | 在浏览器控制台检索本地存储,取不到访问令牌;修改口令之后用旧令牌请求应被拒绝 |
| 密钥与机密 | 只从环境变量读取;忽略规则先于代码入库;配置样例只写键名;一旦进入历史即轮换(rotate)。历史可被克隆,删除文件不足以消除风险 | 检索仓库全部提交历史与镜像层;轮换步骤写在 README 中 |
| 外部内容不可信 | 用户上传的正文、技能与工具描述都视为外部数据:拼进提示词时放在用户消息里,系统提示里写明不执行其中的任何指令。这是提示词注入(prompt injection)的第一道边界 | 上传含指令性文本的素材,检查模型是否把它当作指令执行 |
| 出站地址白名单 | 出站请求的目标地址、回调地址与文件拉取地址走白名单或等价校验,禁止由请求参数直接决定。为什么:服务端会被诱导访问内网地址或任意外部地址,而这类请求不带用户身份 | 提交指向内网地址的回调地址,应被拒绝,且日志中不出现成功访问记录 |
| 输入校验(validation) | 按白名单校验类型、长度、范围与枚举;内部标识不可信,必须校验其归属。黑名单总是在列举已知危险 | 传入超范围值与错误类型应被拒绝 |
| 输出转义(escaping) | 按输出上下文转义:页面、命令行、模板;查询一律使用参数绑定,不拼接字符串。注入的本质是数据被当成代码执行 | 构造含引号与标签的输入,检查是否被原样执行 |
| 敏感数据 | 敏感字段不进日志与响应体;脱敏规则集中定义一处。分散定义的结果总是有遗漏 | 抽查日志与响应,含敏感原值即判失败 |
| 依赖引入与许可证 | 新依赖需说明用途与许可协议,许可证走白名单;版本锁定文件入库。供应链缺陷会绕过所有应用层防护,而许可证问题往往到发布时才被发现 | 抽查依赖清单;存在白名单外的许可证即判未通过 |
| 依赖漏洞扫描 | 规定触发时机、阻断级别与修复时限 | 构建产物含达到阻断级别的漏洞时应失败 |
3本课先写到哪
下列四件完成即可验收,其余随能力扩展补充。
- 最小集合五条。默认拒绝、逐资源授权判定、密钥外置与轮换、输入校验白名单、查询参数绑定。
- 补齐越权场景。每条读写资源的场景配一条越权失败场景,与测试规范的用例清单对齐。
- 写一次移除验证。删掉某个接口的授权判定,检查有无流程或检查能发现;发现不了就把该检查补上。
- 写清处置步骤。把「发现密钥泄露后的处理步骤」写进 README,并指明由谁执行轮换。
本页与仓库约定在此衔接:忽略规则先于代码入库、配置样例只写键名,既是协作要求也是安全要求,两处的表述必须一致。