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

php-thinkphp-audit

ThinkPHPフレームワークの一般的な脆弱性(認証、CSRF、テンプレート、ORM書き込み、設定露出など)を特定し、一般的な脆弱性タイプにマッピングして静的セキュリティ監査を行うためのツールです。

📜 元の英語説明(参考)

ThinkPHP 框架特效安全审计工具。针对 ThinkPHP 常见的鉴权/CSRF/模板转义/ORM 写入(Mass Assignment)/调试与配置暴露等机制进行白盒静态审计,并映射到通用漏洞类型体系(AUTH/CSRF/TPL/XSS/LOGIC/CFG/SESS/SQL 等)。

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

一言でいうと

ThinkPHPフレームワークの一般的な脆弱性(認証、CSRF、テンプレート、ORM書き込み、設定露出など)を特定し、一般的な脆弱性タイプにマッピングして静的セキュリティ監査を行うためのツールです。

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

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

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

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

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

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して php-thinkphp-audit.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → php-thinkphp-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-thinkphp-audit

PHP ThinkPHP フレームワークセキュリティ監査(php-thinkphp-audit)

ThinkPHP プロジェクトのソースコードにおける「フレームワーク特有のセキュリティメカニズム」と典型的な落とし穴のパターンを分析し、以下の点に重点を置きます。

  • 認証/権限制御(auth モジュール、コントローラー/ミドルウェア gate)
  • CSRF token メカニズムとスキップパス
  • ThinkPHP テンプレートエンジンの自動エスケープと raw 出力のリスク
  • ORM/Model 層の書き込み経路に起因する Mass Assignment(allowField/シナリオ検証)
  • データベースネイティブ式/生 SQL 注入の入り口(汎用 SQL クラスのリスクにマッピング)
  • debug/例外出力とセキュリティ設定スイッチ(CFG にマッピング)

入力

ユーザーが提供するもの:

  • source_path:ThinkPHP プロジェクトのルートディレクトリ オプション:
  • output_path:出力ディレクトリパス(デフォルト {source_path}_audit

出力ディレクトリ

以下に出力されます。

{output_path}/framework_audit/
  thinkphp_{timestamp}.md

フレームワーク識別(必須)

ThinkPHP であることを証明する証拠点を提示する必要があります。

  • 依存関係の証拠:composer.jsontopthink/think-* または thinkphp/think-* 関連の依存関係が含まれていること
  • エントリポイントの証拠:public/index.php または同等のフロントエンドエントリポイント
  • 設定の証拠:config/ ディレクトリに ThinkPHP の設定ファイル(例:app.phpdatabase.phpmiddleware.php など、プロジェクトの実情による)が存在すること
  • 実行ディレクトリの証拠:runtime/ ディレクトリ構造(存在する場合)

リスクタイプマッピング(必須)

すべての発見について、以下を明記する必要があります。

  • 汎用タイプコード:AUTH / CSRF / XSS / TPL / LOGIC / CFG / SESS / SQL など(あなたの統一タイプコードから選択)
  • マッピング理由:なぜそのタイプコードに分類されるのか(マッピングロジックを1文で説明)

必須監査リスト(必須:各項目をチェックし、結果を出力)

1) 認証と権限制御(AUTH)

以下を特定し、出力する必要があります。

  • 認証エントリポイント:コントローラーミドルウェア/フィルター、基底クラス Controller/Behavior、ルーティング層権限ミドルウェア
  • auth モジュールの使用:ThinkPHP の auth 関連機能(例:Auth/RBAC/ロール権限検証関数または同等のカプセル化)を使用しているか
  • 権限検証のパラメータソース:リソース ID/ユーザー ID がどこから来るか(ルーティングパラメータ/リクエスト body/セッション)、および帰属検証が行われているか

判定ルール:

  • 「ログイン状態のみを判断し、リソースの帰属/ロールの細分化が不足している」と判明した場合、AUTH リスクを出力します。
  • 「権限検証が一部の分岐で欠落/異常後にバイパスされている」と判明した場合、AUTH または LOGIC リスクを出力します。

2) CSRF 防御(CSRF)

以下を特定し、出力する必要があります。

  • CSRF token の有効化位置:設定項目/ミドルウェア/フォーム生成ロジック
  • token の受信フィールド:body/header のどのフィールドから来るか(プロジェクトの実情による)
  • token 検証ロジック:検証関数/ミドルウェアのエントリポイントと失敗処理(return/throw して状態変更を阻止するか)
  • スキップルール:どのルーティング、どのリクエストメソッド、またはどのシナリオで CSRF 検証をスキップするか

判定ルール:

  • スキップルールが存在するが、状態変更インターフェースをカバーしている場合 => CSRF リスク
  • token 検証が失敗してもビジネスロジックが実行され続ける場合(例:例外が飲み込まれる)=> CSRF リスク

3) テンプレートエンジンのエスケープと raw 出力(XSS/TPL)

