本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:8月13日备份/审计计划.md。
SoSite 全程序安全与逻辑审计计划(2026-08-12)
审计方式:只读遍历 + 静态扫描 + 人工走读 + 调用链追踪,交叉验证 2026-08-06 审计报告整改情况。
范围:
app/(Controllers / Core / Helpers / Models / Views)、plugins/(16 个插件)、assets/、protected/、config.php、根目录入口文件。原则:审计阶段不修改任何代码(除非用户明确指示修复),所有发现汇总为问题清单供决策。
一、审计目标
- 发现可利用的安全漏洞(高危优先):SQL 注入、XSS、CSRF、SSRF、文件上传、路径穿越、命令注入、认证绕过、越权(IDOR)、敏感信息泄露。
- 发现业务逻辑缺陷:权限校验缺失、积分/勋章/投票等核心业务可被刷或绕过、事务与数据一致性、并发竞态、缓存一致性、状态机流转异常、错误路径处理不当。
- 复核 2026-08-06 审计报告(
审计20260806.md)中的 🔴/🟠 问题是否已修复,新增问题是否引入新风险。 - 输出:按优先级分级的完整问题清单 + 修复建议(定位到文件:行)。
二、审计维度与检查项
A. 安全审计维度
| # | 维度 | 关键检查项 |
|---|---|---|
| A1 | SQL 注入 | 所有 SQL 是否参数化;Database::query 占位符使用(同命名占位符复用 HY093);IN (...)/LIKE/ORDER BY/LIMIT 拼接;SHOW 语句;quote() 内联点是否净化 |
| A2 | XSS(存储/反射/DOM) | 视图所有输出是否 e();属性值、内联 style、URL 输出;formatPostContent/decodeContent 白名单标签;编辑器内容渲染;JS 端 innerHTML/eval/dangerouslySetInnerHTML 等价点 |
| A3 | CSRF | 所有写操作(发帖/回帖/评论/私信/上传/投票/后台)是否 Csrf::verifyOrDie();插件自带表单/JS 是否带 token;Ajax 写接口 |
| A4 | 文件上传 | 扩展名+MIME 双白名单;finfo 兜底逻辑;文件名随机化;上传目录禁止脚本执行(assets/uploads/ 防护);图片真实性校验;像素炸弹;附件下载/删除路径 |
| A5 | SSRF | ApiController::fetchImage 及类似 URL 抓取点:内网段封禁(169.254/100.64/127/10/172.16/192.168)、重定向逐跳校验、DNS rebinding、端口限制、协议限制 |
| A6 | 命令注入 | shell_exec/system/exec/passthru/proc_open/popen 全库扫描;mysqlImport 的 SQL 任意执行面 |
| A7 | 认证与会话 | 密码哈希算法;登录限流(账号/IP);忘记密码流程;会话固定/劫持防护;RememberMe token 安全;admin_verified_at 30 分钟二次验证覆盖范围(前台 admin-only 操作是否有绕过) |
| A8 | 越权(IDOR) | 增删改查接口的属主校验;水平越权(改他人帖子/删除他人附件/读他人私信/改他人设置);垂直越权(前台 admin-only 操作);管理后台接口权限 |
| A9 | 信息泄露 | 搜索接口字段裁剪(email/role/status);错误信息回显;protected/ 目录可访问性;.htaccess/nginx 配置;调试开关;异常堆栈暴露 |
| A10 | 配置与部署安全 | config.php 弱口令(fastbb/123456);MAIL_PASS_KEY 固定密钥;SESSION 配置;SITE_URL/BASE_PATH 来源;uploads 目录防护;目录遍历入口 |
| A11 | 插件安全 | plugin.json/hooks 加载链是否有任意代码执行面;插件缓存文件(plugins_cache.php)权限与校验;插件控制器权限(admin/前台)是否与插件定位一致;跨插件数据流(如通知、勋章钩子) |
B. 逻辑审计维度
| # | 维度 | 关键检查项 |
|---|---|---|
| B1 | 权限与状态流转 | 帖子/博客/评论的创建→审核→编辑→删除状态机;草稿/审核状态;软删除与恢复 |
| B2 | 积分/勋章/投票核心业务 | 积分加减点是否有调用方权限校验、防重复、防刷(发帖+5、回帖、每日签到、投票);勋章自动规则(发帖数/回帖数/注册天数/积分)计数口径与防重复颁发;投票幂等与截止 |
| B3 | 频率限制与防刷 | 发新主题/回帖/评论/私信/上传/签到各自限流;RateLimiter 实现(TOCTOU、文件锁);验证码覆盖(登录/注册/忘记密码) |
| B4 | 事务与一致性 | 多表写操作是否事务包裹(发帖+积分、回帖+计数、勋章颁发、下载扣积分);失败回滚;计数缓存(post_count_map/thread_count_map)与库表一致性 |
| B5 | 并发与竞态 | 收藏/投票/勋章佩戴的唯一键防重;领取类操作(红包/签到)并发;文件锁/数据库锁使用 |
| B6 | 消息/通知逻辑 | 私信收发/已读/删除权限;通知已读/未读计数;批量标记逻辑 |
| B7 | 附件生命周期 | 上传→归属→下载→删除全链路;孤儿附件清理逻辑是否会误删(medals 目录不在 uploads 的约定);删除帖子时附件清理 |
| B8 | 搜索/分页/排序 | 搜索词注入(FTS/LIKE 转义);分页参数越界;排序字段白名单;sanitizeOrderBy 黑名单改白名单 |
| B9 | 插件间交互 | hooks 调用顺序与返回值契约;controller_view_before 批量注入的数据来源;插件卸载/重装后的残留(表/缓存文件/导航链接) |
| B10 | 错误处理 | 未捕获异常路径;try/catch 吞错导致状态不一致;404/403 视图存在性(上次审计悬空引用已确认 errors/404.php 存在,复核其余);死代码/零调用方法 |
三、审计方法
- 静态扫描:
grep/ast_grep模式匹配高危函数与模式(SQL 拼接、echo 未转义、危险函数、权限校验缺失)。 - 人工走读:对命中点与核心控制器(Auth/Thread/Post/Profile/Message/Upload/Api/Admin 系)逐文件阅读核实。
- 调用链追踪:
trace_callers/trace_callees/trace_chain确认敏感函数(积分、删除、颁发、下载)的调用入口与权限上下文。 - 复核上次报告:逐条对照
审计20260806.md的 S/X/U/R/P 问题 → 确认修复状态(✅已修复 / ⚠️部分 / ❌未修复),并排查是否引入回归。 - 动态验证(仅需时):临时 PHP 脚本验证 SQL 行为/边界(注意:cmd 无 php,用
D:/phpstudy_pro/Extensions/php/php8.2.9nts/php.exe;只插删测试数据,不动插件 activated 状态;验证脚本用完即删)。 - 不修改代码:审计阶段只读,问题清单交付后由用户决定是否修复。
四、审计阶段安排
| 阶段 | 内容 | 产出 |
|---|---|---|
| P0 准备 | 环境确认(PHP 路径、DB 可连)、代码库清单、基线 | 基线清单 |
| P1 安全审计 | A1-A11 逐维度扫描+走读 | 安全问题表 |
| P2 逻辑审计 | B1-B10 逐维度走读+调用链 | 逻辑问题表 |
| P3 插件专项 | 16 个插件逐个过权限/钩子/数据流 | 插件问题表 |
| P4 复核整改 | 对照 2026-08-06 报告逐条核实 | 整改状态表 |
| P5 汇总 | 优先级矩阵(🔴高/🟠中/🟡低)+ 修复建议 + 整改顺序 | 审计报告 |
五、交付物
- 审计报告.md(或按需拆分为 审计报告-安全.md / 审计报告-逻辑.md):完整问题清单,每条含 位置(文件:行)、风险等级、问题描述、攻击场景/触发路径、修复建议。
- 整改状态表:2026-08-06 报告问题 → 当前状态。
- 若用户要求,进入修复阶段(另行指示)。
六、审计红线(本次审计纪律)
- 只读审计,不修改任何源文件;需要验证时用临时脚本(用完即删)。
- 不执行/不部署任何破坏性操作;不动数据库真实数据(如需验证用事务回滚或只读查询)。
- 不修改插件 activated 状态、不删插件缓存文件(只读检查)。
- 发现高危问题立即单独汇报,不等完整报告。
计划由 2026-08-12 会话生成。待用户指令后开始正式审计。