Skip to content

Commit e60628d

Browse files
committed
add global replacements using inverted char classes as a sanitizer for DOM based XSS
1 parent 310baab commit e60628d

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

javascript/ql/src/semmle/javascript/security/dataflow/Xss.qll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,14 @@ module Shared {
3434
class MetacharEscapeSanitizer extends Sanitizer, StringReplaceCall {
3535
MetacharEscapeSanitizer() {
3636
isGlobal() and
37-
RegExp::alwaysMatchesMetaCharacter(getRegExp().getRoot(), ["<", "'", "\""])
37+
(
38+
RegExp::alwaysMatchesMetaCharacter(getRegExp().getRoot(), ["<", "'", "\""])
39+
or
40+
// or it's a global inverted char class.
41+
getRegExp().getRoot().(RegExpCharacterClass).isInverted()
42+
or
43+
getRegExp().getRoot().(RegExpQuantifier).getAChild().(RegExpCharacterClass).isInverted()
44+
)
3845
}
3946
}
4047

javascript/ql/test/query-tests/Security/CWE-079/XssThroughDom/xss-through-dom.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,8 @@
8585

8686
$("#id").html(anser.ansiToHtml(text)); // NOT OK
8787
$("#id").html(new anser().process(text)); // NOT OK
88+
89+
$("section h1").each(function(){
90+
$("nav ul").append("<a href='#" + $(this).text().toLowerCase().replace(/ /g, '-').replace(/[^\w-]+/g,'') + "'>Section</a>"); // OK
91+
});
8892
})();

0 commit comments

Comments
 (0)