function escapeHtml(s) { var amp = /&/g, lt = //g; return s.toString() .replace(amp, '&') .replace(lt, '<') .replace(gt, '>'); } function escapeAttr(s) { return s.toString() .replace(/'/g, '%22') .replace(/"/g, '%27'); } function test() { var tainted = window.name; var elt = document.createElement(); elt.innerHTML = "" + escapeHtml(tainted) + ""; // OK elt.innerHTML = "
" + escapeAttr(tainted) + "
"; // NOT OK, but not flagged - [INCONSISTENCY] const regex = /[<>'"&]/; if (regex.test(tainted)) { elt.innerHTML = '' + tainted + ''; // NOT OK } else { elt.innerHTML = '' + tainted + ''; // OK } if (!regex.test(tainted)) { elt.innerHTML = '' + tainted + ''; // OK } else { elt.innerHTML = '' + tainted + ''; // NOT OK } if (regex.exec(tainted)) { elt.innerHTML = '' + tainted + ''; // NOT OK } else { elt.innerHTML = '' + tainted + ''; // OK } if (regex.exec(tainted) != null) { elt.innerHTML = '' + tainted + ''; // NOT OK } else { elt.innerHTML = '' + tainted + ''; // OK } if (regex.exec(tainted) == null) { elt.innerHTML = '' + tainted + ''; // OK } else { elt.innerHTML = '' + tainted + ''; // NOT OK } elt.innerHTML = tainted.replace(/<\w+/g, ''); // NOT OK }