[x-cmd] jsoup 1.22.1 版本发布,引入 re2j 引擎,让 HTML 解析更安全高效

jsoup 1.22.1 版本发布,引入 re2j 引擎,让 HTML 解析更安全高效

如果你想持续获取更多相关资讯,欢迎关注 x-cmd 博客

jsoup 1.22.1 正式发布,这是一次侧重于安全性性能稳定性 的重要更新。

核心亮点包括:

  • 引入 re2j 正则引擎以实现线性时间复杂度的 CSS 选择器匹配;
  • 新增可配置的解析器深度限制以防止堆栈溢出,并全面支持 JDK 25;
  • 修复了包括 HttpClient 代理失效、内存泄漏及 HTML 实体转义在内的多项关键 Bug。

jsoup 1.22.1 版本发布,引入 re2j 引擎,让 HTML 解析更安全高效

在 Java 生态中,jsoup 凭借其强大的 HTML 解析能力和类 jQuery 的 CSS 选择器 API,一直是开发者处理网页数据的首选工具。然而,随着 Web 环境的日益复杂,如何安全地处理用户提供的正则表达式以及防止恶意构造的深层嵌套 HTML 导致系统崩溃,成为了解析器面临的新挑战。

近日,jsoup 1.22.1 正式发布。这一版本不仅带来了对最新 JDK 25 的支持,更通过引入 Google 的 re2j 引擎和解析深度限制,为开发者筑起了一道坚的安全防线。

更新内容速览

1. 引入 re2j:消除正则性能隐患

在之前的版本中,jsoup 使用 Java 原生正则引擎处理 CSS 选择器(如 [attr~=regex])。原生引擎在处理某些精心构造的正则表达式时,可能会陷入"指数级回溯",导致 CPU 飙升甚至拒绝服务(DoS)。

1.22.1 版本新增了对 re2j 引擎的支持。re2j 保证在线性时间内完成匹配,极大地提升了处理不可信用户输入时的安全性。

  • 启用方式 :只需将 com.google.re2j 依赖加入类路径即可自动启用。
  • 灵活切换 :开发者可以通过 System.setProperty("jsoup.useRe2j", "false") 回退到原生引擎。
2. 解析深度限制:防御堆栈溢出

为了防止极端嵌套的 HTML 导致 StackOverflowError,新版本为 HTML 和 XML 解析器引入了可配置的最大解析深度(Max Parser Depth)。

  • HTML 解析器 :默认深度设为 512,这与主流浏览器的行为保持一致,既兼顾了兼容性又保护了系统资源。
  • XML 解析器 :默认保持无限深度,但开发者可以通过 Parser.setMaxDepth() 自行设定上限。
3. 规范化与兼容性改进
  • 属性选择器匹配 :现在 jsoup 会严格按照 CSS 规范进行字面量比较,不再自动修剪(trim)选择器值中的空格。例如 [attr=" foo "] 将不再匹配 attr="foo",这确保了与浏览器引擎的一致性。
  • HttpClient 代理修复 :修复了在使用 JDK HttpClient 时忽略系统默认代理(ProxySelector)的问题。
  • 标签分类调整<br> 标签重新被归类为内联标签(Inline Tag),符合开发者的普遍预期及 HTML5 规范。

版本亮点

  1. 线性时间正则匹配 :通过 re2j 彻底解决了正则回溯带来的安全风险,是处理大规模爬虫数据时的重要保障。
  2. 防御性解析策略:新增的解析深度限制有效防止了恶意构造的"嵌套炸弹"攻击。
  3. 内存占用优化 :改进了 StructuralEvaluators 的缓存机制,在多线程环境下能及时清理内存,降低了长生命周期应用的内存压力。
  4. 前瞻性技术支持:率先完成 JDK 25 的 CI 测试,并增加了针对上下文片段解析的 Fuzzer 模糊测试,进一步提升了代码健壮性。

应用场景

  • 安全敏感型爬虫 :当需要根据用户输入的正则规则过滤网页内容时,re2j 能有效防止 ReDoS 攻击。
  • 高并发数据清洗:内存优化和代理修复使得 jsoup 在处理海量网页抓取任务时更加稳定高效。
  • 现代 Java 开发:对于已经迁移到 JDK 21+ 甚至预览版 JDK 25 的项目,1.22.1 版本提供了完美的兼容性保障。

总结

jsoup 1.22.1 不仅仅是一次常规的 Bug 修复更新,它标志着这款老牌解析库在工业级安全性上迈出了重要一步。通过引入线性时间正则引擎和解析深度控制,jsoup 能够更从容地应对复杂的现代 Web 环境。对于追求系统稳定性和安全性的开发者来说,这无疑是一个建议立即升级的版本。

参考资料:

相关推荐
灵感__idea1 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
yinuo2 小时前
轻松接入大语言模型API -04
前端
袋鼠云数栈UED团队3 小时前
基于 Lexical 实现变量输入编辑器
前端·javascript·架构
cipher3 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
UrbanJazzerati3 小时前
非常友好的Vue 3 生命周期详解
前端·面试
AAA阿giao3 小时前
从零构建一个现代登录页:深入解析 Tailwind CSS + Vite + Lucide React 的完整技术栈
前端·css·react.js
兆子龙4 小时前
像 React Hook 一样「自动触发」:用 Git Hook 拦住忘删的测试代码与其它翻车现场
前端·架构
兆子龙5 小时前
用 Auto.js 实现挂机脚本:从找图点击到循环自动化
前端·架构
SuperEugene5 小时前
表单最佳实践:从 v-model 到自定义表单组件(含校验)
前端·javascript·vue.js
昨晚我输给了一辆AE865 小时前
为什么现在不推荐使用 React.FC 了?
前端·react.js·typescript