java - 如何防止 TransformerFactory 上的 XML 外部实体注入(inject)

标签 java xml xslt fortify xxe

我的问题:

Fortify 4.2.1 将以下代码标记为易受 XML 外部实体攻击。

TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xslStream = new StreamSource(inputXSL);
Transformer transformer = factory.newTransformer(xslStream);

我试过的解决方法:

  1. XMLConstants.FEATURE_SECURE_PROCESSING 的 TransformerFactory 功能设置为 true。

  2. 研究了向 TransformerFactory 提供更多此类功能的可能性,就像我们为 DOM 和 SAX 解析器所做的那样。例如不允许文档类型声明等。但 TransformerFactoryImpl 似乎不接受任何其他 XMLConstants.FEATURE_SECURE_PROCESSING Impl Code

请向我指出您认为我可能没有通过的任何资源或此问题的可能解决方案。

最佳答案

TransformerFactory trfactory = TransformerFactory.newInstance();
trfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");

我认为这就足够了。

Fortify 会建议以下功能,但这些功能不适用于 TransformerFactory

factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

我们可能需要更改为不同的解析器才能使用它们。

关于java - 如何防止 TransformerFactory 上的 XML 外部实体注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32178558/

相关文章:

java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Unknown column 'bro' in 'where clause'

xml - 为什么在使用 DTD 解析此 XML 文件时出现错误 "StartTag: Invalid element name"

xslt - 根据某些条件从 xml 中过滤掉标签

java - EclipseLink 2.7.0 和 JPA API 2.2.0 - 签名不匹配

java - 正则表达式在java中包含负数

c# - 从另一个页面读取 IsolatedStorage 中的设置

javascript - 在 XSLT 中通过 onclick 事件传递变量无法正常工作

xml - XSLT 命名空间

java - 无法点击 'Text' 内的 'dropdown list'

android - 如何证明 Android Studio 中的内容 - XML