以下を特定し、出力する必要があります。

  • テンプレート自動エスケープポリシー:テンプレート構文がデフォルトでエスケープされるか、グローバルに無効になっているか
  • raw 出力/エスケープスキップ構文:例として、テンプレートに raw/|raw または同等のメカニズムが存在するか(プロジェクトの実情のテンプレートエンジンバージョンと使用法による)
  • ユーザー入力がテンプレート変数に入るか:変数がどこから来るか(request/session/db)、および HTML/JS/属性コンテキストに直接連結されているか

判定ルール:

  • raw 出力変数が制御可能でエスケープされていない場合 => XSS または TPL にマッピング(式/実行チェーンが関与する場合)

4) ORM 書き込み経路(LOGIC:Mass Assignment)

以下を特定し、出力する必要があります。

  • 入力取得:request->param() / request->all() / $this->request->post() / 同等の構造全体をモデル書き込みに渡しているか
  • モデル書き込み点:Model::create/save/update$model->save($data)、一括代入動作
  • 許可フィールドポリシー:allowField/field/シナリオ(scenario)または同等のホワイトリストメカニズムが設定されているか

判定ルール:

  • 入力全体が書き込まれ、モデルに機密フィールドの deny/allow 制約が不足している場合 => LOGIC リスク
  • 許可フィールドのホワイトリストが存在するが、高リスクフィールドが含まれている場合 => LOGIC リスク

5) データベースネイティブ式/生 SQL リスク(SQL)

以下を特定し、出力する必要があります。

  • ネイティブ SQL エントリポイント:Db::query($sql)Db::execute($sql)whereRaworderRawbuildExpression など(プロジェクトの実情による)
  • ユーザー入力がネイティブ式に入る証拠:連結、テンプレート置換、文字列結合点
  • パラメータ化/バインディングポリシーが存在するか:->bind/placeholder/prepare など(プロジェクトの実情による)

判定ルール:

  • ユーザー入力が文字列連結のネイティブ SQL 式に入る場合 => SQL リスク

6) セキュリティ設定とデバッグ露出(CFG/SESS)

以下を特定し、出力する必要があります。

  • debug/例外出力:app_debugtrace、エラーページ出力ポリシー、ログレベル(プロジェクトの実情による)
  • cookie/session セキュリティパラメータ:プロジェクト設定ファイルが可視の場合(HttpOnly/Secure/SameSite など)、SESS/CFG リスクマッピングを出力

判定ルール:

  • 本番環境で debug が有効/スタックトレースが返される場合 => CFG リスク

可観測 PoC(必須:フレームワーク特有の可観測検証フレームワーク)

以下のいずれか2つ以上を提示し、観察点を明確に記述してください。

  • AUTH:低権限ユーザーで保護されていると思われる action をリクエストし、アクセスが成功するか/ビジネス上の副作用が発生するかを観察
  • CSRF:状態変更ルーティングに対して、CSRF token が欠落または誤っているリクエストを構築し、阻止が返されるか/ビジネスが実行され続けるかを観察

PoC 出力要件:

  • 実際のルーティング/コントローラー action を含める必要があります(ルーティングマッピングまたはコードエントリポイントの証拠から抽出)
  • token フィールド名/検証に必要なフィールドを含める必要があります(プロジェクトの実情のフィールド名で出力)
  • 観察点(HTTP ステータスコード、応答内容の特徴、ビジネス上の副作用の有無)を説明する必要があります

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

  • [ ] 出力内容:ThinkPHP 識別証拠 + AUTH/CSRF/テンプレート出力/ORM 書き込み/データベースネイティブエントリポイント/デバッグ設定の6つの主要なチェック結果
  • [ ] 各リスクには以下が含まれます:マッピングタイプコード + 位置の証拠 + 可観測検証フレームワーク + 修正提案
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

PHP ThinkPHP 框架安全审计(php-thinkphp-audit)

分析 ThinkPHP 项目源码中的“框架特效安全机制”和典型踩坑模式,重点覆盖:

  • 鉴权/权限控制(auth 模块、控制器/中间件 gate)
  • CSRF token 机制与跳过路径
  • ThinkPHP 模板引擎的自动转义与 raw 输出风险
  • ORM/Model 层写入链路导致的 Mass Assignment(allowField/场景校验)
  • 数据库原生表达式/原始 SQL 注入入口(映射到通用 SQL 类风险)
  • debug/异常输出与安全配置开关(映射到 CFG)

输入

