jpskill.com
🛠️ 開発・MCP コミュニティ

php-sql-audit

PHPのWebソースコードからSQLインジェクションの脆弱性を特定し、リスク分析、PoCの生成、および修正提案を行うためのツールです。

📜 元の英語説明(参考)

PHP Web 源码 SQL 注入漏洞审计工具。从源码中识别所有 SQL 执行点并分析注入风险,输出可利用性分级、PoC 与修复建议(禁止省略)。

🇯🇵 日本人クリエイター向け解説

一言でいうと

PHPのWebソースコードからSQLインジェクションの脆弱性を特定し、リスク分析、PoCの生成、および修正提案を行うためのツールです。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o php-sql-audit.zip https://jpskill.com/download/6017.zip && unzip -o php-sql-audit.zip && rm php-sql-audit.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/6017.zip -OutFile "$d\php-sql-audit.zip"; Expand-Archive "$d\php-sql-audit.zip" -DestinationPath $d -Force; ri "$d\php-sql-audit.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して php-sql-audit.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → php-sql-audit フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-17
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

[Skill 名] php-sql-audit

PHP SQL 注入監査(php-sql-audit)

PHP プロジェクトのソースコードを分析し、SQL 実行関連コード(PDO/mysqli/ORM)を特定します。ユーザー入力から SQL 構築点までを追跡し、SQL インジェクションの有無を検証し、完全な脆弱性レポートを出力します。

CRITICAL:省略の禁止と誤検知の禁止

  • ルートパラメータに現れるすべての文字列ソース(GET/POST/Body/パラメータフィールド)が SQL に入るパスを監査する必要があります。
  • 「データフロー追跡証拠」を使用して悪用可能性を判断する必要があります。キーワード推測のみに頼ってはいけません。
  • 省略を禁止します。いかなるプレースホルダーも省略してはなりません。完全な脆弱性証拠チェーンと修正提案を出力する必要があります。

分類と番号付け

  • 詳細については、shared/SEVERITY_RATING.md を参照してください。
  • 脆弱性番号:{C/H/M/L}-SQL-{連番}

入力依存

