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

php-logging-audit

PHPのWebセキュリティログを分析し、セキュリティイベントの漏れやログ改ざんのリスクを特定し、改善策を提案するSkill。

📜 元の英語説明(参考)

PHP Web 安全日志与监控审计工具。识别安全事件缺失、敏感信息写入日志、日志注入/伪造风险,以及日志与告警链路缺陷,并输出可利用性分级、可观测 PoC 与修复建议(禁止省略)。

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

一言でいうと

PHPのWebセキュリティログを分析し、セキュリティイベントの漏れやログ改ざんのリスクを特定し、改善策を提案するSkill。

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

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

🎯 この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-17
同梱ファイル
1

📖 Skill本文(日本語訳)

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

[スキル名] php-logging-audit

PHP セキュリティログと監視の監査(php-logging-audit)

PHP プロジェクトにおける「セキュリティの可観測性」に関するコードと設定の欠陥を分析します。主な目的は「ログを記録すべきか否か」を一般化することではなく、具体的な問題を特定することです。例えば、攻撃者が入力によってログを汚染できるか、システムが機密情報をログに書き込んでいるか、重要なセキュリティイベントが欠落しているか、そしてアラート/監査チェーンが破壊されているか、といった点です。

分類と番号付け

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

適用範囲(必須:各項目をチェックし、証拠を出力すること)

このスキルは、以下の4種類の欠陥をカバーし、それぞれについて「証拠点 + 影響 + 悪用可能性分析 + 修正推奨事項」を提供する必要があります。

1) セキュリティイベント監査の欠落(Audit Gap)

欠落しているセキュリティイベントのログポイントを特定します。例えば(プロジェクトの実際の入口に基づきます):

  • ログイン失敗/成功とアカウント列挙に関連する失敗原因の記録(機密情報の漏洩を避けるため)
  • 権限拒否/権限昇格の試行(拒否原因は抽象化して記録可能)
  • パスワードリセット、メールアドレス変更、管理者ロール変更、2FA変更などの重要なアカウントイベント
  • 機密性の高い操作(データのエクスポート、キーのダウンロード、権限の削除/変更、一括インポート)
  • CSRF検証失敗、セッション失効、ログアウト成功などのセキュリティ関連の状態変化

出力要件:

  • 「どのようなイベントを記録すべきか」(ソースコードで特定した機能点にマッピングして)
  • 「実際にログが書き込まれる場所が存在するか/迂回されているか」(証拠を提示)
  • 欠落によって生じる現実的な結果の推論(例:監査が利用できない、事後追跡が不可能、アラートがトリガーされない)

2) ログへの機密情報書き込み(Sensitive Data in Logs)

機密データをログに書き込む可能性のあるすべてのパスを特定します。

  • Authorization ヘッダー、Cookie、session_id、JWT の原文
  • パスワード/検証コード/リカバリートークン/ワンタイムパスワード
  • ユーザーのプライバシーデータが失敗スタックやデバッグ出力でそのまま出力される
  • リクエストボディ/パラメーター(特にキーフィールドを含むもの)をログメッセージに直接連結する

出力要件:

  • 機密情報のソース(どの変数/リクエストフィールドから来るか)
  • ログ書き込みの呼び出し点とメッセージの構築方法
  • ログの保存媒体(ファイルパス/システムログチャネル/ログライブラリ)

3) ログインジェクションと偽造(Log Injection / Forging)

「ユーザーが制御可能な文字列がログメッセージに入力されるが、制御文字のサニタイズが行われていない」問題を特定します。

  • \r / \n がログメッセージに入り、ログ行が分割される
  • タイムスタンプ、レベル、リクエストパスなどの「偽の項目」が偽造される可能性がある
  • ログ形式が JSON またはキーバリューペアを使用している場合、エスケープの欠陥によって構造が破壊される可能性がないか確認する

出力要件:

  • どのフィールドが制御可能か(GET/POST/Headers/Body/Cookie)
  • インジェクションの入り口(ログメッセージの連結点)
  • フィルタリング/正規化が存在するか(特に改行と制御文字の処理)

4) ログとアラートチェーンの欠陥(Monitoring & Alert Gaps)

