[审计]插件模板内联 CSS / JS 审计报告

👑Lv.11 元老 🌞 骨干会员
2026-10-26 10:50:52

审计报告

date: 2026-08-29

category: 审计修复

source: 暂存20260913/插件模板内联审计报告.md


插件模板内联 CSS / JS 审计报告

审计日期:2026-08-29

审计范围:plugins//views/、plugins//hook/、插件根目录控制器/主类(含 Plugin.php)

审计方法:正则扫描视图/钩子/控制器中的 <style> 块、style="" 属性、<script> 块、on* 事件属性;排除 assets/(资源收敛目标)、data/、lang/、cli/ 目录

依据规范:《插件开发规范.md》第七节——插件样式/JS 零内联,CSS 收敛到插件自己的 assets/style.css,JS 收敛到 assets/script.js,禁止大段内联 <style>/<script>,不改核心 admin.css


一、总体统计

指标数值
扫描插件数30+
有命中的插件20
有命中的文件42
命中总数85
其中:内联 <script> 块9(🔴 高)
其中:内联 on* 事件属性9(🔴 高)
其中:内联 style="" 属性39(🟡 中,另 1 处为误报)
其中:<script src> 外部引用21+(🟢 合规)

命中总数 85 = 高 9 + 高 9 + 中 39 + 合规 21 + 误报 1 + 其他未逐条展开的 src 引用。


二、🔴 内联 <script> 块(9 处,高优先级)

页面内直接输出 <script>...</script> 逻辑块,应收敛到插件 assets/script.js。

插件文件:行具体内容整改建议
code_repoviews/file.php:76,87两处内联脚本(语法高亮初始化逻辑)逻辑迁移到 assets/script.js,页面仅保留 <script src> 引用
content_reviewviews/admin.php:294内联脚本块迁移到 assets/script.js
diceviews/index.php:114内联脚本块迁移到 assets/script.js
diceDiceController.php:128PHP 字符串拼接输出 <script>改为视图模板 + 外部 JS 文件
icon_generatorviews/generator.php:235内联脚本块迁移到 assets/script.js
invitehook/layout_head_end.php:14钩子直接 echo <script> 块改为输出 <script src> 引用
medalviews/admin.php:245内联脚本块迁移到 assets/script.js
medalviews/index.php:78内联脚本块迁移到 assets/script.js
quiz_duelQuizDuelController.php:359输出 setTimeout 跳转脚本改为视图端加载外部 JS 或 meta refresh


三、🔴 内联 on* 事件属性(9 处,高优先级)

HTML 属性中直接写 onclick/onchange,应改为 JS 端 addEventListener 绑定(同时规避 CSP 内联脚本限制)。

插件文件:行具体内容整改建议
announcementsviews/admin.php:82onclick="editAnnouncement(...)"script.js 内 addEventListener('click') 绑定
forum_required_tagviews/admin.php:47onchange="window.location='...'"JS 绑定 change 事件
forum_required_tagviews/admin.php:94onclick="return confirm(...)"JS 绑定 submit/click + confirm
forum_required_tagviews/admin.php:129onchange="window.location='...'"JS 绑定 change 事件
forum_required_tagviews/admin.php:176onclick="return confirm(...)"JS 绑定 submit/click + confirm
forum_required_tagviews/admin.php:247onclick="return confirm(...)"JS 绑定 submit/click + confirm
friend_linksviews/admin.php:151onclick="editLink(...)"JS 绑定 click,数据走 data-* 属性
medalviews/admin.php:61onchange="toggleCondValue(this)"JS 绑定 change 事件
medalviews/admin.php:115onclick="editMedal(...)"JS 绑定 click,数据走 data-* 属性


四、🟡 内联 style="" 属性(39 处,中优先级)

4.1 announcements(6 处)

文件:行内容建议
views/admin.php:78动态边框/背景色拼接动态色用 CSS 变量(--ann-bg/--ann-border)由 class 控制
views/admin.php:103style="display:none;"改 class(.ann-hidden)或 x-cloak
hook/announcements_display.php:29动态背景/边框色同上,收敛到 assets/style.css
hook/announcements_display.php:31链接文字样式收敛到 class
hook/announcements_display.php:48动态背景/边框/文字色收敛到 class + CSS 变量
hook/announcements_display.php:51链接文字样式收敛到 class

4.2 content_review(6 处)

文件:行内容建议
views/admin.php:69,85,101组徽章动态背景色CSS 变量 + 色板 class(cr-badge-red/blue/...)
views/admin.php:203style="display:none;"改 class 或 x-cloak
views/notifications.php:25卡片边框样式收敛到 assets/style.css
views/notifications.php:27图标背景动态色CSS 变量 + 状态 class

4.3 friend_links(6 处)

文件:行内容建议
views/admin.php:173style="display:none;"改 class
views/apply.php:10容器边距 margin:40px auto收敛到 class(复用 mn-maxw-500 + 间距工具类)
views/apply.php:12标题边距收敛到 class
views/apply.php:13描述边距收敛到 class
views/apply.php:34提示文字边距收敛到 class
hook/home_sidebar_bottom.php:15图标字号 font-size:14px收敛到 class

