問題沒有從這個出現:
Why does the browser modify the ID of an HTML element that contains &#x?此代碼是否容易受到XSS攻擊?
考慮到以下網頁:
<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>
的<p>
元素的id
包含爲了防止XSS攻擊了逃脫字符。 HTML部分和JS部分由服務器生成,服務器在兩個部分插入相同的轉義值(可能來自不安全的源)。
服務器逸出在&#x
格式以下字符範圍:
- 爲0x00 – 0x2D
- 0x3A – 0x40的
- 0x5B – 0x5E
- 0x60的
- 0x7B – 0xFF的
- 0x0100 – 0xFFFF的
換句話說:是不逃過字符只有:
- 器0x2E – 0x39(
.
,/
,)
- 的0x41 – 0x5A(
A
–Z
) - 0x5F(
_
) - 0x61 – 0x7A(
a
–z
)
現在,我得通過JavaScript訪問該<p>
。引用問題中的函數echoValue()
始終失敗,因爲瀏覽器在HTML部分中將$
轉換爲$
,但在JS部分中將其保留爲$
。
因此,Gareth想出了an answer這是簡單和有效的。
我擔心的是,當使用參考答案中提供的decodeEntity()
函數時,通過轉義動態字符串消除的XSS攻擊的可能性將再次出現。
可能有人指出是否可能有安全問題(哪個?)否(爲什麼不呢?)?
只是讓服務器不在腳本內部轉義它。 – Bergi