監視チェーンのギャップを特定します(コード/設定で証明できるものに限る)。

  • 重要なセキュリティイベントが debug/info レベルでしか記録されず、アラート可能なチャネルに入っていない
  • ログレベルとアラートルールの欠落(例:本番環境でセキュリティアラートチャネルがオフになっている)
  • エラー処理が例外を飲み込み、重要なイベントが書き込まれない

出力要件:

  • ソースコードで特定したログレベル/チャネル/ハンドラー設定の証拠
  • これらの証拠がどのようにアラートのトリガー不能や重要な証拠の取得不能につながるか

識別ロジック(必須)

ログ書き込みシンク(コード)

以下のログ関連 API を特定する必要があります(プロジェクトの実際のものに置き換えてください):

  • PHP:error_log({value})
  • システム:syslog({value})
  • PSR-3/フレームワーク:->info({value}) ->warning({value}) ->error({value}) ->critical({value}) ->debug({value})
  • Laravel/Symfony/カスタムラッパー:Log::{value}({value})logger->{value} またはプロジェクト独自のロガーラッパー
  • Monolog:Monolog\Logger およびハンドラー/チャネル関連の設定

メッセージ構築と制御可能性(データフロー)

各ログ書き込み点について、少なくとも1つのチェーンを追跡する必要があります。

  • ソース(リクエストフィールド/ユーザー入力/機密トークンのソース) -> 中間変数処理(連結、フォーマット、json_encode、テンプレート文字列) -> シンク(最終的にログに書き込まれるメッセージパラメーター)

そして、以下を出力します。

  • 制御可能なフィールド名(または JSON パス)
  • ログに入る前にサニタイズが行われているか(改行/制御文字/機密フィールドの匿名化)
  • 「特定のブランチのみログを書き込む」という条件分岐があるか(ログ書き込みの迂回)

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

「ログの欠陥」はログ出力を観察する必要があるため、可観測な PoC フレームワーク(実行可能または手動で検証可能)を提供する必要があります。少なくとも以下の2種類のいずれかを含めてください。

  • 実際のルートを使用してログ書き込みをトリガーし、ログに表示されるフィールド/形式の期待される変化を説明する
  • 構築されたペイロードを使用して改行/制御文字を注入し、ログが分割されるか、偽造された断片が出現するかの期待される結果を説明する

PoC 出力要件:

  • 実際のルートを含める必要があります(routes_{timestamp}.md から優先的に置き換える。独立したファイルは route_mapping/routes_{timestamp}.md を参照。規約は shared/IO_PATH_CONVENTION.md を参照)。
  • トリガーに使用するリクエストヘッダーとボディ/パラメーターを記述する必要があります(少なくともログメッセージに入る制御可能なフィールドを1つ含む)。
  • ログファイル/コンソール/システムログで何を観察すべきかを明確に説明する必要があります(例:特定のフィールドがそのまま表示されるか)。

レポート出力

出力先:

{output_path}/vuln_audit/logging_{timestamp}.md

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

各脆弱性は以下の構造に従う必要があります(省略不可):

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

| 項目 | 情報 |
|------|------|
| 深刻度 | {🔴/🟠/🟡/🔵} (CVSS {スコア}) |
| 可達性 (R) | {0-3} - {理由} |
| 影響範囲 (I) | {0-3} - {理由} |
| 利用複雑度 (C) | {0-3} - {理由} |
| 悪用可能性 | ✅ 確認済み / ⚠️ 検証待ち / ❌ 悪用不可 / 🔍 環境依存 |
| 位置 | {ファイル}:{行} ({関数/クラス}) |

#### 脆弱性タイプと証拠点
- 欠陥カテゴリ:{Audit Gap / Sensitive Data in Logs / Log Injection / Monitoring Gap}
- 証拠点 A(ログ書き込み呼び出し点):{ファイル}:{行} 説明
- 証拠点 B(メッセージ構築/制御可能フィールドの入り口):{ファイル}:{行} 説明
- 証拠点 C(サニタイズ/匿名化の有無):{ファイル}:{行} 説明(ない場合は「匿名化未発見/フィルタリング未発見」と記述し、検索結果を提示)

#### データフローチェーン(Source -> Transform -> Sink)
(一行ずつ記述:リクエスト入力がどのように読み取られ/解析され/フォーマットされるか -> ログメッセージに入るか -> 最終的にログに書き込まれるか)

