2010-06-08 37 views
1

我有一段JavaScript字符串,來自不受信任的來源,嵌入在onclick標記中,我不確定該字符串的正確編碼方式。下面是HTML的簡化:如何在XML屬性中編碼JavaScript文本?

<input type="button" onclick="alert([ENCODED STRING HERE]);" 
    value="Click me" /> 

我使用含有幾種方法與編碼的Microsoft AntiXss library。該文本嵌入在HTML/XML屬性中,因此使用AntiXss.XmlAttributeEncode方法的XML屬性編碼似乎是合適的。但是,它也是一段JavaScript。因此,使用AntiXss.JavascriptEncode方法的JavaScript編碼似乎也適用。

我應該選擇哪一種方式,讓我不暴露安全漏洞,同時允許文本正確顯示?


UPDATE: 我目前使用的是在這個文本使用 XmlAttributeEncode,並把這個標籤中的自定義屬性中的解決方法。之後,我使用一些JavaScript從這個標籤中讀取它。它基本上是這樣的:

<input type="button" onclick="alert(this.getAttribute('comment');" 
    value="Click me" comment="[XML ATTRIBUTE ENCODED TEXT HERE]" /> 

雖然這完美的作品,並解決了這個問題,我還是如何正確編碼的JavaScript的XML屬性裏面很好奇。

+1

你在做什麼似乎令人困惑。如果JavaScript來自不可信來源,那麼可以做的事情就很少讓它信任。 – 2010-06-08 10:23:36

+0

確實沒有辦法使文本中的信息可信。然而,訣竅是防止任何腳本注入攻擊發生,並防止任何字符導致JavaScript錯誤。正確的編碼將解決這個問題,這就是我想知道的。如何正確編碼這個。 – Steven 2010-06-08 11:06:36

回答

5

正確的答案是對文本進行雙重編碼。先用JavascriptEncode,然後用XmlAttributeEncode。這背後的基本原理是,xml/html屬性中的所有內容都應該是XML屬性編碼的。瀏覽器的解析器會將其解釋爲xml屬性並以此方式進行解碼。瀏覽器會將這個解碼後的文本提供給javascript解釋器,因此它應該被正確編碼以防止安全漏洞。

這種雙重編碼不會導致無效的結果,因爲瀏覽器也會對此文本進行雙重解碼(因爲涉及兩個單獨的解釋器)。這是一個正確編碼的例子。

string unsafeText = "Hello <unsafe> ');alert('xss');alert('"; 
string javaEncoded = AntiXss.JavascriptEncode(unsafeText, false); 
ENCODED_STRING = AntiXss.XmlAttributeEncode(javaEncoded); 

<input type="button" onclick="alert('[ENCODED_STRING]');" 
    value="Click me" /> 

雖然雙編碼是這樣做的唯一正確的道路,我想指出,使用只有JavaScript編碼通常會產生正確的結果。這裏的約束是屬性的文本放在引號之間。

JavaScript編碼使用與HTML/XML屬性編碼相同的白名單(空格字符除外)。它們之間的區別在於不安全的字符是如何編碼的。 Javascript將它們編碼爲\ xXX和\ uXXXX(如\ u01A3),而XML屬性將它們編碼爲& #XX;和& #XXXX; (如&#01A3;)。使用JavaScript編碼對文本進行編碼時,只剩下兩個字符,它們將由XML屬性編碼器再次編碼,即空格字符和反斜槓字符。這兩個字符只會在屬性文本不包含在引號之間時出現問題。

但是請注意,在這種情況下只使用XML屬性編碼將不會產生正確的結果。

+0

很好的答案,它確實在這裏放置了一些作品。謝謝! – 2013-06-27 05:43:51

2

在單獨的<script>標記中安裝onclick處理函數。

<input type="button" id="clickMeButton" value="Click me" /> 

... 

<script type="text/javascript"> 
... 
document.getElementById('clickMeButton').onclick = function() { 
    alert([ENCODED STRING HERE using AntiXss.JavascriptEncode]); 
} 
... 
</script> 
2

也許你應該嘗試一個base64編碼。它不會在HTML中包含無效數據(只要將編碼的字符串放在單引號中),並且您可以使用javascript對其進行解碼。