Skip to content

Commit e015082

Browse files
committed
enable FEATURE_SECURE_PROCESSING for the MSXML XSLProcessor
1 parent 77aeaa8 commit e015082

File tree

3 files changed

+65
-1
lines changed

3 files changed

+65
-1
lines changed

src/changes/changes.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
<body>
1010
<release version="3.9.0" date="December xx, 2023" description="Bugfixes">
11+
<action type="fix" dev="rbri">
12+
Enable FEATURE_SECURE_PROCESSING for the MSXML XSLProcessor.
13+
</action>
1114
<action type="fix" dev="René Schwietzke">
1215
neko: fix wrong error processing for some unicode entities.
1316
</action>

src/main/java/org/htmlunit/activex/javascript/msxml/XSLProcessor.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.HashMap;
2121
import java.util.Map;
2222

23+
import javax.xml.XMLConstants;
2324
import javax.xml.parsers.DocumentBuilderFactory;
2425
import javax.xml.transform.Result;
2526
import javax.xml.transform.Source;
@@ -180,7 +181,15 @@ private Object transform(final XMLDOMNode source) {
180181

181182
final DOMResult result = new DOMResult(containerElement);
182183

183-
final Transformer transformer = TransformerFactory.newInstance().newTransformer(xsltSource);
184+
final TransformerFactory transformerFactory = TransformerFactory.newInstance();
185+
186+
// By default, the JDK turns on FSP for DOM and SAX parsers and XML schema validators,
187+
// which sets a number of processing limits on the processors. Conversely, by default,
188+
// the JDK turns off FSP for transformers and XPath, which enables extension functions for XSLT and XPath.
189+
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
190+
191+
final Transformer transformer = transformerFactory.newTransformer(xsltSource);
192+
184193
for (final Map.Entry<String, Object> entry : parameters_.entrySet()) {
185194
transformer.setParameter(entry.getKey(), entry.getValue());
186195
}

src/test/java/org/htmlunit/activex/javascript/msxml/XSLProcessorTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,4 +156,56 @@ public void transform() throws Exception {
156156

157157
loadPageVerifyTitle2(createTestHTML(html));
158158
}
159+
160+
/**
161+
* @throws Exception if the test fails
162+
*/
163+
@Test
164+
@Alerts(DEFAULT = "no ActiveX",
165+
IE = {"preparation done", "exception"})
166+
public void testSecurity() throws Exception {
167+
final String html = "<html><head>\n"
168+
+ "<script>\n"
169+
+ LOG_TITLE_FUNCTION
170+
+ " function test() {\n"
171+
+ ACTIVEX_CHECK
172+
+ " try {"
173+
+ " var xmlDoc = " + callLoadXMLDOMDocumentFromURL("'" + URL_SECOND + "1'") + ";\n"
174+
+ " var xslDoc = new ActiveXObject('Msxml2.FreeThreadedDOMDocument.3.0');\n"
175+
+ " xslDoc.async = false;\n"
176+
+ " xslDoc.load('" + URL_SECOND + "2');\n"
177+
+ " var xslt = new ActiveXObject('Msxml2.XSLTemplate.3.0');\n"
178+
+ " xslt.stylesheet = xslDoc;\n"
179+
+ " var xslProc = xslt.createProcessor();\n"
180+
+ " xslProc.input = xmlDoc;\n"
181+
+ " log('preparation done');\n"
182+
+ " xslProc.transform();\n"
183+
+ " log(newxslProc.output);\n"
184+
+ " } catch(e) { log('exception'); }\n"
185+
+ " }\n"
186+
+ LOAD_XMLDOMDOCUMENT_FROM_URL_FUNCTION
187+
+ "</script></head>"
188+
+ "<body onload='test()'>\n"
189+
+ "</body></html>";
190+
191+
final String xml
192+
= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
193+
+ "<s></s>";
194+
195+
final String xsl
196+
= " <xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" "
197+
+ "xmlns:rt=\"http://xml.apache.org/xalan/java/java.lang.Runtime\" "
198+
+ "xmlns:ob=\"http://xml.apache.org/xalan/java/java.lang.Object\">\r\n"
199+
+ " <xsl:template match='/'>\n"
200+
+ " <xsl:variable name='rtobject' select='rt:getRuntime()'/>\n"
201+
+ " <xsl:variable name=\"rtString\" select=\"ob:toString($rtobject)\"/>\n"
202+
+ " <xsl:value-of select=\"$rtString\"/>\n"
203+
+ " </xsl:template>\r\n"
204+
+ " </xsl:stylesheet>";
205+
206+
getMockWebConnection().setResponse(new URL(URL_SECOND, "1"), xml, MimeType.TEXT_XML);
207+
getMockWebConnection().setResponse(new URL(URL_SECOND, "2"), xsl, MimeType.TEXT_XML);
208+
209+
loadPageVerifyTitle2(html);
210+
}
159211
}

0 commit comments

Comments
 (0)