关于 secure-code-guardian
面向开发者的安全编码技能,支持规划、实现和验证应用安全控制,涵盖威胁建模、身份验证、输入处理、授权及安全标头。
主要功能
- 01威胁建模与安全设计
- 02身份验证和授权检查
- 03输入验证与清理
- 04安全标头和速率限制
- 05记录安全决策
适用场景
- 01审查身份验证与会话控制
- 02测试注入和 XSS 防护
- 03检查授权边界和安全标头
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill secure-code-guardian安装后在 Claude Code 中输入/secure-code-guardian确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/authentication.mdinput-validation.mdowasp-prevention.mdsecurity-headers.mdxss-csrf.md详细介绍
安全代码守护者
核心工作流
- 威胁建模 — 识别攻击面和威胁
- 设计 — 规划安全控制措施
- 实现 — 采用纵深防御编写安全代码;参见下方代码示例
- 验证 — 通过明确的检查点测试安全控制措施(见下文)
- 记录 — 记录安全决策
验证检查点
每个实现步骤完成后,都要进行验证:
- 身份验证:测试暴力破解防护(是否触发锁定/速率限制)、会话固定攻击防护、令牌过期,以及无效凭据的错误消息(不得泄露用户是否存在)。
- 授权:验证是否阻止水平和垂直权限提升路径;使用属于不同角色/用户的令牌进行测试。
- 输入处理:确认 SQL 注入载荷(
' OR 1=1--)会被拒绝;确认 XSS 载荷(<script>alert(1)</script>)会被转义或拒绝。 - 标头/CORS:使用安全扫描器(例如
curl -I、Mozilla Observatory)进行验证,确保存在安全标头且 CORS 来源允许列表配置正确。
参考指南
根据上下文加载详细指南:
| 主题 | 参考资料 | 加载时机 |
|---|---|---|
| OWASP | references/owasp-prevention.md | OWASP Top 10 模式 |
| 身份验证 | references/authentication.md | 密码哈希、JWT |
| 输入验证 | references/input-validation.md | Zod、SQL 注入 |
| XSS/CSRF | references/xss-csrf.md | XSS 防护、CSRF |
| 标头 | references/security-headers.md | Helmet、速率限制 |
约束
必须做到
- 使用 bcrypt/argon2 对密码进行哈希(绝不使用 MD5/SHA-1/未加盐哈希)
- 使用参数化查询(绝不使用字符串插值构造 SQL)
- 使用前验证并清理所有用户输入
- 在身份验证端点实施速率限制
- 设置安全标头(CSP、HSTS、X-Frame-Options)
- 记录安全事件(身份验证失败、权限提升尝试)
- 将密钥存储在环境变量或密钥管理器中(绝不存储在源代码中)
绝不能做
- 以明文或可逆加密的形式存储密码
- 不经验证就信任用户输入
- 在日志或错误响应中暴露敏感数据
- 使用弱算法或已弃用算法(MD5、SHA-1、DES、ECB 模式)
- 在代码中硬编码密钥或凭据
代码示例
密码哈希(bcrypt)
import bcrypt from 'bcrypt';
const SALT_ROUNDS = 12; // minimum 10; 12 balances security and performance
export async function hashPassword(plaintext: string): Promise<string> {
return bcrypt.hash(plaintext, SALT_ROUNDS);
}
export async function verifyPassword(plaintext: string, hash: string): Promise<boolean> {
return bcrypt.compare(plaintext, hash);
}
参数化 SQL 查询(Node.js / pg)
// NEVER: `SELECT * FROM users WHERE email = '${email}'`
// ALWAYS: use positional parameters
import { Pool } from 'pg';
const pool = new Pool();
export async function getUserByEmail(email: string) {
const { rows } = await pool.query(
'SELECT id, email, role FROM users WHERE email = $1',
[email] // value passed separately — never interpolated
);
return rows[0] ?? null;
}
使用 Zod 进行输入验证
import { z } from 'zod';
const LoginSchema = z.object({
email: z.string().email().max(254),
password: z.string().min(8).max(128),
});
export function validateLoginInput(raw: unknown) {
const result = LoginSchema.safeParse(raw);
if (!result.success) {
// Return generic error — never echo raw input back
throw new Error('Invalid credentials format');
}
return result.data;
}
JWT 验证
import jwt from 'jsonwebtoken';
const JWT_SECRET = process.env.JWT_SECRET!; // never hardcode
export function verifyToken(token: string): jwt.JwtPayload {
// Throws if expired, tampered, or wrong algorithm
const payload = jwt.verify(token, JWT_SECRET, {
algorithms: ['HS256'], // explicitly allowlist algorithm
issuer: 'your-app',
audience: 'your-app',
});
if (typeof payload === 'string') throw new Error('Invalid token payload');
return payload;
}
保护端点 — 完整流程
import express from 'express';
import rateLimit from 'express-rate-limit';
import helmet from 'helmet';
const app = express();
app.use(helmet()); // sets CSP, HSTS, X-Frame-Options, etc.
app.use(express.json({ limit: '10kb' })); // limit payload size
const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 10, // 10 attempts per window per IP
standardHeaders: true,
legacyHeaders: false,
});
app.post('/api/login', authLimiter, async (req, res) => {
// 1. Validate input
const { email, password } = validateLoginInput(req.body);
// 2. Authenticate — parameterized query, constant-time compare
const user = await getUserByEmail(email);
if (!user || !(await verifyPassword(password, user.passwordHash))) {
// Generic message — do not reveal whether email exists
return res.status(401).json({ error: 'Invalid credentials' });
}
// 3. Authorize — issue scoped, short-lived token
const token = jwt.sign(
{ sub: user.id, role: user.role },
JWT_SECRET,
{ algorithm: 'HS256', expiresIn: '15m', issuer: 'your-app', audience: 'your-app' }
);
// 4. Secure response — token in httpOnly cookie, not body
res.cookie('token', token, { httpOnly: true, secure: true, sameSite: 'strict' });
return res.json({ message: 'Authenticated' });
});
输出模板
实现安全功能时,请提供:
- 安全的实现代码
- 说明安全注意事项
- 配置要求(环境变量、标头)
- 测试建议
知识参考
OWASP Top 10、bcrypt/argon2、JWT、OAuth 2.0、OIDC、CSP、CORS、速率限制、输入验证、输出编码、加密(AES、RSA)、TLS、安全标头
由 @jeffallan 维护,其为 Synergetic Solutions 的首席顾问
评论
支持 Markdown