疑問は次のようなものから生じました:
&#x を含む HTML 要素の ID をブラウザーが変更するのはなぜですか?
次の Web ページがあるとします。
<html>
<head>
<script type="text/javascript">
// --------------------------------------------------------
// could calling this method produce an XSS attack?
// --------------------------------------------------------
function decodeEntity(text){
text = text.replace(/<(.*?)>/g,''); // strip out all HTML tags, to prevent possible XSS
var div = document.createElement('div');
div.innerHTML = text;
return div.textContent?div.textContent:div.innerText;
}
function echoValue(){
var e = document.getElementById(decodeEntity("/path/$whatever"));
if(e) {
alert(e.innerHTML);
}
else {
alert("not found\n");
}
}
</script>
</head>
<body>
<p id="/path/$whatever">The Value</p>
<button onclick="echoValue()">Tell me</button>
</body>
</html>
要素のにid
は、<p>
XSS 攻撃を防ぐためにエスケープされた文字が含まれています。HTML 部分と JS 部分はサーバーによって生成され、サーバーは両方の部分に同じエスケープ値 (セキュリティで保護されていないソースに由来する可能性があります) を挿入します。
&#x
サーバーは、次の文字範囲を次の形式でエスケープします。
- 0x00 – 0x2D
- 0x3A – 0x40
- 0x5B – 0x5E
- 0x60
- 0x7B – 0xFF
- 0x0100 – 0xFFFF
つまり、エスケープされない唯一の文字は次のとおりです。
- 0x2E – 0x39 (
.
,/
,0123456789
) - 0x41 – 0x5A (
A
–Z
) - 0x5F (
_
) - 0x61 – 0x7A (
a
–z
)
<p>
ここで、 javascriptを介してアクセスする必要があります。参照されている質問の関数は、ブラウザが HTML 部分に変換されますが、JS 部分のままでechoValue()
あるため、常に失敗しました。$
$
$
そこで、Garethはシンプルで機能する答えを思いつきました。
decodeEntity()
私の懸念は、参照されている回答で提供されている関数を使用すると、動的文字列をエスケープすることで排除された XSS 攻撃の可能性が再び発生することです。
セキュリティ上の懸念があるかどうか (どれ? ) ないか (なぜ?)指摘できますか?