#### 悪用可能な前提条件
- 認証要件:{不要/ログイン必要/特定権限必要}
- 入力制御可能性:{完全に制御可能/条件付きで制御可能/制御不可}
- トリガー条件:{分岐/エラーパス/例外パス/ログレベル条件}
- 可観測性:{ログの保存場所が読み取り可能か/本番環境で可視か/運用権限が必要か}

#### 検証 PoC(必須、可観測)
```http
{HTTP メソッド} {実際のルートと完全なパラメーター} HTTP/1.1
Host: {ホスト}
{必要なヘッダー/セッション/JWT/Cookie}

{ペイロード}

(PoC の後、観察すべきログ現象:{期待されるログ内容/形式の変化/改行による分割の有無を明確に記述})

推奨される修正

  • 安全な記述の要点:機密フィールドの匿名化、制御文字のサニタイズ、構造化ロギング、ログレベルとアラートのマッピング
  • コード検索クエリ:rg を使用して、すべてのログ書き込みとメッセージ構築に関連するコードブロックを特定する

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

  • [ ] 各脆弱性には、番号、等級、位置、データフローチェーン、悪用可能な前提条件、可観測 PoC、修正推奨事項が含まれていること
  • [ ] ログインジェクションタイプの問題では、制御文字ペイロード(少なくとも改行インジェクションのシナリオを含む)を明確に使用すること
  • [ ] 機密情報タイプの問題では、機密フィールドのソースと書き込み位置を明確に指摘すること
  • [ ] 監査欠落タイプの問題では、「記録すべきだが記録されていない」という対照ロジックを明確に指摘すること(ソースコードのイベント点に基づいて推論し、一般的な議論ではないこと)
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

PHP 安全日志与监控审计(php-logging-audit)

分析 PHP 项目在“安全可观测性”方面的代码与配置缺陷。核心目标不是泛化“要不要打日志”,而是识别可落地的问题:攻击者可否通过输入污染日志、系统是否把敏感信息写入日志、关键安全事件是否缺失、以及告警/审计链是否被破坏。

分级与编号

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

覆盖范围(必做:必须逐项检查并输出证据)

本 skill 必须覆盖下列四类缺陷,并为每一类给出“证据点 + 影响 + 可利用性分析 + 修复建议”:

1) 安全事件审计缺失(Audit Gap)

识别缺失的安全事件日志点,例如(以项目实际入口为准):

  • 登录失败/成功与账号枚举相关失败原因记录(避免泄露敏感细节)
  • 权限拒绝/越权尝试(拒绝原因可抽象化记录)
  • 密码重置、邮箱变更、管理员角色变更、2FA 变更等关键账户事件
  • 敏感操作(导出数据、下载密钥、删除/修改权限、批量导入)
  • CSRF 校验失败、会话失效、注销成功等安全相关状态变化

要求输出:

  • “应当记录哪些事件”(按你在源码里识别到的功能点映射)
  • “实际写日志的位置是否存在/是否被绕过”(给出证据)
  • 缺失导致的真实后果推演(例如审计不可用、事后无法追溯、告警无法触发)

2) 敏感信息写入日志(Sensitive Data in Logs)

识别任何可能把敏感数据写入日志的路径:

  • Authorization 头、Cookie、session_id、JWT 原文
  • 密码/验证码/恢复 token/一次性口令
  • 用户隐私数据在失败栈或 debug 输出中被原样打印
  • 将请求体/参数(尤其是包含密钥字段)直接拼进日志消息

要求输出:

  • 敏感信息来源(来自哪些变量/请求字段)
  • 写日志的调用点与 message 构造方式
  • 日志的落地介质(文件路径/系统日志通道/日志库)

3) 日志注入与伪造(Log Injection / Forging)

识别“用户可控字符串进入日志消息但未做控制字符净化”的问题:

  • \r / \n 进入日志消息导致日志行拆分
  • 可能造成伪造时间戳、级别、请求路径等“假条目”
  • 若日志格式使用 JSON 或键值对,检查是否存在转义缺陷造成结构被破坏

要求输出:

  • 哪些字段可控(GET/POST/Headers/Body/Cookie)
  • 注入进入点(日志 message 拼接点)
  • 是否存在过滤/归一化(尤其是换行与控制字符处理)

4) 日志与告警链路缺陷(Monitoring & Alert Gaps)

识别监控链路缺口(以代码/配置能证明的为准):

  • 关键安全事件只记录 debug/info,未进入可告警通道
  • 日志级别与告警规则缺失(例如 production 关闭了安全告警 channel)
  • 错误处理吞掉异常导致关键事件没有被写入

要求输出:

  • 你在源码里定位到的日志级别/通道/handler 配置证据
  • 这些证据如何导致告警无法触发或取不到关键证据

识别逻辑(必做)

日志写入 Sink(代码)

必须识别以下日志相关 API(按项目实际替换):

  • PHP:error_log({value})
  • 系统:syslog({value})
  • PSR-3/框架:->info({value}) ->warning({value}) ->error({value}) ->critical({value}) ->debug({value})
  • Laravel/Symfony/自定义封装:Log::{value}({value})logger->{value} 或项目自己的 logger wrapper
  • Monolog:Monolog\Logger 及 handler/channel 相关配置

消息构造与可控性(数据流)

对每个日志写入点,必须追踪至少一条链:

  • Source(请求字段/用户输入/敏感 token 来源) -> 中间变量处理(拼接、格式化、json_encode、模板字符串) -> Sink(最终写入日志的 message 参数)

并输出:

  • 可控字段名(或 JSON 路径)
  • 进入日志前是否有净化(换行/控制字符/敏感字段脱敏)
  • 是否有条件分支导致“只有某些分支才写日志”(写日志绕过)

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

由于“日志缺陷”往往需要观察日志输出,你必须给出可观测 PoC 框架(可执行或可手动验证),至少包括以下两类其一:

  • 使用真实路由触发日志写入,并说明预期日志中出现的字段/格式变化
  • 使用构造 payload 注入换行/控制字符,说明预期日志会被拆行或出现伪造片段

PoC 输出要求:

  • 必须包含真实路由(优先从 routes_{timestamp}.md 替换;独立落盘见 route_mapping/routes_{timestamp}.md,约定见 shared/IO_PATH_CONVENTION.md
  • 必须写出用于触发的请求头与 body/参数(至少包含一个会进入日志消息的可控字段)
  • 必须说明你要在日志文件/控制台/系统日志中观察什么(例如某字段是否原样出现)

报告输出

输出到:

{output_path}/vuln_audit/logging_{timestamp}.md

漏洞条目模板(强制)

每条漏洞必须遵循以下结构(不得省略):

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

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

#### 漏洞类型与证据点
- 缺陷类别:{Audit Gap / Sensitive Data in Logs / Log Injection / Monitoring Gap}
- 证据点 A(日志写入调用点):{file}:{line} 说明
- 证据点 B(消息构造/可控字段进入点):{file}:{line} 说明
- 证据点 C(净化/脱敏是否存在):{file}:{line} 说明(如无则写“未发现脱敏/未发现过滤”并给出搜索结论)

#### 数据流链(Source -> Transform -> Sink)
(逐行写出:请求输入如何被读取/解析/格式化 -> 是否进入日志 message -> 最终写入日志)

#### 可利用前置条件
- 鉴权要求:{无需/需登录/需特定权限}
- 输入可控性:{完全可控/条件可控/不可控}
- 触发条件:{分支/错误路径/异常路径/日志级别条件}
- 可观测性:{日志落地位置是否可读/是否在生产可见/是否需要运维权限}

#### 验证 PoC(强制,可观测)
```http
{HTTP Method} {真实路由与完整参数} HTTP/1.1
Host: {host}
{必要 Header/Session/JWT/Cookie}

{Payload}

(PoC 之后你需要观察的日志现象:{明确写出预期日志内容/格式变化/是否出现换行拆分})

建议修复

  • 安全写法要点:敏感字段脱敏、控制字符净化、structured logging、日志级别与告警映射
  • 代码搜索语句:使用 rg 定位所有日志写入与 message 构造相关代码块

输出完整性检查(强制)

  • [ ] 每条漏洞都包含:编号、等级、位置、数据流链、可利用前置条件、可观测 PoC、修复建议
  • [ ] 日志注入类问题必须明确使用控制字符 payload(至少包含换行注入场景)
  • [ ] 敏感信息类问题必须明确指出敏感字段来源与写入位置
  • [ ] 审计缺失类问题必须明确指出“应该记录但未记录”的对照逻辑(基于源码事件点推断,而不是泛泛而谈)