Further JSON reduction optimizations.

This commit is contained in:
hackademix 2019-05-28 16:48:58 +02:00
parent b935c22f55
commit 22bceb6c97
1 changed files with 3 additions and 4 deletions

View File

@ -172,8 +172,7 @@ XSS.InjectionChecker = (async () => {
const toStringRx = /^function\s*toString\(\)\s*{\s*\[native code\]\s*\}$/; const toStringRx = /^function\s*toString\(\)\s*{\s*\[native code\]\s*\}$/;
// optimistic case first, one big JSON block // optimistic case first, one big JSON block
s = s.replace(/[^{"]+=/, "") let m = s.match(/{[^]+}|\[[^=]*{[^]*}[^]*\]/);
let m = s.match(/{[^]+}|\[[^]*{[^]*}[^]*\]/);
if (!m) return s; if (!m) return s;
// semicolon-separated JSON chunks, like on syndication.twitter.com // semicolon-separated JSON chunks, like on syndication.twitter.com
@ -201,15 +200,15 @@ XSS.InjectionChecker = (async () => {
let iterations = 0; let iterations = 0;
while (start > -1 && end - start > 1) { while (start > -1 && end - start > 1) {
expr = s.substring(start, end + 1); expr = s.substring(start, end + 1);
if (expr === prevExpr) break;
let before = s.substring(0, start); let before = s.substring(0, start);
let after = s.substring(end + 1); let after = s.substring(end + 1);
if (expr === prevExpr) break;
iterations++; iterations++;
if (await this.timing.pause()) { if (await this.timing.pause()) {
this.log(`JSON reduction iterations ${iterations++}, elapsed ${this.timing.elapsed}, expr ${expr}`); this.log(`JSON reduction iterations ${iterations++}, elapsed ${this.timing.elapsed}, expr ${expr}`);
} }
end = s.lastIndexOf("}", end - 1); end = s.lastIndexOf("}", end - 1);
if (end === -1) { if (end < start) {
start = s.indexOf("{", start + 1); start = s.indexOf("{", start + 1);
end = s.lastIndexOf("}"); end = s.lastIndexOf("}");
} }