AgentSkillsCN

web-security

Web 应用程序的安全设计与实现指南(不依赖于任何框架)。涵盖输入校验、注入防护、同源策略、安全头信息、依赖关系管理、密钥管理以及安全日志等核心内容。适用于漏洞评审、安全设计以及代码评审中安全视角的确认等场景。

SKILL.md
--- frontmatter
name: web-security
description: Web アプリケーションのセキュリティ設計・実装ガイド(フレームワーク非依存)。入力バリデーション、インジェクション対策、オリジン制御、セキュリティヘッダ、依存関係管理、シークレット管理、セキュリティログをカバー。脆弱性レビュー、セキュリティ設計、コードレビューのセキュリティ観点確認時に使用。

Web セキュリティガイド

Web アプリのセキュリティ設計・実装のフレームワーク非依存ガイド。認証/認可の設計は auth-design を参照。

セキュリティの基本原則

code
1. 多層防御(Defense in Depth): 単一の対策に依存しない
2. 最小権限の原則: 必要最小限のアクセス権のみ付与
3. デフォルト拒否: 明示的に許可されたもの以外は拒否
4. フェイルセキュア: エラー時は安全側に倒す
5. 入力は信頼しない: すべての外部入力を検証

入力バリデーション

原則

code
- サーバーサイドで必ず検証(クライアントのみは不十分)
- 許可リスト方式(拒否リスト方式は漏れが生じやすい)
- 型チェック + 長さ制限 + 範囲チェック + 形式検証
- 文字エンコーディングの正規化

ファイルアップロード

code
- 拡張子の許可リスト
- Content-Type の検証(拡張子だけでなくマジックバイトも確認)
- ファイルサイズ制限
- 保存先パスのサニタイズ(パストラバーサル防止)
- アップロード先はWebルート外に配置

インジェクション対策

脅威対策
SQL インジェクションパラメータ化クエリ、ORM の適切な使用、動的クエリ構築の回避
XSS出力エスケープ、CSP ヘッダー、innerHTML 回避、HTTPOnly Cookie
コマンドインジェクションシェル実行の回避、やむを得ない場合はエスケープ + 許可リスト
パストラバーサルパス正規化、ベースディレクトリ外アクセス防止
CSRFトークンベースの検証、SameSite Cookie、Origin ヘッダー検証

詳細: references/owasp-top10.md

オリジン制御

CORS 設計

code
原則:
- Access-Control-Allow-Origin に * は本番で使わない
- 許可するオリジンを明示的に列挙
- credentials 使用時は具体的なオリジンが必須
- preflight キャッシュ(Access-Control-Max-Age)を適切に設定

設定項目:
- Allow-Origin: 許可するオリジン
- Allow-Methods: 許可する HTTP メソッド
- Allow-Headers: 許可するリクエストヘッダー
- Expose-Headers: クライアントがアクセス可能なレスポンスヘッダー

CSRF 対策

code
対策の組み合わせ:
1. SameSite Cookie 属性(Lax or Strict)
2. CSRF トークン(フォーム送信)
3. Origin / Referer ヘッダーの検証
4. カスタムヘッダーの要求(API リクエスト)

セキュリティヘッダー

ヘッダー目的推奨値
Content-Security-PolicyXSS 防止リソースの読み込み元を制限
Strict-Transport-SecurityHTTPS 強制max-age=31536000; includeSubDomains
X-Content-Type-OptionsMIME スニッフィング防止nosniff
X-Frame-Optionsクリックジャッキング防止DENY or SAMEORIGIN
Referrer-Policyリファラー情報制御strict-origin-when-cross-origin
Permissions-Policyブラウザ機能制御必要な機能のみ許可

詳細: references/security-headers.md

依存関係の脆弱性管理

code
方針:
- ロックファイルを必ずバージョン管理に含める
- 定期的な脆弱性スキャン(CI に組み込む)
- 依存パッケージは最小限に
- メジャーバージョンアップはテスト付きで行う
- セキュリティアドバイザリの監視

自動化:
- GitHub Dependabot / Renovate で自動更新
- npm audit / pip audit / govulncheck を CI に組み込み

シークレット管理

code
原則:
- ソースコードにシークレットを含めない
- .env ファイルはバージョン管理に含めない(.env.example のみ)
- 環境変数 or シークレットマネージャーで管理
- ログにシークレットを出力しない
- 定期的なキーローテーション
- アクセスログの記録

検出:
- pre-commit フックでシークレットパターンを検出
- CI でのシークレットスキャン

セキュリティログ

code
記録すべきイベント:
- 認証の成功/失敗
- 認可の失敗(アクセス拒否)
- 入力バリデーション失敗
- 予期しないエラー
- 管理操作の実行

記録してはいけないもの:
- パスワード(平文/ハッシュ含む)
- トークン・セッションID
- 個人情報(マスキングする)
- クレジットカード番号

ログの設計:
- 構造化ログ(JSON 形式)
- タイムスタンプ(UTC)
- リクエスト ID での追跡
- ログレベルの適切な使い分け

エラーハンドリング(セキュリティ観点)

code
原則:
- 内部エラーの詳細をクライアントに露出しない
- スタックトレースは本番で非表示
- 一般的なエラーメッセージを返す
- 詳細はサーバーログに記録
- fail-secure: エラー時は安全側に倒す

アンチパターン:
- ❌ "ユーザー名が見つかりません" → 攻撃者にユーザー存在を教える
- ✅ "認証情報が正しくありません" → 情報を限定

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

詳細: references/security-review-checklist.md

必須確認事項

  • すべての外部入力がサーバーサイドで検証されている
  • パラメータ化クエリまたは ORM を使用している
  • 出力時のエスケープが行われている
  • CSRF 対策が実装されている
  • 認証・認可チェックがすべてのエンドポイントにある
  • セキュリティヘッダーが設定されている
  • シークレットがソースコードに含まれていない
  • エラーメッセージが内部情報を露出していない
  • 依存パッケージに既知の脆弱性がない
  • ファイルアップロードが適切に制限されている

リファレンス