使用用户控制的样式表进行 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
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));
}
参考¶
维基百科:XSLT。
Java 教程:使用 XSLT 转换 XML 数据。
常见弱点枚举:CWE-74。