信頼できないURIを解析していますが、そのURIフードを尊重する必要があります。私はjavascript:
リンクから保護しようとしていますが、次のようなことがあるので、それを繰り返す必要があるように感じます。
javascriptjavascript::
そして、すべてのインスタンスを取り除いた後javascript:
、私たちの古い友人javascript:
をもう一度取り戻します。
私の他の懸念は、同様にネストされたUnicodeエンティティです。たとえば、次のようになります。
"jAvascript:alert('pwnt')"
...しかし、私たちも持つことができます:
"j&#塁vascript:alert('pwnt')"
...私はそれを間違っているように見えますが(成功した攻撃者は明らかにそうしません)。
function resolveEntities(uri) {
var s = document.createElement('span')
, nestTally = uri.match(/&/) ? 0 : 1
, limitReached = false;
s.innerHTML = uri;
while (s.textContent.match(/&/)) {
s.innerHTML = s.textContent;
if(nestTally++ >= 5) {
limitReached = true;
break;
}
}
return encodeURI(s.textContent);
}