$npx -y skills add 0xShe/PHP-Code-Audit-Skill --skill php-yii-audit--- name: php-yii-audit description: Yii 框架特效安全审计工具。针对 Yii(通常指 Yii2)访问控制(AccessControl/RBAC)、CSRF、输入过滤规则、输出编码策略、URL/重定向安全等进行白盒静态审计,并映射到通用漏洞类型体系(AUTH/CSRF/XSS/CFG/LOGIC 等)。 ---
| 1 | # PHP Yii(Yii2)框架安全审计(php-yii-audit) |
| 2 | |
| 3 | 分析 Yii2 项目的框架机制与配置踩坑,重点覆盖: |
| 4 | - 访问控制:`AccessControl` filter、`roles` 规则、matchCallback 的使用 |
| 5 | - RBAC:`user->can`/`can()` 路径的鉴权完整性 |
| 6 | - CSRF:`enableCsrfValidation` 与 cookie validation |
| 7 | - 输出编码:views 是否使用 `Html::encode`、`HtmlPurifier`,以及危险的原样输出 |
| 8 | - URL 与跳转:redirect/Url 生成是否受信任输入控制 |
| 9 | - 入参过滤:`rules()`、`safeAttributes()`、场景(scenario)是否导致 Mass Assignment |
| 10 | |
| 11 | ## 输入 |
| 12 | 用户提供: |
| 13 | - `source_path`:Yii 项目根目录 |
| 14 | 可选: |
| 15 | - `output_path`:输出目录路径(默认 `{source_path}_audit`) |
| 16 | |
| 17 | ## 输出目录 |
| 18 | 输出到: |
| 19 | ``` |
| 20 | {output_path}/framework_audit/ |
| 21 | yii_{timestamp}.md |
| 22 | ``` |
| 23 | |
| 24 | ## 框架识别(必做) |
| 25 | 必须给出 Yii 识别证据点(不允许空口断言): |
| 26 | - 依赖证据:`composer.json` 包含 `yiisoft/yii2` 或相关组件 |
| 27 | - 入口证据:`web/index.php` 或 `yii` 入口脚本 |
| 28 | - 应用目录:`controllers/`、`models/`、`views/` |
| 29 | |
| 30 | ## 风险类型映射(必做) |
| 31 | 每条发现都必须写明: |
| 32 | - 通用类型码:`AUTH` / `CSRF` / `XSS` / `CFG` / `LOGIC` 等 |
| 33 | - 映射原因 |
| 34 | |
| 35 | ## 必审清单(必做:逐项检查并输出结果) |
| 36 | |
| 37 | ### 1) AccessControl 鉴权规则正确性(AUTH) |
| 38 | 必须定位并输出: |
| 39 | - `behaviors()` 中的 `AccessControl` 配置:`rules`、`roles`、`matchCallback` 与 action 覆盖范围 |
| 40 | - 是否存在只依赖 matchCallback 的宽松模式 |
| 41 | - 是否有自定义认证逻辑但未落到统一 filter |
| 42 | |
| 43 | 判定规则: |
| 44 | - 有路径能绕过 AccessControl 或 rules 过宽,则输出 AUTH 风险 |
| 45 | |
| 46 | ### 2) RBAC/权限校验完整性(AUTH/LOGIC) |
| 47 | 必须定位并输出: |
| 48 | - 控制器/服务层的 `user->can({value})`、`can()` 或等价权限判断 |
| 49 | - 对象归属校验:是否同时验证 owner_id/user_id 或资源的归属关系 |
| 50 | |
| 51 | 判定规则: |
| 52 | - 若仅判断“用户有权限类型”,但未校验对象归属,输出 AUTH 或 LOGIC 风险 |
| 53 | |
| 54 | ### 3) CSRF(CSRF) |
| 55 | 必须定位并输出: |
| 56 | - `enableCsrfValidation` 与 cookie validation 设置 |
| 57 | - token 接收字段与验证失败处理方式(是否早退) |
| 58 | |
| 59 | ### 4) 输出编码与 XSS(XSS) |
| 60 | 必须定位并输出: |
| 61 | - views 中是否存在原样输出:`Html::encode` 被绕过的情况、或使用 `raw` 类机制 |
| 62 | - 模板中是否将用户输入直接拼接到 HTML 属性/JS/URL 中 |
| 63 | |
| 64 | ### 5) 输入过滤与 Mass Assignment(LOGIC) |
| 65 | 必须定位并输出: |
| 66 | - 模型 `rules()`、`safeAttributes()`、`scenarios()` 的配置 |
| 67 | - 是否存在 `load($request->post())` 后直接保存,而敏感字段未被禁止 |
| 68 | |
| 69 | ## 可观测 PoC(必做:框架特效可观测验证框架) |
| 70 | 至少给出以下两类其一并写清观察点: |
| 71 | - AUTH:对疑似受保护 action,用低权限用户请求,观察响应差异或业务副作用 |
| 72 | - CSRF:对疑似受保护的状态变更 POST 请求,缺失 CSRF token,观察错误与是否仍成功执行 |
| 73 | |
| 74 | PoC 输出要求: |
| 75 | - 必须包含 controller/action 路由与参数字段 |
| 76 | - 必须说明你要观察的 HTTP 状态码与业务结果 |
| 77 | |
| 78 | ## 输出完整性检查(强制) |
| 79 | - [ ] 输出包含:AccessControl/RBAC/CSRF/输出编码/Input filtering 检查结果 |
| 80 | - [ ] 每条风险都有:映射类型码 + 位置证据 + 可观测验证框架 + 修复建议 |