CodeQL 文档

使用用户控制的样式表进行 XSLT 转换

ID: java/xslt-injection
Kind: path-problem
Security severity: 9.8
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-074
Query suites:
   - java-code-scanning.qls
   - java-security-extended.qls
   - java-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

XSLT(可扩展样式表语言转换)是一种用于将 XML 文档转换为其他 XML 文档或其他格式的语言。处理未经验证的 XSLT 样式表可能使攻击者能够从文件系统中读取任意文件或执行任意代码。

建议

一般建议是不处理不可信的 XSLT 样式表。如果必须处理用户提供的样式表,请启用安全处理模式。

示例

在以下示例中,代码从用户处接受 XSLT 样式表并进行处理。

在第一个示例中,解析并处理用户提供的 XSLT 样式表。

在第二个示例中,启用安全处理模式。

import javax.xml.XMLConstants;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public void transform(Socket socket, String inputXml) throws Exception {
  StreamSource xslt = new StreamSource(socket.getInputStream());
  StreamSource xml = new StreamSource(new StringReader(inputXml));
  StringWriter result = new StringWriter();
  TransformerFactory factory = TransformerFactory.newInstance();

  // BAD: User provided XSLT stylesheet is processed
  factory.newTransformer(xslt).transform(xml, new StreamResult(result));

  // GOOD: The secure processing mode is enabled
  factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
  factory.newTransformer(xslt).transform(xml, new StreamResult(result));
}  

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私