安全Web应用编码指南
将 OWASP Top 10:2025、ASVS 5.0、Cheat Sheet Series 以及精选的 WSTG 材料转化为实用的 Web 应用安全指南。
默认(内联模式): 静默编写安全代码;仅标记你附近发现的最高影响问题。
审计模式: 当包含“review”、“audit”、“harden”、“is this secure?”或事件跟进时,读取 assets/audit-checklist.md 并生成有优先级的发现。
模式,以 $secure-webapp <mode> 方式调用:
$secure-webapp audit:完整的优先级审查;读取assets/audit-checklist.md。$secure-webapp quick-check:仅检查最高风险项——授权、身份验证/会话、密钥、注入/XSS、上传、SSRF、令牌。不生成完整检查清单报告。$secure-webapp harden:在允许编辑的地方直接应用安全变更;保留架构的小补丁;验证并标记任何需要产品审批的事项。$secure-webapp remediate:迭代审计→修复循环;首先完整读取assets/remediate-checklist.md。$secure-webapp design-review:实现前的威胁建模——假设、信任边界、滥用案例、必须的控制措施、未解决的问题。$secure-webapp report:向docs/security-audit-report-YYYY-MM-DD.md写入正式报告;首先完整读取assets/report-template.md并遵循每个步骤。需要本会话前已执行审计。写入文件,绝不写入聊天。$secure-webapp update:通过运行npx --yes github:hov172/secure-webapp-skill --global自行更新此安装。它会检查版本,仅在有新版本发布时才重新安装。标志:--claude/--codex/--gemini、--check、--force。$secure-webapp maintain:从源码仓库的克隆中更新技能包本身——参见scripts/README.md。
仅加载任务所需的参考资料。绝不要全部批量加载。
路由
| 任务涉及 | 加载的参考文件 |
|---|---|
| 未信任的字符串被解释为 HTML/DOM/SQL/shell/NoSQL/LDAP/正则表达式/CSV | references/input-handling.md |
| 登录、注册、密码、多因素认证、重置、暴力破解、会话、Cookie、退出登录 | references/auth-and-sessions.md |
| 权限、角色、所有权检查、IDOR、租户隔离 | references/authorization.md |
| JWT、API/刷新令牌、签名与验证、OAuth/OIDC、PKCE、state | references/tokens-and-oauth.md |
| REST/GraphQL/WebSocket 端点、速率限制、批量赋值、响应结构、上传/下载、路径遍历、预签名URL | references/apis-and-files.md |
| Secure/HttpOnly/SameSite、CSP、CORS、CSRF、安全头、iframe、postMessage | references/frontend-and-headers.md |
环境变量、.env、密钥、密钥管理器、调试模式、默认值 | references/secrets-and-config.md |
| 加密、密码哈希、算法、密钥管理、个人隐私信息 | references/data-and-crypto.md |
| 依赖项、锁定文件、SBOM、CI/CD、GitHub Actions、已签名的制品 | references/supply-chain.md |
| 用户控制的外部URL、SSRF、竞争条件、反序列化、原型污染 | references/secure-coding.md |
| 日志记录、错误响应、堆栈跟踪、审计追踪、故障关闭、回滚 | references/logging-and-errors.md |
| 新功能设计、威胁建模、多租户、安全设计方案 | references/insecure-design.md |
| LLM/AI 功能、提示构建、RAG、智能体工具调用、MCP 服务器、模型输出被渲染或执行 | references/ai-and-llm.md |
持续监控清单
在 Web 代码中遇到以下问题时即时标记,并提供一个具体的修复方案:
- 资源路由上缺少服务器端身份验证/所有权检查。建议使用查询级范围限制,如
WHERE owner_id = :current_user。 - 硬编码的密钥、凭据、JWT 密钥、API 密钥或已提交的
.env文件。 - 使用字符串拼接构建 SQL/NoSQL/shell 查询。应使用参数化查询、安全构建器或 argv API。
- 明文或快速哈希的密码。应使用 argon2id、scrypt 或 bcrypt;仅在必要时使用 PBKDF2。
- JWT 验证使用了未固定密钥的算法、缺少
exp/iss/aud校验,或密钥硬编码在代码中。 - 在用户内容上使用
dangerouslySetInnerHTML、v-html或innerHTML。应渲染为文本或进行清理。 - 包含凭据的 CORS 使用通配符或回显的来源。应使用严格的允许列表。
- 登录、注册、重置、多因素认证/一次性密码或高资源消耗的端点缺少速率限制。
- 面向客户端暴露的详细生产环境错误、堆栈跟踪、SQL/ORM 细节或启用了调试模式。
- 未经验证的
next、returnTo或 URL 参数导致的开放重定向。 - 用户提供的 URL 导致的 SSRF,未使用允许列表且在 DNS 解析和重定向后未阻止私有 IP。
- 日志中包含密码、令牌、会话 ID、密钥或不必要的个人隐私信息(PII)。
- 仅在客户端实施的安全控制:隐藏字段、禁用按钮、客户端角色声明、前端验证。
- 文件上传没有大小、类型、路径、存储或生成文件名的控制。
- 在身份验证、授权、速率限制、功能开关或事务周围开启的故障开放异常路径。
- 余额、配额、支付、库存、优惠券或一次性令牌的状态变更非原子操作。
- 模型/LLM 输出未被检查就到达了接收点——
innerHTML、shell、SQL、文件路径、fetchURL 或下游智能体。将其视为不可信输入。 - 智能体工具调用是针对服务账号而非最终用户授权的,或使用通用的
run_shell/execute_sql/http_request工具,使得提示注入变为 RCE、SQLi 或 SSRF。 - 未信任的文本被拼接到系统提示中;密钥或其他用户的数据出现在模型上下文中。
- 可变依赖项或 CI 操作引用,在期望锁定文件和固定版本的地方使用了可变的标签——移动的标签会在该作业中运行攻击者代码,并获取该作业的密钥。当作业持有部署凭据、签名密钥或发布权限时,评为高严重性;同样适用于存在 OIDC 的长期云凭据。审计单仓库中的每个工作空间,并标记任何弱于
high的审计级别。
行为规范
- 默认编写安全代码,无需冗长解释。在有用时简要说明安全相关的选择。
- 严格程度与应用程序的风险等级相匹配;不要将企业级控制强加于一次性原型。
- 绝不有意生成不安全的代码。提供安全等效方案并用一句话说明限制。
- 对于新的跨信任边界功能,检查:不可信输入、授权、故障模式、存储的数据、滥用路径。
- 审计时,检查真实代码,仅提出必要的范围界定问题,并按优先级报告严重性 + 位置 + 证据 + 修复方案。
- 除非被问及,否则不引用 OWASP 需求编号。
- 不声称进行渗透测试;这是代码和设计审查。
范围
主流 Web 技术栈——Next.js、Express、Django、Flask、FastAPI、Rails、Spring、Laravel、Go 等。对于参考资料未涵盖的领域,如实说明并指向相关的 OWASP 来源,而非自行猜测。
智能体无关:适用于 Claude Code、Codex、Gemini CLI 以及任何加载技能或读取 AGENTS.md/GEMINI.md 的工具。当本文档提及某个工具时,请使用你的环境中的等效工具。