Skip to content

Commit 0ca2310

Browse files
committed
add model for htmlparser2
1 parent e2a66bf commit 0ca2310

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

javascript/ql/src/semmle/javascript/frameworks/XmlParsers.qll

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,35 @@ module XML {
247247
override js::DataFlow::Node getAResult() { result.asExpr() = this }
248248
}
249249

250+
/**
251+
* An invocation of `htmlparser2`.
252+
*/
253+
private class HtmlParser2Invocation extends XML::ParserInvocation {
254+
js::DataFlow::NewNode parser;
255+
256+
HtmlParser2Invocation() {
257+
parser = js::DataFlow::moduleMember("htmlparser2", "Parser").getAnInstantiation() and
258+
this = parser.getAMemberCall("write").asExpr()
259+
}
260+
261+
override js::Expr getSourceArgument() { result = getArgument(0) }
262+
263+
override predicate resolvesEntities(XML::EntityKind kind) {
264+
// htmlparser2 does not expand entities.
265+
none()
266+
}
267+
268+
override js::DataFlow::Node getAResult() {
269+
result =
270+
parser
271+
.getArgument(0)
272+
.getALocalSource()
273+
.getAPropertySource()
274+
.getAFunctionValue()
275+
.getAParameter()
276+
}
277+
}
278+
250279
private class XMLParserTaintStep extends js::TaintTracking::AdditionalTaintStep {
251280
XML::ParserInvocation parser;
252281

javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,4 @@ typeInferenceMismatch
149149
| xml.js:12:17:12:24 | source() | xml.js:13:14:13:19 | result |
150150
| xml.js:23:18:23:25 | source() | xml.js:20:14:20:17 | attr |
151151
| xml.js:26:27:26:34 | source() | xml.js:26:10:26:39 | convert ... (), {}) |
152+
| xml.js:34:18:34:25 | source() | xml.js:31:18:31:21 | name |

javascript/ql/test/library-tests/TaintTracking/xml.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,13 @@
2525
var convert = require('xml-js');
2626
sink(convert.xml2json(source(), {})); // NOT OK
2727

28+
const htmlparser2 = require("htmlparser2");
29+
const parser = new htmlparser2.Parser({
30+
onopentag(name, attributes) {
31+
sink(name) // NOT OK
32+
}
33+
});
34+
parser.write(source());
35+
parser.end();
36+
2837
})();

0 commit comments

Comments
 (0)