🛠️ 開発・MCP コミュニティ
security-ops
セキュリティレビューやOWASPガイドラインに基づき、XSS、SQLインジェクションなどの脆弱性対策を支援するSkill。
📜 元の英語説明(参考)
Security patterns and OWASP guidelines. Triggers on: security review, OWASP, XSS, SQL injection, CSRF, authentication, authorization, secrets management, input validation, secure coding.
🇯🇵 日本人クリエイター向け解説
一言でいうと
セキュリティレビューやOWASPガイドラインに基づき、XSS、SQLインジェクションなどの脆弱性対策を支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-17
- 取得日時
- 2026-05-17
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
セキュリティパターン
ウェブアプリケーションに不可欠なセキュリティパターンです。
OWASP Top 10 クイックリファレンス
| 順位 | 脆弱性 | 対策 |
|---|---|---|
| A01 | アクセス制御の不備 | サーバー側で権限を確認し、デフォルトで拒否する |
| A02 | 暗号化の失敗 | TLSを使用し、パスワードをハッシュ化し、機密データを暗号化する |
| A03 | インジェクション | パラメータ化されたクエリを使用し、入力を検証する |
| A04 | 安全でない設計 | 脅威モデリング、セキュアなデフォルト設定 |
| A05 | セキュリティ設定の不備 | 設定を強化し、未使用の機能を無効にする |
| A06 | 脆弱なコンポーネント | 依存関係を更新し、定期的に監査する |
| A07 | 認証の失敗 | MFA、レート制限、セキュアなセッション管理 |
| A08 | データ整合性の失敗 | 署名を検証し、信頼できるソースを使用する |
| A09 | ロギングの失敗 | セキュリティイベントをログに記録し、ログを保護する |
| A10 | SSRF | URLを検証し、宛先を許可リストに登録する |
入力検証
# 誤り - ユーザー入力を信頼する
def search(query):
return db.execute(f"SELECT * FROM users WHERE name = '{query}'")
# 正しい - パラメータ化されたクエリ
def search(query):
return db.execute("SELECT * FROM users WHERE name = ?", [query])
検証ルール
常に検証する項目:
- 型 (文字列、整数、メール形式)
- 長さ (最小/最大範囲)
- 範囲 (数値の範囲)
- 形式 (パターンに対する正規表現)
- 許可リスト (既知の良好な値)
決して信頼しない項目:
- URLパラメータ
- フォームデータ
- HTTPヘッダー
- クッキー
- ファイルアップロード
出力エンコーディング
// 誤り - 直接HTMLを挿入する
element.innerHTML = userInput;
// 正しい - テキストコンテンツ (自動的にエスケープされる)
element.textContent = userInput;
// 正しい - エスケープを伴うテンプレート
render(`<div>${escapeHtml(userInput)}</div>`);
コンテキストによるエンコーディング
| コンテキスト | エンコーディング |
|---|---|
| HTML本文 | HTMLエンティティエンコード |
| HTML属性 | 属性エンコード + クォート |
| JavaScript | JSエンコード |
| URLパラメータ | URLエンコード |
| CSS | CSSエンコード |
認証
# パスワードハッシュ化 (bcrypt、argon2、または scrypt を使用)
import bcrypt
def hash_password(password: str) -> bytes:
return bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))
def verify_password(password: str, hashed: bytes) -> bool:
return bcrypt.checkpw(password.encode(), hashed)
認証チェックリスト
- [ ] bcrypt/argon2でパスワードをハッシュ化する (コストファクター12以上)
- [ ] ログインにレート制限を実装する
- [ ] 安全なセッショントークンを使用する (ランダムで長いもの)
- [ ] 安全なクッキーフラグを設定する (HttpOnly, Secure, SameSite)
- [ ] 失敗した試行後にアカウントロックアウトを実装する
- [ ] 機密性の高い操作にMFAをサポートする
認可
# 誤り - 認証のみを確認する
@login_required
def delete_post(post_id):
post = Post.get(post_id)
post.delete()
# 正しい - 認可を確認する
@login_required
def delete_post(post_id):
post = Post.get(post_id)
if post.author_id != current_user.id and not current_user.is_admin:
raise Forbidden("Not authorized to delete this post")
post.delete()
シークレット管理
# 誤り - ハードコードされたシークレット
API_KEY = "sk-1234567890abcdef"
# 正しい - 環境変数
API_KEY = os.environ["API_KEY"]
# より良い - シークレットマネージャー
API_KEY = secrets_client.get_secret("api-key")
シークレット取り扱いルール
すべきこと:
- 環境変数またはシークレットマネージャーを使用する
- シークレットを定期的にローテーションする
- 環境ごとに異なるシークレットを使用する
- シークレットへのアクセスを監査する
すべきでないこと:
- シークレットをgitにコミットする
- シークレットをログに記録する
- エラーメッセージにシークレットを含める
- シークレットをプレーンテキストで共有する
セキュリティヘッダー
Content-Security-Policy: default-src 'self'; script-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), camera=()
クイックセキュリティ監査
# ハードコードされたシークレットを見つける
rg -i "(password|secret|api_key|token)\s*=\s*['\"][^'\"]+['\"]" --type py
# SQLインジェクションのリスクを見つける
rg "execute\(f['\"]|format\(" --type py
# eval/execの使用を見つける
rg "\b(eval|exec)\s*\(" --type py
# TODOセキュリティ項目をチェックする
rg -i "TODO.*security|FIXME.*security"
追加リソース
./references/owasp-detailed.md- OWASP Top 10 の詳細./references/auth-patterns.md- JWT、OAuth、セッション管理./references/crypto-patterns.md- 暗号化、ハッシュ化、署名./references/secure-headers.md- HTTPセキュリティヘッダーガイド
スクリプト
./scripts/security-scan.sh- クイックセキュリティ grep パターン./scripts/dependency-audit.sh- 脆弱な依存関係のチェック
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Security Patterns
Essential security patterns for web applications.
OWASP Top 10 Quick Reference
| Rank | Vulnerability | Prevention |
|---|---|---|
| A01 | Broken Access Control | Check permissions server-side, deny by default |
| A02 | Cryptographic Failures | Use TLS, hash passwords, encrypt sensitive data |
| A03 | Injection | Parameterized queries, validate input |
| A04 | Insecure Design | Threat modeling, secure defaults |
| A05 | Security Misconfiguration | Harden configs, disable unused features |
| A06 | Vulnerable Components | Update dependencies, audit regularly |
| A07 | Auth Failures | MFA, rate limiting, secure session management |
| A08 | Data Integrity Failures | Verify signatures, use trusted sources |
| A09 | Logging Failures | Log security events, protect logs |
| A10 | SSRF | Validate URLs, allowlist destinations |
Input Validation
# WRONG - Trust user input
def search(query):
return db.execute(f"SELECT * FROM users WHERE name = '{query}'")
# CORRECT - Parameterized query
def search(query):
return db.execute("SELECT * FROM users WHERE name = ?", [query])
Validation Rules
Always validate:
- Type (string, int, email format)
- Length (min/max bounds)
- Range (numeric bounds)
- Format (regex for patterns)
- Allowlist (known good values)
Never trust:
- URL parameters
- Form data
- HTTP headers
- Cookies
- File uploads
Output Encoding
// WRONG - Direct HTML insertion
element.innerHTML = userInput;
// CORRECT - Text content (auto-escapes)
element.textContent = userInput;
// CORRECT - Template with escaping
render(`<div>${escapeHtml(userInput)}</div>`);
Encoding by Context
| Context | Encoding |
|---|---|
| HTML body | HTML entity encode |
| HTML attribute | Attribute encode + quote |
| JavaScript | JS encode |
| URL parameter | URL encode |
| CSS | CSS encode |
Authentication
# Password hashing (use bcrypt, argon2, or scrypt)
import bcrypt
def hash_password(password: str) -> bytes:
return bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))
def verify_password(password: str, hashed: bytes) -> bool:
return bcrypt.checkpw(password.encode(), hashed)
Auth Checklist
- [ ] Hash passwords with bcrypt/argon2 (cost factor 12+)
- [ ] Implement rate limiting on login
- [ ] Use secure session tokens (random, long)
- [ ] Set secure cookie flags (HttpOnly, Secure, SameSite)
- [ ] Implement account lockout after failed attempts
- [ ] Support MFA for sensitive operations
Authorization
# WRONG - Check only authentication
@login_required
def delete_post(post_id):
post = Post.get(post_id)
post.delete()
# CORRECT - Check authorization
@login_required
def delete_post(post_id):
post = Post.get(post_id)
if post.author_id != current_user.id and not current_user.is_admin:
raise Forbidden("Not authorized to delete this post")
post.delete()
Secrets Management
# WRONG - Hardcoded secrets
API_KEY = "sk-1234567890abcdef"
# CORRECT - Environment variables
API_KEY = os.environ["API_KEY"]
# BETTER - Secrets manager
API_KEY = secrets_client.get_secret("api-key")
Secret Handling Rules
DO:
- Use environment variables or secrets manager
- Rotate secrets regularly
- Use different secrets per environment
- Audit secret access
DON'T:
- Commit secrets to git
- Log secrets
- Include secrets in error messages
- Share secrets in plain text
Security Headers
Content-Security-Policy: default-src 'self'; script-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), camera=()
Quick Security Audit
# Find hardcoded secrets
rg -i "(password|secret|api_key|token)\s*=\s*['\"][^'\"]+['\"]" --type py
# Find SQL injection risks
rg "execute\(f['\"]|format\(" --type py
# Find eval/exec usage
rg "\b(eval|exec)\s*\(" --type py
# Check for TODO security items
rg -i "TODO.*security|FIXME.*security"
Additional Resources
./references/owasp-detailed.md- Full OWASP Top 10 details./references/auth-patterns.md- JWT, OAuth, session management./references/crypto-patterns.md- Encryption, hashing, signatures./references/secure-headers.md- HTTP security headers guide
Scripts
./scripts/security-scan.sh- Quick security grep patterns./scripts/dependency-audit.sh- Check for vulnerable dependencies