mcpField
S
secure-code-guardian

secure-code-guardian

github.com/jeffallan安全12.1k5.2k 次安装今天更新
代码仓库

关于 secure-code-guardian

面向开发者的安全编码技能,支持规划、实现和验证应用安全控制,涵盖威胁建模、身份验证、输入处理、授权及安全标头。

主要功能

  1. 01威胁建模与安全设计
  2. 02身份验证和授权检查
  3. 03输入验证与清理
  4. 04安全标头和速率限制
  5. 05记录安全决策

适用场景

  1. 01审查身份验证与会话控制
  2. 02测试注入和 XSS 防护
  3. 03检查授权边界和安全标头

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jeffallan/claude-skills --skill secure-code-guardian

安装后在 Claude Code 中输入/secure-code-guardian确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
authentication.md
input-validation.md
owasp-prevention.md
security-headers.md
xss-csrf.md

详细介绍

安全代码守护者

核心工作流

  1. 威胁建模 — 识别攻击面和威胁
  2. 设计 — 规划安全控制措施
  3. 实现 — 采用纵深防御编写安全代码;参见下方代码示例
  4. 验证 — 通过明确的检查点测试安全控制措施(见下文)
  5. 记录 — 记录安全决策
验证检查点

每个实现步骤完成后,都要进行验证:

  • 身份验证:测试暴力破解防护(是否触发锁定/速率限制)、会话固定攻击防护、令牌过期,以及无效凭据的错误消息(不得泄露用户是否存在)。
  • 授权:验证是否阻止水平和垂直权限提升路径;使用属于不同角色/用户的令牌进行测试。
  • 输入处理:确认 SQL 注入载荷(' OR 1=1--)会被拒绝;确认 XSS 载荷(<script>alert(1)</script>)会被转义或拒绝。
  • 标头/CORS:使用安全扫描器(例如 curl -I、Mozilla Observatory)进行验证,确保存在安全标头且 CORS 来源允许列表配置正确。

参考指南

根据上下文加载详细指南:

主题参考资料加载时机
OWASPreferences/owasp-prevention.mdOWASP Top 10 模式
身份验证references/authentication.md密码哈希、JWT
输入验证references/input-validation.mdZod、SQL 注入
XSS/CSRFreferences/xss-csrf.mdXSS 防护、CSRF
标头references/security-headers.mdHelmet、速率限制

约束

必须做到
  • 使用 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' });
});

输出模板

实现安全功能时,请提供:

  1. 安全的实现代码
  2. 说明安全注意事项
  3. 配置要求(环境变量、标头)
  4. 测试建议

知识参考

OWASP Top 10、bcrypt/argon2、JWT、OAuth 2.0、OIDC、CSP、CORS、速率限制、输入验证、输出编码、加密(AES、RSA)、TLS、安全标头

由 @jeffallan 维护,其为 Synergetic Solutions 的首席顾问

文档

评论

支持 Markdown