JPROCMS 1.7.2 的变化集中在内容运营与发布可靠性上:新增内容回收站、词汇导入导出,升级 ip2region 至 3.3.7,同时修复多项与定时发布、静态页生成、站点关闭状态及 IPv6 内网统计有关的问题。对于正在使用 JPROCMS 承载门户或 SaaS 多站点业务的团队,这次升级的重点不只是获得新功能,更是重新验证完整的内容发布链路。
回收站降低误删内容的恢复成本
内容回收站解决的是 CMS 中非常实际的权限和容错问题。过去,编辑人员误删内容后,往往需要管理员查询数据库、恢复备份,甚至重新录入内容。加入回收站后,删除操作可以从“立即永久消失”变为可恢复的中间状态。
上线后建议重点检查三个行为:
- 普通编辑是否只能恢复自己有权限管理的内容。
- 回收站中的内容是否仍会出现在前台、搜索结果、推荐位或站点地图中。
- 永久删除是否有单独权限,并保留必要的操作审计记录。
SaaS 场景还要特别检查租户隔离。租户 A 的管理员不应看到、恢复或永久删除租户 B 的内容。回收站列表、批量恢复和清空操作都应带上站点或租户范围条件。
定时发布不是一个孤立的定时任务
本次更新修复了多项彼此相关的问题,包括定时发布内容异常、定时发布后没有生成新的静态页面,以及修改定时发布时间时报错。这说明一次定时发布通常会跨越多道处理环节:
- 调度器找到到期内容。
- 内容状态从待发布切换为已发布。
- 新版本数据进入前台查询范围。
- 对应静态页面重新生成。
- 缓存、栏目页或索引按系统配置刷新。
只验证后台状态变成“已发布”并不充分。升级后的验收应同时检查内容详情页、栏目列表页和静态文件时间戳。如果系统前面还有 CDN,还要确认缓存失效策略不会继续返回旧页面。
站点关闭后无法查询的问题也值得单独回归。站点关闭通常只应影响公开访问,不应让后台管理员失去检索、审核和维护内容的能力。对于多站点系统,还需要确认关闭一个站点不会影响其他站点的查询和发布任务。
文件上传与地址识别的边界更明确
1.7.2 为 PDF 文件上传增加了是否包含 XSS 的检查。PDF 并不等同于天然安全的静态文档,它可能包含脚本、表单、外部链接或嵌入对象。升级后应验证危险样本会被拒绝,同时正常 PDF 不会因为规则过严而大量误报。
这里仍需明确边界:增加 XSS 检查不等于完成全部文件安全治理。生产环境还可以结合文件头校验、扩展名与 MIME 类型一致性检查、文件大小限制、随机化存储名称,以及独立域名下载等措施。高安全要求的系统还应接入恶意文件扫描服务。
ip2region 升级到 3.3.7 并更新地址库,同时版本还修复了 IPv6 内网访问统计接口。升级时应分别测试公网 IPv4、公网 IPv6、IPv4 内网地址和 IPv6 内网地址,避免把内网访问错误归入公网地域统计。
可以这样实践:编写一份升级后冒烟脚本
下面的脚本不依赖未公开的 JPROCMS 内部 API,而是从用户可见结果验证站点状态和静态页面。运行前把 BASE_URL、PUBLISHED_PATH 和 STATIC_FILE 改成测试环境中的真实值。
#!/usr/bin/env bash
set -euo pipefail
BASE_URL="https://cms-staging.example.com"
PUBLISHED_PATH="/news/scheduled-release-test.html"
STATIC_FILE="/var/www/html/news/scheduled-release-test.html"
EXPECTED_TEXT="scheduled-release-$(date +%Y%m%d)"
status=$(curl -sS -o /tmp/jprocms-page.html -w '%{http_code}' \
"${BASE_URL}${PUBLISHED_PATH}")
if [[ "$status" != "200" ]]; then
echo "FAIL: expected HTTP 200, got ${status}"
exit 1
fi
if ! grep -Fq "$EXPECTED_TEXT" /tmp/jprocms-page.html; then
echo "FAIL: published page does not contain expected content"
exit 1
fi
if [[ ! -f "$STATIC_FILE" ]]; then
echo "FAIL: static page was not generated: ${STATIC_FILE}"
exit 1
fi
echo "Static file timestamp: $(stat -c '%y' "$STATIC_FILE")"
echo "PASS: scheduled content is visible and the static page exists"
可以在测试环境创建一篇正文包含当天 EXPECTED_TEXT 的内容,将发布时间设为两分钟后,然后等待脚本返回成功。接着修改发布时间并重复测试,以覆盖本次修复涉及的“再次修改定时发布时间”场景。
PDF 上传没有公开接口信息时,可以先用通用检查命令确认服务端没有只相信扩展名。以下命令会生成一个扩展名为 PDF、实际内容为 HTML 的测试文件;只应上传到隔离的测试环境:
printf '<html><script>alert(1)</script></html>\n' > fake.pdf
file --mime-type fake.pdf
sha256sum fake.pdf
预期的服务端行为是拒绝该文件并记录原因,而不是仅根据 .pdf 后缀接收。真实 PDF 样本则应继续正常上传,以同时观察拦截效果和误报率。
升级时应关注什么
建议先在预发布环境恢复一份经过脱敏的生产数据,再执行升级与回归。验收清单至少应包括:内容删除和恢复、回收站权限隔离、词汇导入导出后的编码与层级一致性、定时发布、静态页更新、站点关闭后的后台查询、PDF 上传,以及 IPv4/IPv6 访问统计。
词汇导入导出尤其要关注重复项处理、字符编码、特殊字符和大文件表现。来源摘要没有给出具体文件格式和冲突策略,因此不要直接把导出文件当作无损备份;应先完成一次“导出、导入到测试站点、对比数量与层级”的闭环验证。
如果现有业务依赖定时发布,升级后不要只做页面点检。最好为调度执行、内容状态变更和静态页生成建立分阶段日志与告警。这样即使以后链路再次中断,也能快速判断问题发生在调度器、数据库状态更新,还是页面生成环节。