4.4 mod_system(5 处)

文件:行内容建议
hook/footer_links.php:10链接去下划线收敛到 class(复用 text-decoration:none 工具类)
hook/footer_links.php:11图标字号收敛到 class
hook/nav_drawer_links.php:11图标字号收敛到 class
hook/route_before_dispatch.php:39错误提示框内联样式收敛到 assets/style.css
Plugin.php:256弹窗 style="display:none;"配合 x-cloak 用 class 控制

4.5 red_packet(4 处)

文件:行内容建议
hook/post_create_extra.php:23flex-wrap:wrap复用工具类(mn-flex-wrap)
hook/post_create_extra.php:26输入框宽度收敛到 class
hook/post_create_extra.php:30输入框宽度收敛到 class
hook/post_create_extra.php:34下拉宽度收敛到 class

4.6 其他插件(12 处)

插件文件:行内容
daily_checkinviews/_sidebar.php:26提示条内联样式
diceDiceController.php:126,153PHP 拼接字号/边距
forum_required_tagviews/error.php:13,14错误页边距/字号
icon_generatorviews/generator.php:128style="display:none;"
icon_generatorhook/nav_plugin_links.php:14图标字号
inviteviews/index.php:53邀请码等宽字体
notificationsviews/index.php:28,30卡片边框/图标背景动态色
quiz_duelhook/right_sidebar_after.php:33侧栏按钮内联样式
single_pagehook/footer_links.php:28链接去下划线

合规特例:medal/Plugin.php:425 的 style="--mn-medal-color:..." 是动态 CSS 变量注入,属规范认可做法,不计入违规。


五、误报说明(1 处)

插件文件:行说明
announcementsPlugin.php:92string $style = 'yellow' 是函数参数名,非内联 CSS,不计入违规


六、🟢 合规实践(<script src> 外部引用,21+ 处)

以下插件的视图/钩子均通过 <script src=".../plugins/xxx/assets/script.js?v=filemtime"> 正确加载脚本,符合"JS 收敛到 assets/"规范,无需整改:

  • ai_assistant:views/admin.php:579
  • announcements:views/admin.php:144、hook/announcements_display.php:20
  • code_audit:views/admin.php:91
  • code_repo:views/file.php:37,39,42(highlight.js / marked 资源引用)
  • forum_required_tag:views/admin.php:272、hook/layout_head_end.php:66
  • friend_links:views/admin.php:227
  • icon_generator:views/generator.php:274
  • mod_system:views/_reports_panel.php:213、Plugin.php:249
  • points_mall:views/admin.php:327、views/shop.php:83
  • post_favorite:hook/layout_head_end.php:24
  • quiz_duel:views/index.php:159
  • red_packet:hook/thread_redpacket_area.php:73
  • single_page:views/admin.php:152
  • task_center:views/admin.php:194、views/index.php:73

七、整改建议与优先级

P0(高,安全 + 规范双重要求)

  1. **消除全部 9 处内联 on* 事件属性**——改为 assets/script.js 内 addEventListener 绑定;onclick 场景优先使用 data-* 属性传参,规避 CSP script-src 内联限制与 XSS 风险面
  2. 消除 9 处内联 <script> 块——逻辑迁入各插件 assets/script.js;钩子文件只输出 <script src> 引用;控制器禁止 PHP 拼接 <script>

P1(中,规范一致)

  1. 清理 39 处 style="" 属性,分两类处理:
  • 静态样式(边距/字号/宽度/去下划线):收敛为插件 assets/style.css 中的 class,优先复用核心工具类(mn- 间距、mn-maxw- 宽度、text-decoration:none 等)
  • 动态色值(徽章/状态/图标背景):改为 CSS 变量 + 预定义色板 class(参考 points_mall 的 pm-badge-* 模式),或使用 --xxx-color 内联 CSS 变量(同 medal 的合规做法)
  • display:none 显隐:统一改 class(如 .xxx-hidden)或 Alpine x-cloak,消除硬编码

P2(低,防御性)

  1. 整改后运行发布前检查:
  • grep -nE '<style|<script>|on(click|change|submit|load)=' plugins/{插件名}/views plugins/{插件名}/hook 应零命中(src 引用除外)
  • 双主题(浅色 + 暗夜星辰)走查被改页面

八、审计亮点

  • ✅ points_mall / task_center / single_page / post_favorite / code_audit / quiz_duel / ai_assistant 等新近插件已做到零内联(除 <script src> 引用外无违规),可作为后续整改的样式范本
  • ✅ 未发现大段 <style> 块(早期审计中 announcements / friend_links / invite 曾存在,本次扫描已收敛,仅剩 style="" 属性与事件属性)
  • ✅ 动态 CSS 变量注入(medal 勋章颜色)用法正确,值得推广
  • ✅ 所有插件均未修改核心 admin.css,样式收敛方向正确

报告生成方式:只读正则扫描,未修改任何插件代码。如需按 P0 → P1 → P2 优先级分批整改,可另行安排。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 瀏覽 4 次 | 回覆 0 次

全部回覆 (0)

暫無回覆

請 登入