审计报告
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_repo | views/file.php:76,87 | 两处内联脚本(语法高亮初始化逻辑) | 逻辑迁移到 assets/script.js,页面仅保留 <script src> 引用 |
| content_review | views/admin.php:294 | 内联脚本块 | 迁移到 assets/script.js |
| dice | views/index.php:114 | 内联脚本块 | 迁移到 assets/script.js |
| dice | DiceController.php:128 | PHP 字符串拼接输出 <script> | 改为视图模板 + 外部 JS 文件 |
| icon_generator | views/generator.php:235 | 内联脚本块 | 迁移到 assets/script.js |
| invite | hook/layout_head_end.php:14 | 钩子直接 echo <script> 块 | 改为输出 <script src> 引用 |
| medal | views/admin.php:245 | 内联脚本块 | 迁移到 assets/script.js |
| medal | views/index.php:78 | 内联脚本块 | 迁移到 assets/script.js |
| quiz_duel | QuizDuelController.php:359 | 输出 setTimeout 跳转脚本 | 改为视图端加载外部 JS 或 meta refresh |
三、🔴 内联 on* 事件属性(9 处,高优先级)
HTML 属性中直接写 onclick/onchange,应改为 JS 端 addEventListener 绑定(同时规避 CSP 内联脚本限制)。
| 插件 | 文件:行 | 具体内容 | 整改建议 |
|---|---|---|---|
| announcements | views/admin.php:82 | onclick="editAnnouncement(...)" | script.js 内 addEventListener('click') 绑定 |
| forum_required_tag | views/admin.php:47 | onchange="window.location='...'" | JS 绑定 change 事件 |
| forum_required_tag | views/admin.php:94 | onclick="return confirm(...)" | JS 绑定 submit/click + confirm |
| forum_required_tag | views/admin.php:129 | onchange="window.location='...'" | JS 绑定 change 事件 |
| forum_required_tag | views/admin.php:176 | onclick="return confirm(...)" | JS 绑定 submit/click + confirm |
| forum_required_tag | views/admin.php:247 | onclick="return confirm(...)" | JS 绑定 submit/click + confirm |
| friend_links | views/admin.php:151 | onclick="editLink(...)" | JS 绑定 click,数据走 data-* 属性 |
| medal | views/admin.php:61 | onchange="toggleCondValue(this)" | JS 绑定 change 事件 |
| medal | views/admin.php:115 | onclick="editMedal(...)" | JS 绑定 click,数据走 data-* 属性 |
四、🟡 内联 style="" 属性(39 处,中优先级)
4.1 announcements(6 处)
| 文件:行 | 内容 | 建议 |
|---|---|---|
views/admin.php:78 | 动态边框/背景色拼接 | 动态色用 CSS 变量(--ann-bg/--ann-border)由 class 控制 |
views/admin.php:103 | style="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:203 | style="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:173 | style="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:23 | flex-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_checkin | views/_sidebar.php:26 | 提示条内联样式 |
| dice | DiceController.php:126,153 | PHP 拼接字号/边距 |
| forum_required_tag | views/error.php:13,14 | 错误页边距/字号 |
| icon_generator | views/generator.php:128 | style="display:none;" |
| icon_generator | hook/nav_plugin_links.php:14 | 图标字号 |
| invite | views/index.php:53 | 邀请码等宽字体 |
| notifications | views/index.php:28,30 | 卡片边框/图标背景动态色 |
| quiz_duel | hook/right_sidebar_after.php:33 | 侧栏按钮内联样式 |
| single_page | hook/footer_links.php:28 | 链接去下划线 |
合规特例:
medal/Plugin.php:425的style="--mn-medal-color:..."是动态 CSS 变量注入,属规范认可做法,不计入违规。
五、误报说明(1 处)
| 插件 | 文件:行 | 说明 |
|---|---|---|
| announcements | Plugin.php:92 | string $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(高,安全 + 规范双重要求)
- **消除全部 9 处内联
on*事件属性**——改为assets/script.js内addEventListener绑定;onclick场景优先使用data-*属性传参,规避 CSPscript-src内联限制与 XSS 风险面 - 消除 9 处内联
<script>块——逻辑迁入各插件assets/script.js;钩子文件只输出<script src>引用;控制器禁止 PHP 拼接<script>
P1(中,规范一致)
- 清理 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)或 Alpinex-cloak,消除硬编码
P2(低,防御性)
- 整改后运行发布前检查:
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 优先级分批整改,可另行安排。