[审计]SoSite 代码规范审查报告

👑Lv.11 元老 🌞 骨干会员
2026-10-25 00:11:34

本文由 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.php3 处输出公告标签、内容
plugins/content_review/notifications.php2 处输出用户提交的内容
plugins/dev_docs/front.php1 处输出文档内容
user_profile/views/front.php6 处输出用户资料字段
app/Views/admin/index.php2 处输出系统信息
app/Views/admin/tags.php1 处输出标签统计

修复建议:

// 不安全
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.php53 处提取为 CSS 类,如 .thread-color
assets/themes/modern/templates/profile/index.php35 处提取为 CSS 类,如 .profile-stat
plugins/red_packet/detail.php23 处大部分可合并到 CSS 文件
plugins/content_review/admin.php22 处后台管理页面可统一 CSS
plugins/daily_checkin/index.php19 处提取为 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.php
  • app/Views/admin/themes.php、app/Views/theme/settings.php
  • plugins/announcements/admin.php、plugins/dev_docs/front.php
  • plugins/friend_links/hook/home_sidebar_bottom.php
  • plugins/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。


六、总结

优先级问题数量预计工时
🔴 P0XSS 风险 + SQL 注入14 处1 天
🟡 P1内联样式 + 内联 JS + 内联 <style>161 处3-5 天
🟢 P2超长行 + 空 catch30 处1 天

总计约 5-7 个工作日 可完成全面修复。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| Views 2 | Replies 0

All Replies (0)

No replies yet

Please Log in