用户提供:

  • source_path:ThinkPHP 项目根目录 可选:
  • output_path:输出目录路径(默认 {source_path}_audit

输出目录

输出到:

{output_path}/framework_audit/
  thinkphp_{timestamp}.md

框架识别(必做)

必须给出证据点证明识别为 ThinkPHP:

  • 依赖证据:composer.jsontopthink/think-*thinkphp/think-* 相关依赖
  • 入口证据:public/index.php 或等价前端入口
  • 配置证据:config/ 目录存在 ThinkPHP 配置文件(如 app.phpdatabase.phpmiddleware.php 等,按项目实际)
  • 运行目录证据:runtime/ 目录结构(若存在)

风险类型映射(必做)

每条发现都必须写明:

  • 通用类型码:AUTH / CSRF / XSS / TPL / LOGIC / CFG / SESS / SQL 等(从你的统一类型码里选)
  • 映射原因:为什么落到该类型码(用一句话解释映射逻辑)

必审清单(必做:逐项检查并输出结果)

1) 鉴权与权限控制(AUTH)

必须定位并输出:

  • 鉴权入口:控制器中间件/过滤器、基类 Controller/Behavior、路由层权限中间件
  • auth 模块使用:是否使用 ThinkPHP 的 auth 相关能力(如 Auth/RBAC/角色权限校验函数或等价封装)
  • 权限校验的参数来源:资源 ID/用户 ID 来自哪里(路由参数/请求 body/会话),以及是否做归属校验

判定规则:

  • 发现“只判断登录态但缺少资源归属/角色细分”则输出 AUTH 风险
  • 发现“权限校验在某些分支缺失/异常后绕过”则输出 AUTH 或 LOGIC 风险

2) CSRF 防护(CSRF)

必须定位并输出:

  • CSRF token 的启用位置:配置项/中间件/表单生成逻辑
  • token 的接收字段:来自 body/header 的哪个字段(按项目实际)
  • token 校验逻辑:校验函数/中间件入口与失败处理(是否 return/throw 并阻断状态变更)
  • 跳过规则:哪些路由、哪些请求方法或哪些场景跳过 CSRF 校验

判定规则:

  • 存在跳过规则但覆盖到了状态变更接口 => CSRF 风险
  • token 校验失败但仍继续执行业务(例如异常被吞掉)=> CSRF 风险

3) 模板引擎转义与 raw 输出(XSS/TPL)

必须定位并输出:

  • 模板自动转义策略:模板语法是否默认转义、是否全局关闭
  • raw 输出/跳过转义语法:例如模板中存在 raw/|raw 或等价机制(按项目实际模板引擎版本与用法)
  • 用户输入进入模板变量:变量从哪里来(request/session/db),以及是否被直接拼到 HTML/JS/属性上下文

判定规则:

  • 若 raw 输出变量可控且未转义 => 映射到 XSS 或 TPL(若涉及表达式/执行链)

4) ORM 写入链路(LOGIC:Mass Assignment)

必须定位并输出:

  • 输入获取:是否把 request->param() / request->all() / $this->request->post() / 等价结构整体传入模型写入
  • 模型写入点:Model::create/save/update$model->save($data)、批量赋值行为
  • 允许字段策略:是否配置 allowField/field/场景(scenario)或等价白名单机制

判定规则:

  • 输入整体写入且模型缺少敏感字段 deny/allow 约束 => LOGIC 风险
  • 存在允许字段白名单但仍包含高风险字段 => LOGIC 风险

5) 数据库原生表达式/原始 SQL 风险(SQL)

必须定位并输出:

  • 原生 SQL 入口:Db::query($sql)Db::execute($sql)whereRaworderRawbuildExpression 等(按项目实际)
  • 用户输入进入原生表达式的证据:拼接、模板替换、字符串拼装点
  • 是否存在参数化/绑定策略:->bind/placeholder/prepare 等(按项目实际)

判定规则:

  • 用户输入进入字符串拼接的原生 SQL 表达式 => SQL 风险

6) 安全配置与调试暴露(CFG/SESS)

必须定位并输出:

  • debug/异常输出:app_debugtrace、错误页输出策略、日志级别(按项目实际)
  • cookie/session 安全参数:若项目配置文件可见(HttpOnly/Secure/SameSite 等),输出 SESS/CFG 风险映射

判定规则:

  • 生产 debug 开启/堆栈回显 => CFG 风险

可观测 PoC(必做:框架特效可观测验证框架)

至少给出以下两类之一并写清观察点:

  • AUTH:使用低权限用户请求疑似受保护 action,观察是否成功访问/是否发生业务副作用
  • CSRF:对状态变更路由构造缺失或错误 CSRF token 的请求,观察是否返回阻断与业务是否仍执行

PoC 输出要求:

  • 必须包含真实路由/控制器 action(从你的路由映射或代码入口证据中抽取)
  • 必须包含 token 字段名/校验所需字段(按项目实际字段名输出)
  • 必须说明观察点(HTTP 状态码、响应内容特征、业务副作用是否发生)

输出完整性检查(强制)

  • [ ] 输出包含:ThinkPHP 识别证据 + AUTH/CSRF/模板输出/ORM 写入/数据库原生入口/调试配置 六大块检查结果
  • [ ] 每条风险都有:映射类型码 + 位置证据 + 可观测验证框架 + 修复建议