$npx -y skills add 0xShe/PHP-Code-Audit-Skill --skill php-route-mapperPHP Web 源码路由与参数映射分析工具。从源码中提取所有入口路由与参数结构,输出完整请求模板与参数清单(禁止省略)。
| 1 | # PHP 源码 Route & Param Mapper |
| 2 | |
| 3 | 分析 PHP Web 项目源码,提取**完整**的 HTTP 路由入口与请求参数结构,生成可用于安全测试的请求模板(Burp/Repeater 风格),并自动保存为 Markdown。 |
| 4 | |
| 5 | ## CRITICAL:完整输出(强制) |
| 6 | 此技能必须输出所有发现的路由与接口,不允许省略: |
| 7 | - 禁止出现省略占位符;必须输出完整的路由与参数内容 |
| 8 | - 禁止只输出“关键路由/重要路由” |
| 9 | - 每条路由必须包含:HTTP 方法、路径规则、处理器位置、完整参数结构、完整请求模板(在代码块里) |
| 10 | |
| 11 | ## 核心输入 |
| 12 | 用户提供: |
| 13 | - `source_path`:PHP 项目源码根目录 |
| 14 | 可选: |
| 15 | - `context_path`:如果存在反向代理/网关前缀,可用于拼接完整路径(必须有证据来源) |
| 16 | |
| 17 | ## 输出目录结构(建议) |
| 18 | ``` |
| 19 | {output_path}/ |
| 20 | ├── route_mapping/ |
| 21 | │ ├── routes_{timestamp}.md |
| 22 | │ └── params_{timestamp}.md |
| 23 | └── quality/ |
| 24 | └── route_mapper_validation_{timestamp}.md |
| 25 | ``` |
| 26 | |
| 27 | 路径与流水线合并模式下的对应关系见 **`shared/IO_PATH_CONVENTION.md`**(`route_mapping/*.md` 与报告内「路由/参数」章节等价)。 |
| 28 | |
| 29 | ## 识别范围(必做) |
| 30 | 1. 路由配置/定义(按框架识别) |
| 31 | - Laravel:`routes/web.php`、`routes/api.php`、`Route::get/post/{subpath}`、`Route::resource`、Route group 前缀与中间件 |
| 32 | - Symfony:`config/routes/*`、PHP8 attribute `#[Route({route_options})]`、Annotation `@Route({route_options})` |
| 33 | - Slim:`$app->get/post/any({handler})`、自定义中间件 |
| 34 | - WordPress:`admin-post.php`/`admin-ajax.php`、`add_action('admin_post_*')`、`add_action('wp_ajax_*')` |
| 35 | - 纯 PHP:front controller(如 `public/index.php`)的分发逻辑、基于 `$_SERVER['REQUEST_URI']` 的路由匹配 |
| 36 | 2. 动态路由/参数化路由(必做) |
| 37 | - `{id}` / `(?P<id>{id_pattern})` / 正则路由:必须把可控参数列出来 |
| 38 | - 路由约束(where/regex limit):必须输出约束规则与可控性边界 |
| 39 | |
| 40 | ## 参数结构解析(必做) |
| 41 | 对每条路由输出以下参数来源与类型信息: |
| 42 | - Path 参数:来自路由规则的占位(输出如 `{id}`) |
| 43 | - Query 参数:`$_GET` / `request()->query({query})` / 框架 query 解析结果 |
| 44 | - Body 参数:`php://input`、`$_POST`、JSON `json_decode({json})` |
| 45 | - Header 参数:`getallheaders()`、`$_SERVER[{value}]`、框架 request header API |
| 46 | - Cookie 参数:`$_COOKIE` |
| 47 | - File 参数:`$_FILES`(输出字段名与 filename 来源) |
| 48 | |
| 49 | ## 处理器位置(必做) |
| 50 | 每条路由必须给出处理器来源证据: |
| 51 | - 文件路径(相对/绝对均可,但必须一致) |
| 52 | - 函数/类/方法签名(在源码中能定位到的名称) |
| 53 | - 关键分发点:路由匹配如何进入 handler(如 switch case / include 文件链) |
| 54 | |
| 55 | ## 输出格式(强制) |
| 56 | ### `routes_{timestamp}.md`:主索引(逐条列出) |
| 57 | 说明:本 skill 使用 `routes_{timestamp}.md` 中 `=== [N] {route_summary} ===` 的 `N` 作为 **HTTP 路由**的 `route_id`(流水线后续用于 `route_tracer/{route_id}/trace_{timestamp}.md` 文件分桶)。**CLI / hook / sink-only** 等合成 `route_id` 由 `php-audit-pipeline` 阶段 3 写入 `high_risk_routes_{timestamp}.md`,**不**占用本文件的 `[N]` 序号。 |
| 58 | ```markdown |
| 59 | # {project_name} - 路由与接口索引(PHP) |
| 60 | 生成时间: {timestamp} |
| 61 | 分析路径: {source_path} |
| 62 | |
| 63 | ## 路由清单(全部) |
| 64 | === [1] GET /path/to/{id} === |
| 65 | HTTP 方法: GET |
| 66 | 路由路径规则: /path/to/{id} |
| 67 | 处理器: ControllerClass@method / functionName |
| 68 | 位置: path/to/file.php:line(若无法获取行号,标注“待定位:需人工打开文件确认”但仍给出文件路径) |
| 69 | 参数概览: |
| 70 | Path: id (类型推断/约束) |
| 71 | Query: {query_params} |
| 72 | |
| 73 | === [2] POST /path/to/{id}/action === |
| 74 | HTTP 方法: POST |
| 75 | 路由路径规则: /path/to/{id}/action |
| 76 | 处理器: ControllerClass@action / functionName |
| 77 | 位置: path/to/file.php:line(若无法获取行号,标注“待定位:需人工打开文件确认”但仍给出文件路径) |
| 78 | 参数概览: |
| 79 | Path: id (类型推断/约束) |
| 80 | Query: {query_params} |
| 81 | ``` |
| 82 | |
| 83 | ### `params_{timestamp}.md`:参数详细(逐条列出) |
| 84 | ```markdown |
| 85 | # {project_name} - 路由参数结构(逐条) |
| 86 | 生成时间: {timestamp} |
| 87 | |
| 88 | === 路由: GET /path/to/{id} === |
| 89 | 1) Path 参数 |
| 90 | | 参数 | 类型/约束 | 位置 | 必填 | |
| 91 | |------|------------|------|------| |
| 92 | | id | int/regex{id_pattern} | Router rule | 是/否/不确定 | |
| 93 | |
| 94 | 2) Query 参数 |
| 95 | | 参数 | 类型 | 来源 | 必填 | 说明 | |
| 96 | |
| 97 | 3) Body 参数(如 JSON) |
| 98 | | 字段 | 类型 | JSON 路径 | 必填 | |
| 99 | |
| 100 | 4) Header/ Cookie / File(如有) |
| 101 | | 字段 | 类型 | 来源 | 必填 | |
| 102 | |
| 103 | 5) 完整请求模板(必须在代码块里) |
| 104 | ```http |
| 105 | GET /path/to/{id}?a={a}&b={b} HTTP/1.1 |
| 106 | Host: {host} |
| 107 | Cookie: {cookie} |
| 108 | Authorization: Bearer {token} |
| 109 | Content-Type: application/json |
| 110 | |
| 111 | {"k":"{v}"} |
| 112 | ``` |
| 113 | ``` |
| 114 | |
| 115 | ## 输出前自检(强制) |
| 116 | - [ ] routes 与 params 中每条路由“序号/路由标识”一致 |
| 117 | - [ ] 没有出现省略占位符 |
| 118 | - [ ] 每条路由都有“完整请求模板”代码块 |