FlintHub 插件审计 确定性规则检查 · 不执行被审代码

上传插件包,跑一遍确定性检查

把插件的 .zip 拖进来,工具会解压到临时目录、按 24 条规则逐文件扫一遍,出报告后立刻删掉临时文件。 全程不执行包内任何代码。

免登录,直接用。 报告可以下载成 Markdown 或 JSON (含源码片段,只保留 120 分钟)。

通常 1–4 秒(含起一个子进程做语法检查)

它会检查什么

  • 装不上 / 一访问就 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-8
  • FH-ENC-002 PHP 变量名不得含非 ASCII 字节(全角标点会被吞进变量名)
  • FH-ENC-003 无调试残留(var_dump / print_r / console.log / debugger / [DBG])
  • FH-INL-003 无静态 style="" 属性(CSS 变量注入豁免)
  • FH-META-001 plugin.json 必填字段完整 + hooks 指向真实存在的文件
  • FH-META-002 plugin.json 的 category 必须在核心 10 类内
  • FH-META-003 plugin.json 的 icon 必须在核心图标表内(否则渲染成问号)
  • FH-META-004 hooks 声明的钩子名必须在核心钩子表内(写错就永不触发)
  • 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 只提示 / 未能判定 —— 不影响结论

当前环境

zip 扩展
已启用
proc_open
被禁用 —— 语法检查会标「未检查」
upload_max_filesize
50M
post_max_size
50M
数据目录
/www/wwwroot/flinthub/plugin-audit/data

数据目录在站点根内(/www/wwwroot/flinthub/plugin-audit/data/)。临时解压目录名是 16 字节随机、扫完立刻删除,实际风险很低;但若你的 Web 服务器没禁掉该目录的直读,生产环境建议把 config.local.php 的 data_dir 指向 webroot 之外。