上传插件包,跑一遍确定性检查
把插件的 .zip 拖进来,工具会解压到临时目录、按
24 条规则逐文件扫一遍,出报告后立刻删掉临时文件。
全程不执行包内任何代码。
免登录,直接用。 报告可以下载成 Markdown 或 JSON (含源码片段,只保留 120 分钟)。
它会检查什么
-
装不上 / 一访问就 500
包结构、目录名、路径安全、PHP 语法、命名空间可加载、漏use -
本机好好的,上线才炸
内联<script>/<style>/on*属性、 钩子里的$this->—— 本机不设 CSP、不重复 include,测不出来 -
不报错的静默失效
三语字典的键集合 / 键序 / 代码里引用的键、hooks指向的文件与钩子名、icon/category是否在核心白名单内 -
规范卫生债
静态style、BOM / CRLF / 编码、全角标点吞变量名、调试残留、 版本号多处不一致、直接查核心表
展开 24 条规则清单
CRITICAL 必须修复 5 条
FH-PKG-001包结构必须 plugins/<name>/ 单根(含 Plugin.php + plugin.json)FH-PKG-002插件目录名必须匹配 ^[a-z0-9_]{2,40}$FH-PKG-003包内路径安全(无 .. / 反斜杠 / 盘符 / 空字节 / 全角斜杠 / bidi 控制符)FH-SYN-001包内 PHP 文件必须语法正确(子进程 token_get_all TOKEN_PARSE,带超时)FH-NS-001命名空间必须能被插件自动加载器解析(复刻 Autoloader 三条候选路径)
MAJOR 生产会失效 7 条
FH-INL-001无内联 <script> / <style> 块(src 引用与 JSON-LD 数据岛豁免)FH-INL-002无内联 on* 事件属性(addEventListener + data-* 传参)FH-I18N-001三语字典键集合零差异 + 键序一致(token 硬解,不 include)FH-USE-001同命名空间下调用未 import 的 app 类(跑到那行才 Class not found)FH-SEC-001红线函数(eval / unserialize / extract / assert / create_function / preg_replace+e)FH-SEC-002写操作必须「先登录后 CSRF」(且 CSRF 不能晚于读参数)FH-I18N-002代码里字面量引用的语言键必须在字典里存在(缺键会显示裸键名)
MINOR 规范卫生 9 条
FH-ENC-001文本文件编码:0 BOM / 0 CRLF / 全 UTF-8FH-ENC-002PHP 变量名不得含非 ASCII 字节(全角标点会被吞进变量名)FH-ENC-003无调试残留(var_dump / print_r / console.log / debugger / [DBG])FH-INL-003无静态 style="" 属性(CSS 变量注入豁免)FH-META-001plugin.json 必填字段完整 + hooks 指向真实存在的文件FH-META-002plugin.json 的 category 必须在核心 10 类内FH-META-003plugin.json 的 icon 必须在核心图标表内(否则渲染成问号)FH-META-004hooks 声明的钩子名必须在核心钩子表内(写错就永不触发)FH-META-005版本号多处一致(plugin.json / 说明.md / Plugin.php / assets)
INFO 提示 3 条
FH-DB-001插件直接查询核心表(跨层依赖,建议确认)FH-HOOK-001钩子文件里出现 $this->(闭包作用域下不可用)FH-HOOK-002钩子文件里声明顶层函数/类(重复 include 会 Cannot redeclare)
它不做什么
- 不执行、不
require你的任何代码(用token_get_all只看词法) - 不判断业务逻辑、SQL 注入、越权、依赖漏洞 —— 那不是确定性规则能解决的
- 不检查图标字形是否真的在子集字体里(需要读字体 cmap,二期后半)
- 不留历史、不存源码、不记录你上传的原始文件名
解压红线
- 拒绝
../ 绝对路径 / 盘符 / 空字节 / 全角斜杠 / bidi 控制符 - 拒绝符号链接、拒绝嵌套压缩包
- 解压前先算体积与条目数(zip 炸弹防护),用完
finally必删
怎么读报告
- CRITICAL 装不上或直接 500,必须修
- MAJOR 生产环境会失效(本机测不出来),建议修
- MINOR 规范卫生,可择期处理
- INFO 只提示 / 未能判定 —— 不影响结论