很多 WordPress 站点上线时只关注“能打开、能发文章”,却忽略了大量隐蔽的安全风险和配置坑点。本文基于一次真实的 WordPress 验收测试,整理了16 个核心测试用例 + 8 个常见 Bug/隐患,覆盖访问控制、评论安全、发布功能、环境部署等关键场景,适合作为上线 checklist 或测试报告参考。
一、测试背景说明
本次测试对象为一个已完成基础部署的 WordPress 个人站(以下简称“被测站点”),环境如下:
- 服务器面板:宝塔
- Web 服务:Nginx
- 运行环境:PHP + MySQL
- HTTPS:Let’s Encrypt 证书
测试目标很明确:确保站点安全、稳定、可维护,避免常见漏洞和低级配置错误。
二、核心测试用例整理(可直接复用)
以下用例按模块划分,覆盖功能、安全、部署三类,优先级均为高(P1/P2)。文中出现的 https://example.com 均为占位示例域名,请替换为实际被测站点地址后执行。
1. 访问控制与权限安全(最核心)
这类用例主要防止未授权访问和敏感信息泄露,是 WordPress 安全的底线。
| 用例名称 | 前置条件 | 操作步骤 | 预期结果 |
|---|---|---|---|
| 未登录访问后台跳转登录页 | 未登录,浏览器隐身模式 | 访问 https://example.com/wp-admin | 302 跳转至 wp-login.php,不展示任何后台内容 |
| 关闭注册后注册页不可用 | 后台设置 → 常规:取消“任何人可以注册” | 隐身窗口访问 https://example.com/wp-login.php?action=register | 提示“注册已关闭”或直接跳转登录页,不显示注册表单 |
| 仅管理员可登录后台 | 仅存在 admin 账户 | 1. 使用非 admin 账号登录2. 使用 admin 账号登录 | 非 admin 登录失败并提示错误;admin 登录成功进入后台 |
| 无订阅者/编辑等其他角色 | 后台仅保留 admin | 后台 → 用户 → 所有用户,查看角色列 | 仅显示 1 个 admin 用户,无 subscriber / editor 等角色 |
| 私密文章访问权限校验 | 登录管理员账号 | 1. 新建文章,可见性设为“私密”2. 前台访问该文章链接 | 未登录访问显示 404;登录后可正常访问 |
| 作者归档页不暴露用户名 | 仅一个管理员账户 | 访问 https://example.com/?author=1 | 跳转 404 或首页,不显示包含用户名的作者归档页 |
✅ 关键点:WordPress 默认会暴露用户名,必须手动封堵。
2. 评论功能:防垃圾、防接口滥用
很多企业站不需要评论功能,但 WordPress 默认开启,容易成为攻击入口。
| 用例名称 | 前置条件 | 操作步骤 | 预期结果 |
|---|---|---|---|
| 新文章默认无评论框 | 后台设置 → 讨论:取消“允许评论” | 1. 发布一篇新文章2. 前台打开该文章 | 页面不显示评论表单,无“发表评论”按钮 |
| 旧文章批量关闭评论生效 | 存在若干历史文章 | 1. 后台 → 文章 → 所有文章,勾选旧文章2. 批量编辑:评论设为“关闭”并应用3. 前台逐一查看 | 所有旧文章均不显示评论区域 |
| 评论接口直接 POST 无效 | 后台已全局关闭评论 | 使用 curl 发送 POST 请求到 /wp-comments-post.php,携带文章 ID 和评论内容 | 返回错误或拒绝请求,数据库 wp_comments 表无新增记录 |
✅ 关键点:不仅要关前端表单,还要封死后端接口。
3. 文章发布功能验证
这是最基础的内容管理能力,但配置不当会导致发布失败或大文件上传异常。
| 用例名称 | 前置条件 | 操作步骤 | 预期结果 |
|---|---|---|---|
| 普通文章发布成功 | 登录管理员账号 | 1. 新建文章,填写标题和正文2. 插入一张图片3. 点击发布 | 发布成功,前台可正常访问,图片加载正常 |
| 定时发布功能正常 | 服务器时间正确,WP-Cron 可用 | 1. 新建文章,设置发布时间为未来时间2. 到达设定时间后刷新前台 | 到达设定时间后文章自动在前台可见 |
| 草稿状态文章访问校验 | 登录管理员账号 | 1. 新建文章,保存为“草稿”2. 前台访问该文章链接 | 前台返回 404 |
| 多图及大文件上传成功 | PHP:upload_max_filesize≥4M,post_max_size≥8M | 新建文章,一次性插入 3 张 4MB 图片,点击发布 | 无 413 / 500 错误,所有图片前台正常显示 |
✅ 关键点:定时发布依赖 WP-Cron,低流量站点容易失效。
4. 部署与环境配置检查
这类问题往往在迁移服务器或重启服务后才暴露。
| 用例名称 | 前置条件 | 操作步骤 | 预期结果 |
|---|---|---|---|
| Nginx 伪静态规则生效 | 宝塔已启用 WordPress 伪静态规则 | 1. 后台 → 设置 → 固定链接,选择“文章名”2. 访问任意文章页 | 文章页不出现 404,URL 形如 /文章标题/ |
| SSL 配置无混合内容错误 | 宝塔已部署 Let’s Encrypt 证书 | 1. 访问 https://example.com/2. 打开浏览器开发者工具 Console | 无 Mixed Content 报错,所有资源通过 HTTPS 加载 |
| 数据库连接正常 | 宝塔数据库配置正确 | 随意浏览前台和后台页面,检查渲染情况 | 不出现 “Error establishing a database connection” 错误 |
✅ 关键点:伪静态规则和 HTTPS 是迁移时的高频故障点。
5. 接口与纵深安全防护
WordPress 的 REST API 常被忽略,却是信息泄露的重灾区。
| 用例名称 | 前置条件 | 操作步骤 | 预期结果 |
|---|---|---|---|
| REST API 用户枚举接口不可访问 | 未安装禁用 REST API 插件 | 浏览器访问 https://example.com/wp-json/wp/v2/users | 返回 401 / 403,不暴露用户名列表 |
✅ 关键点:API 安全往往比页面安全更容易被突破。
三、测试中发现的 8 个典型 Bug / 隐患(建议重点修复)
以下问题在本次测试中被发现,虽不一定导致站点崩溃,但属于中高危风险或体验硬伤,建议在上线前处理。
🔴 高风险安全问题(必须修)
- REST API 用户枚举未封禁
- 现象:
/wp-json/wp/v2/users可能返回用户名列表 - 风险:攻击者可直接获取管理员用户名,大幅降低暴力破解成本
- 建议:通过插件或代码禁用 REST API 用户端点,或在未认证时返回 403
- 现象:
- 作者归档页暴露用户名
- 现象:访问
?author=1直接显示包含用户名的归档页 - 风险:泄露管理员登录名,属于典型信息泄露漏洞
- 建议:重定向到首页或 404;或修改作者归档 URL 为昵称而非登录名
- 现象:访问
- 评论接口未做二次校验
- 现象:后台关闭评论后,仍可通过直接 POST
/wp-comments-post.php提交 - 风险:绕过前端限制,产生垃圾数据或被用于攻击
- 建议:后端在校验评论开关后再处理 POST 请求,拒绝非法写入
- 现象:后台关闭评论后,仍可通过直接 POST
🟡 功能与稳定性风险(强烈建议修)
- WP-Cron 依赖访问触发
- 现象:定时发布依赖用户访问触发 WP-Cron
- 风险:低访问量站点可能出现定时发布延迟
- 建议:生产环境禁用 WP-Cron,改用系统 crontab 调用
wp-cron.php
- 大文件上传依赖 PHP 配置
- 现象:上传超过
upload_max_filesize会直接 413/500 - 风险:用户体验差,无友好错误提示
- 建议:前端校验文件大小,并在 PHP 层给出明确错误提示
- 现象:上传超过
- 伪静态规则强依赖服务器配置
- 现象:切换服务器或重置 Nginx 后固定链接易 404
- 风险:运维变更成本高,排查困难
- 建议:将伪静态规则纳入部署文档或版本化管理
🟢 合规与 SEO 优化(建议修)
- 混合内容隐患
- 现象:部分主题或老文章可能仍硬编码
http://资源 - 风险:浏览器拦截加载,影响评分与 SEO
- 建议:使用插件或 SQL 批量替换数据库中的 HTTP 资源链接
- 现象:部分主题或老文章可能仍硬编码
- 注册关闭但接口仍可探测
- 现象:虽然页面隐藏,但接口层面仍可判断注册状态
- 风险:轻微信息泄露
- 建议:统一返回“登录页”,避免区分“注册关闭/开放”
四、总结:WordPress 上线 Checklist
如果你正在准备上线一个 WordPress 站点,建议至少完成以下动作:
- ✅ 关闭用户注册,清理多余角色
- ✅ 封堵用户名泄露路径(REST API、作者页)
- ✅ 彻底关闭不需要的评论功能(含接口)
- ✅ 验证伪静态、HTTPS、数据库连接
- ✅ 调整 PHP 上传限制,测试大文件发布
- ✅ 优化 WP-Cron,避免定时任务失效
- ✅ 扫描全站混合内容,确保全站 HTTPS
WordPress 的优势是“开箱即用”,但安全风险也恰恰藏在“默认配置”里。上线前的 30 分钟检查,能避免上线后的无数次救火。