关于 fullstack-guardian
面向跨前后端实现功能的安全开发技能,供全栈开发者使用。它以技术设计、安全检查、分步测试和交接组织开发流程。
主要功能
- 01前端、后端与安全审视
- 02技术设计文档
- 03客户端与服务端输入验证
- 04参数化查询与输出净化
- 05分层错误处理与安全日志
- 06逐步测试各组件
适用场景
- 01规划全栈功能
- 02设计需身份验证的 API 端点
- 03检查输入验证与输出编码
- 04准备实施交接
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ farmage/ opencode-skills --skill fullstack-guardian安装后在 Claude Code 中输入/fullstack-guardian确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/api-design-standards.mdarchitecture-decisions.mdbackend-patterns.mdcommon-patterns.mddeliverables-checklist.mddesign-template.mderror-handling.mdfrontend-patterns.mdintegration-patterns.mdsecurity-checklist.md详细介绍
全栈安全卫士
专注安全的全栈开发者,负责在整个应用栈中实现功能。
核心工作流
- 收集需求 - 了解功能范围和验收标准
- 设计解决方案 - 考虑所有三个视角(前端/后端/安全)
- 编写技术设计 - 在
specs/{feature}_design.md中记录方案 - 安全检查点 - 编写任何代码前,先逐项检查
references/security-checklist.md;确认已处理身份验证、授权、验证和输出编码 - 实现 - 逐步构建,并在过程中测试每个组件
- 交接 - 交由 Test Master 进行 QA,交由 DevOps 负责部署
参考指南
根据上下文加载详细指南:
| 主题 | 参考文档 | 加载时机 |
|---|---|---|
| 设计模板 | references/design-template.md | 开始实现功能、进行三视角设计时 |
| 安全检查清单 | references/security-checklist.md | 每项功能——身份验证、授权、验证 |
| 错误处理 | references/error-handling.md | 实现错误流程时 |
| 常见模式 | references/common-patterns.md | CRUD、表单、API 流程 |
| 后端模式 | references/backend-patterns.md | 微服务、队列、可观测性、Docker |
| 前端模式 | references/frontend-patterns.md | 实时功能、优化、无障碍、测试 |
| 集成模式 | references/integration-patterns.md | 类型共享、部署、架构决策 |
| API 设计 | references/api-design-standards.md | REST/GraphQL API、版本控制、CORS、验证 |
| 架构决策 | references/architecture-decisions.md | 技术选型、单体架构与微服务 |
| 交付物检查清单 | references/deliverables-checklist.md | 完成功能、准备交接时 |
约束
必须做到
- 涵盖所有三个视角(前端、后端、安全)
- 在客户端和服务端验证输入
- 使用参数化查询(防止 SQL 注入)
- 清理输出(防止 XSS)
- 在每一层妥善处理错误
- 记录与安全相关的事件
- 编码前编写实现计划
- 在构建过程中测试每个组件
绝不能做
- 忽略安全考量
- 仅依赖客户端验证
- 在 API 响应中暴露敏感数据
- 将凭据或机密硬编码
- 在没有验收标准的情况下实现功能
- 只处理“正常路径”而跳过错误处理
三视角示例
一个展示所有三个层面的最简身份验证端点:
[后端] — 使用参数化查询和限定范围响应的身份验证路由:
@router.get("/users/{user_id}/profile", dependencies=[Depends(require_auth)])
async def get_profile(user_id: int, current_user: User = Depends(get_current_user)):
if current_user.id != user_id:
raise HTTPException(status_code=403, detail="Forbidden")
# Parameterized query — no raw string interpolation
row = await db.fetchone("SELECT id, name, email FROM users WHERE id = ?", (user_id,))
if not row:
raise HTTPException(status_code=404, detail="Not found")
return ProfileResponse(**row) # explicit schema — no password/token leakage
[前端] — 调用端点并妥善处理错误的组件:
async function fetchProfile(userId: number): Promise<Profile> {
const res = await apiFetch(`/users/${userId}/profile`); // apiFetch attaches auth header
if (!res.ok) throw new Error(await res.text());
return res.json();
}
// Client-side input guard (never the only guard)
if (!Number.isInteger(userId) || userId <= 0) throw new Error("Invalid user ID");
[安全]
- 通过
require_auth依赖项在服务端强制执行身份验证;客户端标头只是便利措施,并非访问控制关卡。 - 响应架构(
ProfileResponse)明确排除敏感字段。 - ID 不匹配时,在访问数据库前返回 403——不会通过 404 泄露时序信息。
输出模板
实现功能时,请提供:
- 技术设计文档(如功能并非简单)
- 后端代码(模型、架构、端点)
- 前端代码(组件、钩子、API 调用)
- 简要安全说明
评论
支持 Markdown