OWASP Java安全库发布新版本:请及时升级
OWASP Java 安全库:请更新!
Foojay 的读者们,大家好!
我一直在努力让两个 Java 安全库跟上最新版本:OWASP Java Encoder 和 OWASP Java HTML Sanitizer。这两个库仍然被世界各地大量应用和安全产品使用。它们都有了新版本,我也希望更多 Java 开发者重新关注它们。
我的请求很简单:如果你在使用它们,请更新! 如果它们对你的应用很重要,我也很希望听到你的反馈。
我最近在 Java Champions 邮件列表上发了一则简短说明。Frank Delporte 邀请我向 Foojay 社区多分享一些内容。谢谢你,Frank!下面会介绍这两个库做什么、有哪些变化,以及我会从哪里开始升级。
值得关注的版本
截至 2026 年 10 月 21 日,当前版本为:
这些链接指向本文讨论的具体版本。如果你稍后才读到这篇文章,请查看各项目的 releases 页面以获取更新版本。
Java Encoder:将文本放入正确的输出上下文
OWASP Java Encoder 提供上下文相关的输出编码。当不可信文本进入页面时,你需要根据它将落入的位置进行编码。HTML 文本和 HTML 属性属于不同的上下文。该 API 让这一选择变得明确。
核心库没有运行时依赖,并支持 Java 8 及更高版本。使用 Maven 添加:
下面是一个小型可运行示例,展示了两种输出上下文:
第一次调用用于 HTML 元素内部的文本。第二次用于带引号的普通 HTML 属性中的值。标签名和属性名由应用固定。你可以在 Java Encoder 文档中找到其他上下文及其限制。
如果你的模板引擎已经能根据值的目标位置正确转义,就使用那层保护,避免再增加一次编码。在渲染值、并且清楚其上下文时进行编码。另外,请不要把 HTML 属性编码器当作可以把任意输入放进事件处理器或未经检查的 URL 的许可。OWASP XSS 防护速查表涵盖了这些区别。
Encoder 有哪些变化
有两个版本细节我希望大家注意。
第一,1.5.0 修复了一个安全问题,涉及编码片段与可信文本相邻的情况。编码器看到的是你传入的值;浏览器看到的是组装后的页面。在修复之前,该边界两侧的片段可能组合成危险的 HTML 或 XML 分隔符。已发布的公告说明了受影响的上下文和版本。
第二,1.6.0 在保留这些保护的同时改进了 JavaScript 输出。它减少了通用 JavaScript 编码器和块级 JavaScript 编码器中不必要的字母转义。它没有引入新的编码器安全修复。公共 API 和 Java 8 运行时基线保持不变,但编码后的字节以及部分流式行为确实发生了变化。
这意味着比较精确字符串的测试可能需要关注。如果你将 EncodedWriter 与通用或块级 JavaScript 编码器一起使用,在直接写入底层 writer 之前请先 flush 它。流式处理细节请阅读 1.6.0 发行说明。
对于 JSP 应用,请让核心库和相应的 JSP 适配器保持版本一致。根据容器使用的是 javax 还是 Jakarta API 选择适配器。另外请检查 encoder-esapi:该适配器已退役,没有受支持的版本。项目提供了 ESAPI 适配器迁移指南。
HTML Sanitizer:保留你真正想要的 HTML
有时人们需要提交带格式的内容:包含段落的描述、包含粗体文本的评论,或支持工单中的链接。如果对所有标记都进行编码,标签会作为文本显示。对于这些功能,OWASP Java HTML Sanitizer 允许你定义应用接受的 HTML,并移除策略不允许的内容。
依赖如下:
下面是一个允许段落、粗体文本和强调文本的小型策略:
输出为:
从满足功能需求的最小策略开始。此示例不允许属性、图片、链接或 CSS。项目的策略示例展示了如何添加特定能力。
在预期的 HTML 内容上下文中使用返回的 HTML。不要对值进行清洗后丢弃结果,然后渲染原始值。还要小心之后任何会更改标记的操作;后续转换可能会让这层保护失效。清洗后的 HTML 仍然是 HTML,因此它并不自动适合放入 JavaScript 字符串或属性值。
Sanitizer 有哪些变化
近期版本包含了围绕 HTML 解析和 CSS 处理的安全性与健壮性工作。一个例子是关于深层嵌套 CSS 函数的公告:受影响版本在清洗 style 属性时可能耗尽线程栈。版本 20260924.1 引入了嵌套限制。如果你允许样式,请在升级测试中包含有代表性的 CSS。
最新版本 20261011.1 解决了 Java 8 构建中强制依赖字节码版本时的打包问题。Java 10 兼容实现现在位于 JAR 的版本化目录中,并移除了一个不必要的类。在默认的非严格模式下使用 Maven Enforcer 的 enforceBytecodeVersion 规则的应用,可以移除针对这两个类的变通方案。变更日志中有确切细节和更早的修复。
给升级多一点关注
我会先检查你的应用实际解析到的版本。依赖可能通过另一个库传入,某个 POM 中的版本不一定是已部署应用中的版本。
然后针对用户实际会做的事情来试用更新。对于 Encoder,检查输出上下文以及任何依赖精确编码字节的测试。对于 Sanitizer,用真实编辑器输出、普通格式以及回归测试中已有的畸形输入来测试你自己的策略。既要检查合法内容仍然有效,也要检查不需要的内容被移除。
升级版本也是审视集成方式的好时机。值在哪里渲染?谁负责清洗策略?之后是否有另一个组件修改 HTML?趁代码就在眼前,这些都是值得回答的问题。
期待你的反馈
如果这两个库中的任何一个是你应用或产品的一部分,请试用当前版本,并告诉我们效果如何。一个包含版本、策略或编码器方法、预期结果和实际结果的小型复现会非常有帮助。也欢迎兼容性报告和文档修复。
对于普通缺陷,请使用 Encoder 问题跟踪器或 Sanitizer 问题跟踪器。对于疑似漏洞,请遵循项目的私下报告流程:Encoder 安全策略或 Sanitizer 安全策略。
感谢所有维护、测试、审查和使用这些项目的人。让广泛使用的安全库保持健康,需要有人愿意在细节上投入时间。感谢大家的帮助。
请更新、试用一下,并告诉我们你的发现!
祝好,
Jim## 加入讨论
[LOADING...]
[LOADING...]Steve Poole 2026年8月18日 · 885 次浏览
你的 AI 助手正在替你选择依赖
[LOADING...]
[LOADING...]Jérôme LELEU 2026年10月23日
如何使用 OpenID Connect 和 pac4j 保护 Spring Boot 应用
[LOADING...]
[LOADING...]Arpan Sharma 2026年9月28日 · 224 次浏览