本次更新
本次版本聚焦于 安全加固(XSS 修复)、功能缺陷修复、错误处理完善 和 SEO/规范改进,共修复 16 项问题,涉及 18 个文件。
🔒 安全修复(XSS / 注入防护)
| 文件 |
问题 |
修复 |
recent-updates.njk |
RSS 外部内容(title/excerpt/date/link)未转义,存在 XSS |
对所有 RSS 字段加 | escape |
Timeline.njk |
innerHTML 拼接文章数据(title/path/date/icon),可被注入 |
改用 DOM API(createElement + textContent)构建节点 |
Timeline.njk |
{{ data | dump }} 未转义 </script>,可打断脚本上下文 |
dump 后 replace </ → <\/ |
search.js |
搜索摘要经 innerHTML 写入,内容中 < > & 被当作标签解析 |
写入前先转义 HTML,再高亮关键词 |
htmlGenerator.js |
相关文章列表动态内容(title/path/img/excerpt/date)未转义 |
新增 escapeHtml() 函数统一转义 |
🐛 功能缺陷
| 文件 |
问题 |
修复 |
category.njk |
{% set fancy %} 在 {% extends %} 外,导致 fancy 标签云从不生效 |
删除 set,直接用 theme.tagcloud.fancy |
category.njk |
tagcanvas 配置 textColour: null 重复;fadIn 拼写错误(应为 fadeIn),淡入效果失效 |
删除重复项;修正拼写 |
subpage.js |
posts.data.sort() 修改 Warehouse Query 原数组,导致后续数据污染 |
改用 toArray() 创建副本后排序 |
tagcloud.js |
直接修改传入的 config 对象,污染原始主题配置 |
使用 Object.assign() 创建副本 |
related-post.njk |
类名 realated__body 拼写错误(应为 related__body) |
修正拼写 |
🛡️ 错误处理 / 健壮性
| 文件 |
问题 |
修复 |
search.js |
fetch 无 res.ok 检查和 .catch(),网络失败时搜索静默失效 |
添加 res.ok 检查 + .catch() 错误日志 |
search.js |
正则 d 标志(hasIndices)兼容性差(Safari < 16.4 不支持),导致搜索功能完全失效 |
移除 d 标志,改用 match.index + match[0].length |
copy-code.js |
同步 try/catch 无法捕获异步 navigator.clipboard.writeText() Promise,复制失败仍显示"已复制" |
改为 async/await |
HeartCurve.njk |
构造函数抛错未捕获中断后续脚本;hover 监听器反复累积;console.log 残留 |
添加 try-catch;hoverBound 标志防重复绑定;删除 console.log |
recent.js |
全局 keydown 监听干扰输入框方向键输入 |
检查 target 是否为 INPUT/TEXTAREA/contentEditable |
font.js |
配置字段缺失时解构崩溃;getSubText 中 undefined.map 崩溃;console.log 代替 hexo.log |
添加配置校验 + 防御性 || 回退;改用 hexo.log.info |
recent.js(generator) |
fetchText 递归重定向无次数限制(循环重定向导致栈溢出);响应流缺少 error 监听 |
添加 maxRedirects 限制(默认 5)+ res.on('error') |
filters/stylus.js + lazy-img.js |
非规范注册(模块加载时立即执行,依赖全局 hexo) |
改为 module.exports = hexo => {} 规范写法 |
📈 SEO / 规范改进
| 文件 |
问题 |
修复 |
layout.njk |
缺少 <link rel="canonical">,影响搜索引擎去重 |
添加 canonical 链接 |
layout.njk |
<html lang="zh-cn"> 硬编码,多语言站点不适用 |
改为 {{ config.language or 'zh-cn' }} |
layout.njk |
mask-icon color 引用不存在的 theme.android_chrome_color,颜色恒空 |
回退到 theme.pwa.theme_color |
group-link.njk |
width="20px" / height="20px" 属性误用单位(HTML 属性应为无单位整数);浮点除法 |
去除 px;改用 round(0, 'ceil') 向上取整 |
reward.njk |
SVG width/height 属性误用 px 单位 |
去除 px |
category.njk |
window.onload = 覆盖其他 load 处理器;DEBUG 文案直接渲染给访客 |
改用 addEventListener;文案改为友好提示 |
Full Changelog: v1.5.1...v1.5.2