2013-09-23 49 views
0

我想用我們的代碼阻止XSS,問題是它可能需要JS和html轉義,並且可能有點棘手。跨站腳本問題

下面的示例代碼類似於我們的代碼

<script> 
    var CURRENT_VALUE = '<img src=1 onerror=alert(1)>'; 
    document.getElementById("valueBox").innerHTML = CURRENT_VALUE; 
</script> 

讓我們假設CURRENT_VALUE動態插入。那麼在這種情況下我該怎麼做,我知道一個簡單的HTML編碼可能無法正常工作,因爲攻擊者可能會傳遞unicode轉義值,當JS解析器清除它時,它可能會被轉儲到文檔中。

那麼,什麼是正確的做法,

我應該先別JS逃避,只是之前的document.getElementById做HTML逃逸?這將如何工作?

假設CURRENT_VALUE是說十六進制編碼,幷包含/ x027img ...等等

+0

我沒有看到這可怎麼XSS相關Preve(?) nting XSS更重要的是對輸入服務器端的內容進行消毒。如果您點擊「查看源代碼」,上面隱藏了,但它不能防止惡意代碼插入到輸入框或textarea中。 – davidkonrad

+0

我認爲任何客戶端在安全性方面都非常無用。你必須假設它可以被操縱,並處理服務器端正確/期望值的驗證。 –

+0

可以使用服務器端JS轉義,但如果我必須使用服務器端HTML轉義,那麼我需要按順序執行第一個html轉義,接下來由JS轉義,因爲html是最後解釋的,但它可能存在問題當在非html上下文中解釋時,因此我可能必須做服務器端JS轉義,然後是客戶端JavaScript轉義,但我不確定這一點。 – Kalyan

回答

1

現在我想明白你在哪裏標題 - 插入內容作爲TextNode做了一些格式:

var CURRENT_VALUE = '<img src=1 onerror=alert(1)>'; 
var node = document.createTextNode(CURRENT_VALUE); 
var valueBox = document.getElementById("valueBox"); 
valueBox.appendChild(node); 

console.log(valueBox.innerHTML); 

,如果你看一下控制檯輸出插入HTML現在是:

&lt;img src=1 onerror=alert(1)&gt; 
+0

是的,謝謝:),但我需要清楚什麼時候應該完成這個轉義,如果CURRENT_VALUE已經使用JS十六進制編碼進行轉義,那麼我們所擁有的只是/ x026/x034種類的權利?那麼輸入的createtextnode會被正確的html轉義?感謝您的答案,雖然 – Kalyan

+0

@Kalyan如果它的JS十六進制轉義,那麼'createTextNode'將把它解釋爲正確的轉義值,一切都會好的。 – SilverlightFox

+0

謝謝你有道理,它現在也可以在非html上下文中使用createTextNode – Kalyan