少なくとも以下のものがあることを推奨します(shared/IO_PATH_CONVENTION.md と一致します。パイプラインをマージする際は、総レポートの同等の章を読み込むだけで構いません):

  • routes_{timestamp}.md(独立して保存される場合は通常 route_mapping/routes_{timestamp}.md
  • params_{timestamp}.md(独立して保存される場合は通常 route_mapping/params_{timestamp}.md) オプションですが推奨:
  • route_tracer/ の出力。パラメータの実際の使用状況を正確に判断するために使用します。

SQL シンクの識別(必須)

  1. PDO / PDOStatement
    • 比較的危険:$pdo->query($sql) / $pdo->exec($sql)($sql が連結/ユーザー入力を含む場合)
    • 形式チェック:$pdo->prepare($sql) は、$sql でプレースホルダーを使用し、その後の bindParam/bindValue または正しいパラメータ渡しがある場合にのみ安全です。
    • ORM/DB ラッパー:DB::select(DB::raw({value}))、Doctrine createQuery など
  2. mysqli / mysqli_stmt
    • mysqli_query($conn, $sql) の連結は危険です。
    • mysqli_prepare は、prepare + bind が正しく行われた場合にのみ安全である可能性があります。
  3. 典型的な危険な構築パターン(必須)
    • SQL 文字列と変数の連結:., sprintf, vsprintf, implode/join + SQL キーワード
    • 動的ソート:order by $x / ORDER BY ".$x."(一般的な高リスク)

tracer をトリガーする必要がある条件(必須)

いずれかの条件を満たす場合、php-route-tracer(または同等の追跡証拠)を呼び出す必要があります。

  • パラメータが多層に渡されたり、JSON デコード後にフィールドが SQL に入る場合
  • SQL 構築点が基底クラス/ユーティリティクラス/親関数にある場合
  • 分岐条件(if/try/catch)が存在し、SQL の実行が不確実な場合

レポート出力

出力先:

{output_path}/vuln_audit/
└── sql_{timestamp}.md

脆弱性レポート項目テンプレート(必須)

### [{等級プレフィックス}-SQL-{連番}] {リスクタイトル}

| 項目 | 情報 |
|------|------|
| 深刻度 | {🔴/🟠/🟡/🔵} (CVSS {score}) |
| 到達可能性 (R) | {0-3} - {理由} |
| 影響範囲 (I) | {0-3} - {理由} |
| 悪用複雑度 (C) | {0-3} - {理由} |
| 悪用可能性 | ✅ 確認済み / ⚠️ 検証待ち / ❌ 悪用不可 / 🔍 環境依存 |
| 位置 | {file}:{line} ({Function/Class}) |

#### データフローチェーン(Source → Sink)
(ルートごとに一行ずつ記述:リクエストパラメータの読み取り -> 変数への代入/連結/変換 -> 分岐 -> SQL 実行点。省略禁止)

#### 悪用可能な前提条件
- 認証要件:{不要/ログイン必要/特定権限必要}
- 入力制御可能性:{完全に制御可能/条件付きで制御可能/制御不可}
- トリガー条件:{分岐/例外/環境依存}

#### 証拠引用(必須:php-route-tracer から)
SQL の疑わしい脆弱性ごとに、trace 出力の `## 9) Sink Evidence Type Checklist` の **SQL 行**に対応する証拠要点を個別に引用する必要があります(状態が検証待ちであっても、証拠引用は必須です):
1. `EVID_SQL_EXEC_POINT`:SQL 実行関数/ステートメントの位置(trace の SQL 実行点証拠に対応)
2. `EVID_SQL_STRING_CONSTRUCTION`:SQL 文字列の構築/連結位置(trace の SQL 連結証拠に対応)
3. `EVID_SQL_USER_PARAM_TO_SQL_FRAGMENT`:ユーザー制御可能なパラメータから SQL フラグメントへのマッピング(trace の制御可能性マトリックスフィールド証拠に対応)

#### tracer 証拠欠落の処理(必須)
- 上記 1~3 のいずれかの重要な証拠要点が見つからない場合、その脆弱性の状態は `⚠️検証待ち` としかマークできず、直接 `✅悪用可能と確認済み` とすることはできません。

#### 検証 PoC(必須、実行可能なリクエスト)
```http
{HTTP Method} {完全なパスとクエリ/Body} HTTP/1.1
Host: {host}
{必要な Header/Session/JWT/Cookie}

{Payload}

修正提案

  • 安全な記述の要点(PDO prepare + bind と、SQL フラグメントにユーザー入力を連結しないことの保証)を提示します。
  • 同様の連結点をすべて特定するためのコード検索ステートメント(rg/grep スタイル)を提示します。

出力完全性チェック(必須)

  • [ ] 少なくとも以下を出力します:リスク統計 + 各脆弱性の完全な項目
  • [ ] いかなる省略プレースホルダーも出現しません。
  • [ ] 各脆弱性には以下が含まれます:データフローチェーン、悪用可能な前提条件、実行可能な PoC、修正提案。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

PHP SQL 注入审计(php-sql-audit)

分析 PHP 项目源码,识别 SQL 执行相关代码(PDO/mysqli/ORM),追踪用户输入到 SQL 构造点,验证是否存在 SQL 注入,并输出完整漏洞报告。

CRITICAL:禁止省略与禁止误报

  • 必须审计所有在路由参数中出现的字符串来源(GET/POST/Body/参数字段)进入 SQL 的路径
  • 必须使用“数据流追踪证据”判定可利用性;不得只靠关键字猜测
  • 禁止省略:不得出现任何省略占位符;必须输出完整的漏洞证据链与修复建议

分级与编号

  • 详见:shared/SEVERITY_RATING.md
  • 漏洞编号:{C/H/M/L}-SQL-{序号}

输入依赖

建议至少有(与 shared/IO_PATH_CONVENTION.md 一致;合并流水线时读总报告中等价章节即可):

  • routes_{timestamp}.md(独立落盘时常为 route_mapping/routes_{timestamp}.md
  • params_{timestamp}.md(独立落盘时常为 route_mapping/params_{timestamp}.md) 可选但推荐:
  • route_tracer/ 输出,用于精准判定参数实际使用状态

SQL Sink 识别(必做)

  1. PDO / PDOStatement
    • 相对危险:$pdo->query($sql) / $pdo->exec($sql)(若 $sql 来自拼接/包含用户输入)
    • 形式检查:$pdo->prepare($sql) 只有在 $sql 中使用占位符且后续 bindParam/bindValue 或正确传参时更安全
    • ORM/DB 包装:DB::select(DB::raw({value}))、Doctrine createQuery
  2. mysqli / mysqli_stmt
    • mysqli_query($conn, $sql) 拼接危险
    • mysqli_prepare 只有 prepare + bind 正确时才可能安全
  3. 典型危险构造模式(必做)
    • SQL 字符串与变量拼接:., sprintf, vsprintf, implode/join + SQL 关键字
    • 动态排序:order by $x / ORDER BY ".$x."(常见高危)

需要触发 tracer 的条件(必做)

满足任一条时必须调用 php-route-tracer(或同等追踪证据):

  • 参数经过多层传递或 JSON 解码后取字段进入 SQL
  • SQL 构造点位于基类/工具类/父函数中
  • 存在分支条件(if/try/catch)导致 SQL 是否执行不确定

报告输出

输出到:

{output_path}/vuln_audit/
└── sql_{timestamp}.md

漏洞报告条目模板(强制)

### [{等级前缀}-SQL-{序号}] {风险标题}

| 项目 | 信息 |
|------|------|
| 严重等级 | {🔴/🟠/🟡/🔵} (CVSS {score}) |
| 可达性 (R) | {0-3} - {理由} |
| 影响范围 (I) | {0-3} - {理由} |
| 利用复杂度 (C) | {0-3} - {理由} |
| 可利用性 | ✅ 已确认 / ⚠️ 待验证 / ❌ 不可利用 / 🔍 环境依赖 |
| 位置 | {file}:{line} ({Function/Class}) |

#### 数据流链(Source → Sink)
(按路由逐行写出:请求参数读取 -> 变量赋值/拼接/转换 -> 分支 -> SQL 进入执行点。禁止省略)

#### 可利用前置条件
- 鉴权要求:{无需/需登录/需特定权限}
- 输入可控性:{完全可控/条件可控/不可控}
- 触发条件:{分支/异常/环境依赖}

#### 证据引用(强制:来自 php-route-tracer)
每条 SQL 疑似漏洞必须逐项引用 trace 输出中 `## 9) Sink Evidence Type Checklist` 的 **SQL 行**对应证据要点(允许状态为待验证,但证据引用必须存在):
1. `EVID_SQL_EXEC_POINT`:SQL 执行函数/语句位置(对应 trace 的 SQL 执行点证据)
2. `EVID_SQL_STRING_CONSTRUCTION`:SQL 字符串构造/拼接位置(对应 trace 的 SQL 拼接证据)
3. `EVID_SQL_USER_PARAM_TO_SQL_FRAGMENT`:用户可控参数到 SQL 片段的映射(对应 trace 的可控性矩阵字段证据)

#### tracer 证据缺失处理(强制)
- 若无法定位上述 1~3 任一关键证据要点:该漏洞状态只能标记为 `⚠️待验证`,不得直接给出 `✅已确认可利用`。

#### 验证 PoC(强制,可执行请求)
```http
{HTTP Method} {完整路径与查询/Body} HTTP/1.1
Host: {host}
{必要 Header/Session/JWT/Cookie}

{Payload}

建议修复

  • 给出安全写法要点(PDO prepare + bind 且保证 SQL 片段不拼接用户输入)
  • 给出代码搜索语句(rg/grep 风格)用于定位所有同类拼接点

输出完整性检查(强制)

  • [ ] 至少输出:风险统计 + 每条漏洞完整条目
  • [ ] 不出现任何省略占位符
  • [ ] 每条漏洞都包含:数据流链、可利用前置条件、可执行 PoC、修复建议