mcpField
A
application-security

application-security

github.com/travisjneumanセキュリティ106176 回インストール1 日前に更新
リポジトリ

application-security について

Web アプリ開発者向けに、安全なコーディング、一般的な脆弱性、検証パターン、セキュリティテストツールを解説するスキルです。コード例と実用的な強化チェックリストを含みます。

主な機能

  1. 01OWASP Top 10 のコード例
  2. 02認証とアクセス制御の指針
  3. 03入力検証とレート制限
  4. 04CSP とセキュリティヘッダー
  5. 05SAST、DAST、依存関係スキャン

活用シーン

  1. 01Web コードのインジェクションリスク確認
  2. 02認証エンドポイントの強化
  3. 03依存関係のセキュリティ確認計画

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/travisjneuman/.claude --skill application-security

インストール後、Claude Code で/application-securityを入力して読み込まれたか確認します。

詳細

アプリケーションセキュリティスキル

Web アプリケーション向けのセキュアコーディングパターン、脆弱性の防止、セキュリティツール。


OWASP Top 10(2021)とコード例

A01:アクセス制御の不備
// BAD - No authorization check
app.get('/api/users/:id', async (req, res) => {
  const user = await db.user.findUnique({ where: { id: req.params.id } });
  res.json(user);
});

// GOOD - Verify ownership or role
app.get('/api/users/:id', authenticate, async (req, res) => {
  if (req.user.id !== req.params.id && req.user.role !== 'ADMIN') {
    return res.status(403).json({ error: 'Forbidden' });
  }
  const user = await db.user.findUnique({ where: { id: req.params.id } });
  res.json(user);
});
A02:暗号化の失敗
// BAD - Weak hashing
import crypto from 'crypto';
const hash = crypto.createHash('md5').update(password).digest('hex');

// GOOD - Use bcrypt with proper rounds
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12);
const isValid = await bcrypt.compare(password, hash);
A03:インジェクション
// BAD - SQL injection
const query = `SELECT * FROM users WHERE email = '${email}'`;

// GOOD - Parameterized queries (Prisma handles this automatically)
const user = await prisma.user.findUnique({ where: { email } });

// GOOD - Parameterized raw SQL when needed
const users = await prisma.$queryRaw`SELECT * FROM users WHERE email = ${email}`;
A07:クロスサイトスクリプティング(XSS)
// BAD - Rendering raw HTML
element.innerHTML = userInput;

// GOOD - Use textContent or framework escaping
element.textContent = userInput;

// GOOD - React auto-escapes by default
return <div>{userInput}</div>;

// BAD in React - dangerouslySetInnerHTML
return <div dangerouslySetInnerHTML={{ __html: userInput }} />;

コンテンツセキュリティポリシー(CSP)

推奨ヘッダー
// Next.js middleware
import { NextResponse } from 'next/server';

export function middleware(request: Request) {
  const nonce = crypto.randomUUID();
  const csp = [
    `default-src 'self'`,
    `script-src 'self' 'nonce-${nonce}'`,
    `style-src 'self' 'unsafe-inline'`,
    `img-src 'self' data: https:`,
    `font-src 'self'`,
    `connect-src 'self' https://api.example.com`,
    `frame-ancestors 'none'`,
    `base-uri 'self'`,
    `form-action 'self'`,
  ].join('; ');

  const response = NextResponse.next();
  response.headers.set('Content-Security-Policy', csp);
  response.headers.set('X-Content-Type-Options', 'nosniff');
  response.headers.set('X-Frame-Options', 'DENY');
  response.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
  response.headers.set('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
  return response;
}

SAST/DAST ツール

静的解析(SAST)
ツール言語用途
ESLint セキュリティプラグインJS/TSeslint-plugin-security、@microsoft/eslint-plugin-sdl
Semgrep複数semgrep --config=auto .
BanditPythonbandit -r src/
gosecGogosec ./...
cargo-auditRustcargo audit
動的解析(DAST)
ツール目的用途
OWASP ZAPWeb アプリのスキャンプロキシベースのスキャナー、API スキャンモード
Nuclei脆弱性スキャンテンプレートベースのスキャナー
Burp Suite手動+自動プロフェッショナルな侵入テスト
依存関係のスキャン
# Node.js
npm audit
npm audit fix

# Python
pip-audit
safety check

# Go
govulncheck ./...

# Rust
cargo audit

入力検証パターン

サーバーサイドの検証(常に必須)
import { z } from 'zod';

const CreateUserSchema = z.object({
  email: z.string().email().max(255),
  name: z.string().min(1).max(100).regex(/^[a-zA-Z\s'-]+$/),
  age: z.number().int().min(0).max(150).optional(),
});

function createUser(input: unknown) {
  const validated = CreateUserSchema.parse(input);
  // validated is now typed and safe
}
レート制限
import rateLimit from 'express-rate-limit';

const authLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 5, // 5 attempts per window
  message: 'Too many login attempts, please try again later',
  standardHeaders: true,
  legacyHeaders: false,
});

app.use('/api/auth/login', authLimiter);

セキュリティチェックリスト

  • すべてのユーザー入力をサーバーサイドで検証する
  • すべてのデータベース操作にパラメーター化クエリを使用する
  • CSP ヘッダーを設定する
  • 認証エンドポイントにレート制限を設ける
  • CORS を適切に制限する
  • シークレットはコードではなく環境変数に保存する
  • 依存関係をスキャンして脆弱性を確認する
  • 認証トークンを httpOnly Cookie に保存する
  • 本番環境で HTTPS を強制する
  • エラーメッセージから内部の詳細情報を漏らさない

関連リソース

  • ~/.claude/docs/reference/checklists/security-hardening.md - セキュリティ強化チェックリスト
  • ~/.claude/agents/security-auditor.md - セキュリティ監査エージェント
  • ~/.claude/skills/authentication-patterns/SKILL.md - 認証パターン

デフォルトでセキュアに。境界で検証する。多層防御を実施する。

コメント