本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:0720备份/_code_review_report.md。
SoSite 代码规范审查报告
审查日期:2026-07-19
扫描范围:292 个 PHP 文件
发现问题:205 处
一、问题总览
| 问题类型 | 数量 | 严重程度 | 影响 |
|---|---|---|---|
内联样式 style="" | 91 处 | ⚠️ 中 | 代码与样式未分离,难以维护 |
内联 JS 事件 onclick="" | 56 处 | ⚠️ 中 | 违反 Unobtrusive JavaScript 原则 |
| 超长行 (>300 字符) | 20 处 | ⚠️ 低 | 影响代码可读性 |
内联 <style> 块 | 14 处 | ⚠️ 中 | 样式散落在页面中,无法缓存 |
| 未转义的 echo 输出 | 13 处 | 🔴 高 | 跨站脚本攻击 (XSS) 风险 |
| 空 catch 块 | 10 处 | 🟡 低 | 异常被静默吞掉,难以排查错误 |
| SQL 未参数化查询 | 1 处 | 🔴 高 | SQL 注入风险 |
二、高风险问题(需优先修复)
2.1 XSS 风险(13 处)
问题描述:PHP 代码中直接 echo 变量内容,未经过 htmlspecialchars() 或 $this->e() 转义,攻击者可注入恶意脚本。
影响文件:
| 文件 | 位置 | 说明 |
|---|---|---|
plugins/announcements/admin.php | 3 处 | 输出公告标签、内容 |
plugins/content_review/notifications.php | 2 处 | 输出用户提交的内容 |
plugins/dev_docs/front.php | 1 处 | 输出文档内容 |
user_profile/views/front.php | 6 处 | 输出用户资料字段 |
app/Views/admin/index.php | 2 处 | 输出系统信息 |
app/Views/admin/tags.php | 1 处 | 输出标签统计 |
修复建议:
// 不安全
echo $var;
// 安全
echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
// 或使用模板引擎方法
echo $this->e($var);2.2 SQL 注入风险(1 处)
问题描述:plugins/qa/AdminController.php 中 SQL 语句直接拼接变量,未使用参数化查询。
修复建议:
// 不安全
$db->query("SELECT * FROM qa_questions WHERE id = {$id}");
// 安全
$db->query('SELECT * FROM qa_questions WHERE id = :id', [':id' => $id]);三、中等问题(需逐步清理)
3.1 内联样式(91 处)
问题描述:大量 HTML 标签中使用 style="..." 直接写样式,导致:
- 样式无法被浏览器缓存
- 修改样式需要逐个页面查找
- 无法统一主题切换
重灾区 Top 5:
| 文件 | 内联样式数 | 建议 |
|---|---|---|
assets/themes/modern/templates/thread/show.php | 53 处 | 提取为 CSS 类,如 .thread-color |
assets/themes/modern/templates/profile/index.php | 35 处 | 提取为 CSS 类,如 .profile-stat |
plugins/red_packet/detail.php | 23 处 | 大部分可合并到 CSS 文件 |
plugins/content_review/admin.php | 22 处 | 后台管理页面可统一 CSS |
plugins/daily_checkin/index.php | 19 处 | 提取为 CSS 类 |
修复建议:
- 动态颜色(如
style="color:<?php echo $color; ?>")可在 CSS 中定义颜色类,PHP 输出类名而非样式值 - 静态样式(如
style="margin:0 auto")直接提取到 CSS 文件中
3.2 内联 JS 事件(56 处)
问题描述:HTML 中使用 onclick="..."、onchange="..." 等绑定事件,导致:
- 行为与结构未分离
- 无法使用事件委托
- 不利于代码维护
修复建议:改用 addEventListener() 统一绑定:
// 不推荐
点击
// 推荐
点击
3.3 内联 <style> 块(14 处)
问题描述:页面中直接嵌入 <style>...</style> 块,部分与插件 CSS 重复。
涉及文件:
app/init.php、app/Views/layouts/main.phpapp/Views/admin/themes.php、app/Views/theme/settings.phpplugins/announcements/admin.php、plugins/dev_docs/front.phpplugins/friend_links/hook/home_sidebar_bottom.phpplugins/invite/hook/layout_head_end.php- 及其他 Modern 主题模板文件
修复建议:将样式合并到对应的外链 CSS 文件中,删除内联 <style> 块。
四、低等问题(可后续优化)
4.1 超长行(20 处)
单行代码超过 300 字符,主要出现在:
- 复杂的 SQL 查询拼接
- 长的 HTML 标签属性
- 长的三元运算符链
修复建议:将长行拆分为多行,提高可读性。
4.2 空 catch 块(10 处)
catch (\Exception $ignored) {}异常被空 catch 吞掉,不利于调试。即使是预计可能发生的异常,也应至少记录日志:
catch (\Exception $e) {
error_log('操作失败: ' . $e->getMessage());
}五、架构建议
5.1 重复代码提取
DiceController 和 QuizDuelController 中都有完全相同的 json() 和 jsonError() 方法,建议提取到 Controller 基类:
// app/Core/Controller.php
protected function json($data, $statusCode = 200) { ... }
protected function jsonError($msg) { ... }5.2 Modern 主题与默认模板的同步
Modern 主题的模板文件和默认模板存在大量重复逻辑。建议:
- 将 Modern 主题的差异化样式放在
modern.css中 - 模板文件尽量复用默认模板,仅覆盖需要差异化的部分
- 避免在 Modern 主题模板中重新实现完整的页面逻辑
5.3 插件资源文件规范
icon_generator 插件的 CSS/JS 文件同时存在于两个路径:
assets/plugins/icon_generator/— 被asset()方法加载plugins/icon_generator/assets/— 未被使用,易混淆
建议统一规范:所有插件资源统一放在 plugins/{name}/assets/ 下,通过 $this->url('/plugins/{name}/assets/...') 加载。
5.4 后台管理页面样式
后台管理页面(app/Views/admin/)和后台插件页面(plugins/*/admin.php)存在大量重复的内联样式,建议提取一套统一的后台管理 CSS。
六、总结
| 优先级 | 问题 | 数量 | 预计工时 |
|---|---|---|---|
| 🔴 P0 | XSS 风险 + SQL 注入 | 14 处 | 1 天 |
| 🟡 P1 | 内联样式 + 内联 JS + 内联 <style> | 161 处 | 3-5 天 |
| 🟢 P2 | 超长行 + 空 catch | 30 处 | 1 天 |
总计约 5-7 个工作日 可完成全面修复。