php-auth-audit
PHP Webソースコードから認証・認可の実装を特定し、セキュリティリスクを分析して、脆弱性や修正案を提示するSkill。
📜 元の英語説明(参考)
PHP Web 源码鉴权机制审计工具。从源码中识别所有认证/鉴权实现并分析风险,输出路由-鉴权映射与漏洞分析(含 PoC 与修复建议)。
🇯🇵 日本人クリエイター向け解説
PHP Webソースコードから認証・認可の実装を特定し、セキュリティリスクを分析して、脆弱性や修正案を提示するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o php-auth-audit.zip https://jpskill.com/download/5996.zip && unzip -o php-auth-audit.zip && rm php-auth-audit.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/5996.zip -OutFile "$d\php-auth-audit.zip"; Expand-Archive "$d\php-auth-audit.zip" -DestinationPath $d -Force; ri "$d\php-auth-audit.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
php-auth-audit.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
php-auth-auditフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 この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-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
[スキル名] php-auth-audit
PHP 認証メカニズム監査(Auth Audit)
PHP Web プロジェクトのソースコードを分析し、認証および認可の経路を特定し、各ルートの認証状態を判断し、認証バイパス/権限昇格/IDOR のリスクを検出します。
CRITICAL:完全な分析(必須)
php-route-mapperに出現するすべてのルートを処理する必要があります。- 認証チェーン(Session/JWT/ミドルウェア/カスタム検証関数)を特定する必要があります。
- ルートと認証のマッピングテーブルを出力する必要があります(省略なし)。
- すべての疑わしい点について、以下の情報を提供する必要があります:位置の証拠 + データフローチェーン + 悪用可能性分析 + 検証 PoC + 修正提案。
実行モード(必須:パイプラインフェーズと整合)
このスキルは、"trace が生成される前に EVID_* を参照できない"という問題を解決するために、2つのモードをサポートしています。
-
STATIC_MAPPING(パイプラインフェーズ 1 で推奨)auth_mapping_{timestamp}.mdのみを生成します(およびオプションでauth_README_{timestamp}.md)。php-route-tracerのEVID_*証拠点参照が欠落していても構いません。- 認証状態の分類(✅/⚠️/❌/❓)と P0/P1 バケットの根拠(PoC は不要)を提供する必要があります。
-
TRACE_AUDIT(パイプラインフェーズ 4 で推奨、trace が既に存在する場合)- 完全な
auth_audit_report_{timestamp}.mdを生成し、trace 契約のEVID_*証拠点を強制的に個別に参照します。 - PoC/修正提案はすべて揃っている必要があります。
- 完全な
脆弱性分類
詳細は shared/SEVERITY_RATING.md を参照してください。
入力依存
推奨される入力(shared/IO_PATH_CONVENTION.md と一致;パイプラインを統合する際は、総レポートの同等セクションを読み込みます):
routes_{timestamp}.md(独立してディスクに保存される場合は通常route_mapping/routes_{timestamp}.md)params_{timestamp}.md(独立してディスクに保存される場合は通常route_mapping/params_{timestamp}.md)
オプション:
source_path
認証実装の特定(必須)
フレームワークごとに特定します:
- Laravel:
middleware('auth'|'can'|'role:')Auth::check()/Auth::user()- Policies/Gates:
Gate::allows、->can({value}) - ルート保護:
Route::middleware([{value}])->group({value})
- Symfony:
- security.yaml / access_control
denyAccessUnlessGranted、isGranted- voter/policy
- ネイティブ PHP:
session_start+$_SESSION判断if (!isset($_SESSION['user']))/requireLogin()- カスタム関数:
checkAuth/authorize/hasRole/isAdmin
ルートと認証のマッピング(必須)
各ルートについて、以下の状態を出力します:
- ✅ 公開:明示的に許可されており、認証チェックなし
- ✅ 保護済み:完全な認証/認可チェックが存在
- ⚠️ 認証のみ:ログイン状態のみを検証し、ロール/リソースレベルの認可なし
- ❌ 認証なし:認証経路が一切ヒットしない
- ❓ 不明:動的な権限/複雑なカスタムロジックにより判断が困難(それでも証拠点を記述する必要があります)
また、リスクタイプとして AUTH を出力します。これには以下が含まれます:
- 認証バイパス(ログイン状態の検証がバイパスされる)
- 認可バイパス/権限昇格(ロール検証の欠落または誤り)
- IDOR(オブジェクトアクセスにおける所有権/帰属検証の欠落)
疑わしいパターンの検出(必須、証拠チェーンを提供)
1) パス/URI の不一致による認証バイパス
PHP での一般的な根本原因:
- 元の
$_SERVER['REQUEST_URI']またはparse_urlの結果を使用してホワイトリストマッチングを行うが、パスが正規化されていない - エンコーディング/大文字小文字/重複スラッシュ/末尾文字の違いによりマッチングが失敗する(実際のルートは保護されたハンドラに入る)
出力必須:
- ホワイトリストチェックの位置とコードスニペット
- バイパスリクエスト(PoC)とヒットしたハンドラの証拠
2) ログイン状態のみを検証し、ロール/リソース認可が欠落している
出力必須:
- ルートの「認証チェック」位置
- 「認可チェックの欠落」位置(例:
user!=nullの判断後に直接機密操作を実行する場合)
3) IDOR/権限昇格
出力必須:
- 機密オブジェクト ID の取得元(GET/POST/URL)
- クエリ/更新に使用される「帰属検証」の有無(WHERE 句に user_id/owner_id が含まれているか)
- 未検証の理由と到達可能性
レポート出力(実行モード別)
出力先:
{output_path}/auth_audit/
├── auth_audit_report_{timestamp}.md
├── auth_mapping_{timestamp}.md
└── auth_README_{timestamp}.md
強制ルール:
STATIC_MAPPING:auth_mapping_{timestamp}.mdを生成する必要があります。auth_audit_report_{timestamp}.mdは省略するか、空のシェルを生成できます(その場合、「バケットマッピングのみ、trace 証拠なし」と明記します)。TRACE_AUDIT:完全な3つのファイルを生成する必要があり、trace 証拠点がすべて揃っている必要があります。
ファイル1:メインレポート auth_audit_report_{timestamp}.md
内容:
- 認証フレームワークの特定(バージョン/実装の証拠を含む)
- 認証アーキテクチャの概要(ミドルウェア/関数/ハンドラ)
- リスク統計
- 各リスクの完全な脆弱性構造(番号/分類/データフロー/PoC/修正)
ファイル2:マッピングテーブル auth_mapping_{timestamp}.md
ルートと認証状態、必要なロール/条件のみをリストします(脆弱性の詳細な分析は含めません)。 ただし、バケットフィールドを新たに追加する必要があります(パイプラインフェーズ 3 でのルーティング選択用):
p_bucket:P0またはP1P0:❌ 認証なしP1:⚠️ 認証のみ、または認証バイパス/権限昇格/IDOR リスクが検出された場合(認証状態が「認証のみ」と表示されていても、p1_reasonで P1 に分類された理由を説明する必要があります)
p1_reason:短い静的根拠(例:「ログイン状態のみ、hasRole/authorize が欠落しているか、owner_id 検証が欠落している」)
ファイル3:説明ドキュメント auth_README_{timestamp}.md
方法論、ツール、検証ガイドラインのみを説明し、具体的な脆弱性の詳細は含みません。
PoC 検証テンプレート(必須)
少なくとも以下のシナリオを区別する必要があります:
- 未ログインアクセス(cookie/session/JWT なし)
- 一般ユーザーアクセス(一般アカウントの cookie/JWT)
- 管理者/高権限との比較(該当する場合)
PoC は実行可能な HTTP リクエストコードブロックである必要があり、ルートパスは実際のルーティングルールを使用する必要があります。
証拠参照(実行モード別必須)
STATIC_MAPPING:trace のEVID_*証拠点の参照は強制されません(認証分類と P0/P1 バケットの根拠のみを出力します)。TRACE_AUDIT:各認証リスクの疑いについて、trace 出力からの証拠を個別に参照する必要があります(状態を「検証待ち」とマークすることは許可されますが、証拠参照は存在する必要があります):
EVID_AUTH_PATH_PROTECTED_MATCH:ルートが保護されたハンドラに入るパスマッチングの証拠(trace の分岐パス証拠に対応)EVID_AUTH_TOKEN_DECODE_JUDGMENT:ログイン状態/トークンデコード結果がどのように判断されたかの証拠(trace の session/JWT 読み取りと条件分岐に対応)EVID_AUTH_PERMISSION_CHECK_EXEC:権限判断関数または条件文(例:hasRole/authorize)の実行証拠(trace シンク特定または分岐証拠)EVID_AUTH_IDOR_OWNERSHIP_CONDITION:IDOR 帰属検証(WHERE/条件)に owner_id/user_id が含まれているかの証拠(trace の最終クエリ条件または状態更新文)
tracer 証拠欠落の処理(必須)
STATIC_MAPPING:適用されません(バケットの根拠は静的コードの証拠に基づきます)。TRACE_AUDIT:trace 契約の検証が失敗した場合、または 1~4 のいずれかの重要な証拠点を特定できない場合:そのリスクは⚠️検証待ちとマークされるだけであり、✅悪用可能と確認済みまたは「バイパス可能と確定」という結論を出すことはできません。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
PHP 鉴权机制审计(Auth Audit)
分析 PHP Web 项目源码,识别认证与授权链路,判断每条路由的鉴权状态,并检测鉴权绕过/越权/IDOR 风险。
CRITICAL:完整分析(强制)
- 必须处理所有在
php-route-mapper中出现的路由 - 必须识别认证链:Session/JWT/中间件/自定义校验函数
- 必须输出路由-鉴权映射表(不做省略)
- 对所有可疑点给出:位置证据 + 数据流链 + 可利用性分析 + 验证 PoC + 修复建议
运行模式(强制:与流水线阶段对齐)
此技能支持两种模式,用于解决“尚未生成 trace 之前无法引用 EVID_*”的问题:
-
STATIC_MAPPING(推荐用于流水线阶段 1)- 只生成
auth_mapping_{timestamp}.md(以及可选的auth_README_{timestamp}.md) - 允许缺少
php-route-tracer的EVID_*证据点引用 - 必须给出:鉴权状态分级(✅/⚠️/❌/❓)与 P0/P1 分桶依据(不需要 PoC)
- 只生成
-
TRACE_AUDIT(推荐用于流水线阶段 4,trace 已存在)- 生成完整的
auth_audit_report_{timestamp}.md,并强制逐条引用 trace 契约中的EVID_*证据点 - PoC/修复建议必须齐全
- 生成完整的
漏洞分级
详见:shared/SEVERITY_RATING.md
输入依赖
建议输入(与 shared/IO_PATH_CONVENTION.md 一致;合并流水线时读总报告中等价章节):
routes_{timestamp}.md(独立落盘时常为route_mapping/routes_{timestamp}.md)params_{timestamp}.md(独立落盘时常为route_mapping/params_{timestamp}.md)
可选:
source_path
识别鉴权实现(必做)
按框架识别:
- Laravel:
middleware('auth'|'can'|'role:')Auth::check()/Auth::user()- Policies/Gates:
Gate::allows、->can({value}) - 路由保护:
Route::middleware([{value}])->group({value})
- Symfony:
- security.yaml / access_control
denyAccessUnlessGranted、isGranted- voter/policy
- 原生 PHP:
session_start+$_SESSION判断if (!isset($_SESSION['user']))/requireLogin()- 自定义函数:
checkAuth/authorize/hasRole/isAdmin
路由-鉴权映射(必做)
对每条路由输出以下状态:
- ✅ 公开:显式允许,无鉴权检查
- ✅ 受保护:存在完整认证/授权检查
- ⚠️ 仅认证:只校验登录态,无角色/资源级授权
- ❌ 无鉴权:没有任何鉴权链路命中
- ❓ 不确定:动态权限/复杂自定义逻辑导致难判(仍必须写出证据点)
并输出风险类型:AUTH,包括:
- 认证绕过(登录态校验被绕过)
- 授权绕过/越权(角色校验缺失或错误)
- IDOR(对象访问缺少所有权/归属校验)
可疑模式检测(必做,给出证据链)
1) 路径/URI 匹配导致鉴权绕过
在 PHP 中常见根因:
- 用原始
$_SERVER['REQUEST_URI']或parse_url结果做白名单匹配,但路径未规范化 - 编码/大小写/重复斜杠/尾部字符差异导致匹配失败(实际路由进入受保护 handler)
必须输出:
- 白名单检查位置与代码片段
- 绕过请求(PoC)与命中的 handler 证据
2) 仅校验登录态,缺少角色/资源授权
必须输出:
- 路由的“认证检查”位置
- “授权检查缺失”位置(例如只判断
user!=null后直接执行敏感操作)
3) IDOR/越权
必须输出:
- 敏感对象 id 来自哪里(GET/POST/URL)
- 用于查询/更新的“归属校验”是否存在(WHERE 里是否包含 user_id/owner_id)
- 未校验的原因与可达性
报告输出(按运行模式)
输出到:
{output_path}/auth_audit/
├── auth_audit_report_{timestamp}.md
├── auth_mapping_{timestamp}.md
└── auth_README_{timestamp}.md
强制规则:
STATIC_MAPPING:必须生成auth_mapping_{timestamp}.md;auth_audit_report_{timestamp}.md可以省略或生成空壳(并标注:仅分桶映射,不含 trace 证据)TRACE_AUDIT:必须生成完整三文件,并要求 trace 证据点齐全
文件1:主报告 auth_audit_report_{timestamp}.md
包含:
- 鉴权框架识别(含版本/实现证据)
- 鉴权架构概览(middleware/函数/handler)
- 风险统计
- 每条风险的完整漏洞结构(编号/分级/数据流/PoC/修复)
文件2:映射表 auth_mapping_{timestamp}.md
只列路由与鉴权状态、所需角色/条件(不要放漏洞详细分析)。 但必须新增分桶字段(用于流水线阶段 3 选路):
p_bucket:P0或P1P0:❌ 无鉴权P1:⚠️ 仅认证,或检测到存在授权绕过/越权/IDOR 风险(即使鉴权状态显示为“仅认证”,也要在p1_reason里说明为什么进入 P1)
p1_reason:一段简短静态依据(如“仅登录态,缺少 hasRole/authorize 或缺少 owner_id 校验”)
文件3:说明文档 auth_README_{timestamp}.md
只说明方法论、工具与验证指南,不包含具体漏洞细节。
PoC 验证模板(强制)
必须区分至少以下场景:
- 未登录访问(无 cookie/session/JWT)
- 普通用户访问(普通账号 cookie/JWT)
- 管理员/高权限对照(如适用)
PoC 必须是可执行 HTTP 请求代码块,并且路由路径必须使用真实路由规则。
证据引用(按运行模式强制)
STATIC_MAPPING:不强制引用 trace 的EVID_*证据点(只需输出鉴权分级与 P0/P1 分桶依据)。TRACE_AUDIT:每条疑似鉴权风险必须逐项引用 trace 输出中的证据(允许状态标记为待验证,但证据引用必须存在):
EVID_AUTH_PATH_PROTECTED_MATCH:路由进入受保护 handler 的路径匹配证据(对应 trace 的分支路径证据)EVID_AUTH_TOKEN_DECODE_JUDGMENT:登录态/Token 解码结果如何被判断的证据(对应 trace 中 session/JWT 读取与条件分支)EVID_AUTH_PERMISSION_CHECK_EXEC:权限判断函数或条件语句(如hasRole/authorize)的执行证据(trace sink 定位或分支证据)EVID_AUTH_IDOR_OWNERSHIP_CONDITION:IDOR 归属校验(WHERE/条件)是否包含 owner_id/user_id 的证据(trace 中最终查询条件或状态更新语句)
tracer 证据缺失处理(强制)
STATIC_MAPPING:不适用(分桶依据以静态代码证据为准)。TRACE_AUDIT:若 trace 契约校验失败或无法定位 1~4 任一关键证据点:该风险只能标记为⚠️待验证,不得给出✅已确认可利用或“确定可绕过”的结论。