Skip to content

Commit bb0771b

Browse files
author
Max Schaefer
committed
JavaScript: Deal with escape-unescape-escape (and similar) chains.
1 parent 8c133ff commit bb0771b

2 files changed

Lines changed: 10 additions & 2 deletions

File tree

javascript/ql/src/Security/CWE-116/DoubleEscaping.ql

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@ abstract class Replacement extends DataFlow::Node {
135135
exists(Replacement pred | pred = this.getPreviousReplacement() |
136136
if pred.escapes(_, metachar)
137137
then result = pred
138-
else result = pred.getAnEarlierEscaping(metachar)
138+
else (
139+
not pred.unescapes(metachar, _) and result = pred.getAnEarlierEscaping(metachar)
140+
)
139141
)
140142
}
141143

@@ -147,7 +149,9 @@ abstract class Replacement extends DataFlow::Node {
147149
exists(Replacement succ | this = succ.getPreviousReplacement() |
148150
if succ.unescapes(metachar, _)
149151
then result = succ
150-
else result = succ.getALaterUnescaping(metachar)
152+
else (
153+
not succ.escapes(_, metachar) and result = succ.getALaterUnescaping(metachar)
154+
)
151155
)
152156
}
153157
}

javascript/ql/test/query-tests/Security/CWE-116/DoubleEscaping/tst.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,7 @@ function testWithCapturedVar(x) {
130130
captured = captured.replace(/\\/g, "\\\\");
131131
})();
132132
}
133+
134+
function cloneAndStringify(s) {
135+
return JSON.stringify(JSON.parse(JSON.stringify(s)));
136+
}

0 commit comments

Comments
 (0)