测试标题
这是粗体和斜体文字。行内代码
- 列表项1
- 列表项2
- 列表项3
- 有序列表1
- 有序列表2
- 有序列表3
- 数据备份:新增
admin/backup.php,支持数据库全表导出为 SQL、data/和uploads/目录打包为 ZIP,可下载和删除备份文件 - 图片库管理:新增
admin/media.php,网格展示所有上传图片,支持查看文件信息、一键复制链接、删除文件 - 文章草稿功能:文章支持"发布"和"保存草稿"两种状态,草稿不在前台显示,后台列表有"草稿"徽章标识
- 文章版本历史:编辑已发布文章时自动保存旧版本到
article_versions表,支持回溯 - Markdown 编辑器:文章编辑页新增工具栏(粗体、斜体、标题、链接、图片、引用、列表、代码块、表格等 16 个按钮)和实时预览功能
- 评论反垃圾设置:后台设置页新增"评论反垃圾设置"区块,可自定义违禁关键词和最大链接数
- 邮件测试功能:后台设置页新增 SMTP 邮件测试表单,可发送测试邮件并显示详细错误排查指引 #### 前台功能
- 统一错误页面:致命错误不再显示白屏,改为友好错误页(含错误编号),管理员可查看详细错误信息
- Open Graph 增强:文章页自动提取首图作为
og:image,新增article:published_time、article:author、article:tag和完整 Twitter 卡片标签 - 评论三重反垃圾:关键词黑名单拦截、链接数量限制(默认 3 个)、纯链接广告内容检测(内容 60% 以上为链接则拦截) #### 开发相关
- 样式文件整合:新建
css/components.css(前台组件)、css/admin-components.css(后台组件)、css/dashboard.css(仪表盘)、css/login.css(登录页),所有非插件样式统一管理并做好分类注释 - 统计缓存机制:about 页面统计数据改为文章保存/删除时增量更新到数据库,不再每次访问遍历所有文章
- 严重:
admin/upload.php缺少管理员登录校验,已添加登录检查 - 严重:Markdown 解析器存在存储型 XSS 漏洞,已添加代码块/行内代码转义和链接 URL 协议过滤(仅允许 http/https/mailto)
- 严重:
comments/guestbook表缺少website字段导致评论功能不可用,已通过ensureDatabaseSchema()自动补全 - 高危:GET 方式登出存在 CSRF 风险,改为 POST 表单提交
- 高危:文章删除改为 POST 请求,消除 GET 删除漏洞
- 高危:添加 Host Header 注入防护,新增
site_url设置项 - 高危:Session 安全加固,
session_set_cookie_params移至session_start之前,设置 HttpOnly 和 SameSite - 高危:登录失败限流,5 次失败后封禁 15 分钟
- 中危:评论/留言提交添加 CSRF 校验
- 中危:所有用户输入输出前统一
htmlspecialchars转义 - 中危:SQL 查询全部使用预处理语句(prepared statement)
- 低危:移除调试信息输出、错误信息脱敏等 8 项低危问题 #### Bug 修复
- 文章页报错:修复
Fatal error: Commands out of sync,根因是getBaseUrl()在$ogStmt->fetch()之后、close()之前调用数据库查询,已调整调用顺序 - Markdown 解析失效:修复全局
htmlspecialchars破坏解析流程的问题,恢复原有解析逻辑,仅保留必要的 XSS 防护 - 预搜索不显示:修复
search_ajax.php返回{keyword, count, data}包装结构但 JS 直接把 data 当数组用导致的 TypeError;同时修复字段名item.date→item.created_at和 URL 双斜杠问题 - 评论/留言 Parse error:编码损坏导致字符串闭合引号丢失,已完全重写
page/comments.php并统一评论/留言双模式 - 邮件收不到:
sendMail()失败时静默返回 false 无日志,已重写includes/mail.php,添加配置校验、15 秒超时、纯文本备选、错误日志写入data/mail_error.log - 搜索页字段兼容:修复
page/search.php中遗漏的is_announcement=0→type='article'迁移
#### 编码损坏事故修复
- 修复因 PowerShell 默认 GBK 编码读取 UTF-8 文件导致的 13 个 PHP 文件中文字符和 HTML 标签丢失问题
- 涉及文件:
admin/plugins.php、page/announcements.php、404.php、admin/article_edit.php、admin/blocked.php、admin/comments.php、admin/guestbook.php、admin/links.php、admin/dashboard.php、about.php、admin/articles.php等 - 验证:全项目 PHP 文件已无 Unicode 替换字符(U+FFFD),PHP/HTML 标签结构正确
- 评论/留言统一:
page/comments.php完全重写为双模式组件($commentType = 'article' | 'guestbook'),page/guestbook.php改为 8 行兼容包装,消除重复代码 - about 页面性能:统计数据从"每次访问遍历所有文章计算"改为"文章保存时增量写入数据库缓存",访问速度大幅提升
- 错误日志:所有 PHP 错误和异常自动写入
data/error.log,方便排查 - 后台导航:新增"图片库"和"备份"菜单项
- 移动端导航:确认汉堡菜单切换逻辑完整,768px 断点下导航自动折叠
admin/backup.php— 数据备份页面admin/media.php— 图片库管理页面css/components.css— 前台组件样式css/admin-components.css— 后台组件样式css/dashboard.css— 仪表盘样式css/login.css— 登录页样式CHANGELOG.md— 本更新日志
#### 重大修改文件
config.php— 统一错误处理注册、Session 安全加固index.php— OG 标签增强、预搜索修复、文章查询加 status 条件、移动端导航admin.php— 路由扩展(backup/media)、草稿保存逻辑、版本历史、统计缓存更新、反垃圾设置保存admin/article_edit.php— Markdown 编辑器工具栏、草稿按钮admin/articles.php— 草稿状态徽章显示admin/settings.php— 反垃圾设置表单、邮件测试表单includes/helpers.php— 统计缓存函数、数据库 Schema 扩展、反垃圾默认值includes/mail.php— 重写,添加错误日志和测试功能includes/markdown.php— XSS 防护修复page/comments.php— 完全重写,统一评论/留言双模式 + 反垃圾检测page/guestbook.php— 改为兼容包装about.php— 统计改为读取数据库缓存search_ajax.php— 返回结构修正- 路由伪静态(
/article/123友好 URL)暂未实施,需服务器配置配合 - 后台
admin.php拆分暂未实施,当前仍为单文件路由结构 - 文章版本历史目前仅自动保存,暂无后台 UI 可查看/回滚版本(数据表已就绪,后续可扩展)
- 文章发布/编辑/删除
- 评论和留言板系统
- 标签和归档
- 友情链接管理
- 后台管理面板
- Markdown 内容解析
- RSS 和 Sitemap 输出 这是一篇测试文章,包含 PHP 和 MySQL 关键词。 PHP 是一门流行的编程语言,MySQL 是常用的数据库。 我的博客已经运行很久了。
- 行内代码:
PHP不替换 - 图片标签:
不替换
- 链接文字:PHP教程 不替换
引用文字链接文字
分割线
子标题
| 表格 | 测试 | |
|---|---|---|
| 单元格1 | 单元格2 | |
| 单元格3 | 单元格4 |
基础格式
这是粗体文字,这是斜体文字,这是粗斜体文字。 这是下划线文字,这是代码块
行内代码:echo "Hello World";
function hello($name) {
echo "Hello, " . $name . "!";
return true;
}
更新日志
本文件记录博客系统的所有版本变更。格式基于 Keep a Changelog, 版本号遵循 语义化版本。[v2.0.0] - 2026-09-09
概述
本次更新为重大版本升级,涵盖安全加固、功能增强、性能优化和代码重构四大方面。 完成了 22 项安全问题修复、10 项新功能开发,以及多处 Bug 修复和体验优化。新增
#### 后台功能修复
#### 安全修复(共 22 项)优化
数据库变更
以下变更由ensureDatabaseSchema() 自动执行,无需手动操作:
| 变更类型 | 对象 | 说明 | |
|---|---|---|---|
| 新增字段 | articles.status | 文章状态(published/draft),默认 published | |
| 新增表 | article_versions | 文章版本历史表 | |
| 新增设置项 | spam_keywords | 评论违禁关键词(逗号分隔) | |
| 新增设置项 | spam_max_links | 评论最大链接数,默认 3 | |
| 新增设置项 | about_stats_cache | about 页面统计缓存(JSON) | |
| 新增目录 | data/backups/ | 备份文件存储目录 |
已知限制
[v1.0.0] - 初始版本
功能
代码块内不替换
echo "PHP 不会被替换";
4. 发布文章
### 3. 前台验证
打开这篇文章,检查:
| 检查项 | 预期结果 |
|--------|---------|
| 正文中的 `PHP` | 第一个被替换为蓝色链接,指向 php.net |
| 正文中的 `MySQL` | 被替换为链接,指向 mysql.com |
| 正文中的 `博客` | 被替换为链接,指向你的博客 |
| 代码块内的 `PHP` | **不替换**,保持纯文本 |
| 已有链接中的 `PHP` | **不替换**,不嵌套链接 |
| 每个关键词出现多次 | **只替换第1次**,后续保持原样 |
| 链接打开方式 | 新标签页打开(target="_blank") |
### 4. 验证排除规则
在文章中添加以下内容,确认不会被错误替换:
markdown
代码块内不替换
`php
echo "PHP 不会被替换";