2010-06-08 34 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对其进行解码。