secure-code-guardian
認証・認可の実装、ユーザー入力の保護、OWASP Top 10の脆弱性対策が必要な場合に使用します。bcrypt/argon2によるパスワードハッシング、パラメータ化ステートメントによるSQLインジェクション対策、CORS/CSPヘッダーの設定、Zodによる入力検証、JWTトークンの構築などのカスタムセキュリティ実装に対応します。認証、認可、入力検証、暗号化、OWASP Top 10対策、セッション管理、セキュリティ強化全般で活用できます。ただし、構築済みのOAuth/SSO統合や単独のセキュリティ監査が必要な場合は、より特化したスキルの検討をお勧めします。
description の原文を見る
Use when implementing authentication/authorization, securing user input, or preventing OWASP Top 10 vulnerabilities — including custom security implementations such as hashing passwords with bcrypt/argon2, sanitizing SQL queries with parameterized statements, configuring CORS/CSP headers, validating input with Zod, and setting up JWT tokens. Invoke for authentication, authorization, input validation, encryption, OWASP Top 10 prevention, secure session management, and security hardening. For pre-built OAuth/SSO integrations or standalone security audits, consider a more specialized skill.
SKILL.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、セキュリティヘッダー
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- Jeffallan
- ライセンス
- MIT
- 最終更新
- 2026/5/1
Source: https://github.com/Jeffallan/claude-skills / ライセンス: MIT