周末闲来无事,突然觉得这个 blog 虽然基本功能都有了,但总感觉缺点什么。于是喊 VS Code(GitHub Copilot)帮我去 GitHub 上搜罗一圈,看看主流博客系统都有哪些功能是我这个「手搓博客」还缺的。

VS Code 一顿操作猛如虎,给我拉了一份 12 项功能清单。我看了下,还挺靠谱,决定让它一股脑全给我加上。

功能清单

# 功能 说明 参考
1 📊 访问统计 记录文章 PV/UV,仪表盘展示访问趋势图、热门文章排行 Ghost/Halo/WordPress
2 🖼️ 媒体库管理 独立的图片/附件浏览器,支持批量上传、删除、复制链接 WordPress/Halo
3 🏷️ 标签管理 标签的独立 CRUD 页面,支持重命名、合并、删除 所有平台都有
4 📄 独立页面 创建「关于」「友链」等非博文的静态页面 Typecho/Ghost/Halo
5 📝 草稿箱 + 定时发布 文章增加 draft/published/scheduled 状态,定时发布用 Laravel Scheduler Ghost/WordPress
6 🔗 友情链接 链接管理 CRUD(名称、URL、图标、分组、排序),前台展示友链页 Typecho/Halo
7 🗑️ 回收站 文章软删除(SoftDeletes),可恢复或彻底删除,防止误操作 WordPress/Halo
8 📋 操作日志 记录后台关键操作(登录/发布/删除/设置变更),便于审计 Halo/Ghost
9 🔍 SEO 增强 每篇文章可自定义 meta description、OG 图片;自动生成 sitemap.xml Ghost/WordPress
10 📤 导出/导入 一键导出所有文章为 Markdown+JSON 压缩包,支持导入恢复 Typecho/Ghost
11 🎨 外观设置 后台可配置主题色、首页布局、是否显示侧栏等,无需改代码 Halo/WordPress
12 💌 评论通知 新评论时通过邮件/Webhook 通知管理员 Ghost/WordPress

实现过程

跟 VS Code 说「先把功能一股脑的全部加上,然后再修吧,这样太慢了」,于是分两批干:

第一批(功能 3-6):标签管理、独立页面、草稿+定时发布、友链管理。改了差不多十几个文件,加了 3 个新 Model、3 个 Controller、6 个 Blade 视图、3 个数据库迁移。

第二批(功能 7-11):回收站、操作日志、SEO、导出/导入、外观设置。又加了 1 个 Model、1 个 Controller、3 个视图、2 个迁移。回收站用了 Laravel 的 SoftDeletes;操作日志在各关键操作(登录、发文、删除、改设置等)埋了 AdminLog::log();SEO 加了 OG 标签和 sitemap.xml;导出把所有文章打成 ZIP(JSON + Markdown 双格式);外观设置可以直接在后台改主题色、自定义 CSS 等。

前两个功能——访问统计和媒体库——是更早之前就做完的。评论通知暂时还没做,后面再说。

安全审计

全部功能加完后做了一轮冒烟测试 + 代码安全审计,发现了不少问题,主要包括:

  • 5 个视图用了 addslashes() 做 JavaScript 转义(不安全),全部改成 json_encode()
  • 前台评论没按审核状态过滤,待审核和垃圾评论都直接展示了
  • 媒体上传允许 SVG 文件——SVG 可以内嵌 JavaScript,等于开了个 XSS 后门
  • 文章导入没用数据库事务,也没校验 JSON 结构
  • 系统设置接受任意 key,没做白名单限制
  • 评论提交没有速率限制
  • 自定义 CSS 注入可以用 </style> 闭合标签绕过

总共修了 10 个安全问题,修完又跑了一遍冒烟测试,全部通过。

详细的审计报告发在了下一篇文章。

当前进度

功能 状态
📊 访问统计 ✅ 已完成
🖼️ 媒体库 ✅ 已完成
🏷️ 标签管理 ✅ 已完成
📄 独立页面 ✅ 已完成
📝 草稿+定时发布 ✅ 已完成
🔗 友链管理 ✅ 已完成
🗑️ 回收站 ✅ 已完成
📋 操作日志 ✅ 已完成
🔍 SEO 增强 ✅ 已完成
📤 导出/导入 ✅ 已完成
🎨 外观设置 ✅ 已完成
💌 评论通知 ⏳ 待开发
🔒 安全审计 ✅ 10 项修复

11/12 完成,还差一个评论通知。一个周末搞定这些,虽然是 AI 在干活,但指挥 AI 干活也挺累的(笑)。