HTML编码的字符串由javascript引擎识别,怎么可能?

时间:2010-12-10 23:09:07

标签: javascript asp.net html-encode

好。这个夜晚对我来说是一个非常奇怪的夜晚。我很抱歉在之前创建了另外两个问题后创建了一个新问题,但这是另一个论点。如果我在这里得到答案,我也会得到这些问题的答案,所以请有人听我说试试。

这一切都始于一个简单的脚本JS,它通过一个aspx代码隐藏文件生成。 在控件上,我必须以这种方式放置JavaScript:

this.MyTxtBox.Attributes["onfocus"] = "windows.alert('Hello World!');";

行。你可能会想,问题出在哪里?问题是ASP.NET 4.0对所有内容进行编码,我说一切都是为了避免在网站上执行XSS。嗯,这似乎不是一个问题,但如果你看看渲染的页面,你会像我一样跳到椅子上:

<textarea id="..." onfocus="windows.alert(&#39;Hello World!&#39;);"></textarea>

正如你可以看到html,最终的html有点奇怪...... JavaScript引擎不应该接受这种情况。 所以我开始提出这个问题:

ASP.NET quote character encoding causes problems when setting a control's property

Asp.Net encoding configuration

好吧我还没有得到任何答案是的我们无法理解在.net配置中需要修改的内容是为了不让这种情况发生。

但现在我考虑一件事,一件重要的事情:JavaScript引擎有效! 即使有那些不应该被解释的奇怪代码......

我希望到现在为止一切都很清楚......现在的问题是:

这是JavaScript引擎的正常情况吗? 每个浏览器是否都能正确解释用编码字符串替换引号的JavaScript?

如果这是真的,我必须假设.net没有提供一种机制来避免编码,仅仅是因为这个原因!

1 个答案:

答案 0 :(得分:8)

回复:

<textarea id="..." onfocus="windows.alert(&#39;Hello World!&#39;);"></textarea>

没有什么奇怪的(除了你使用windows.alert而不是window.alert)。它应该工作正常(并且; example)。 HTML 解析器解析HTML属性值,并处理&#39;等处理实体。它最终交给JavaScript解释器的JavaScript源代码将在其中引用。浏览器不会将文字字符& # 3 9 ;传递给JavaScript解释器。

它与:

相同
<input type='text' value="This is a &#39;funny&#39; value too">

HTML解析器处理实体,分配给输入的实际值为This is a "funny" value too

顺便说一句,这也是为什么这个看似无辜的HTML实际上是错误的并且验证失败的原因(尽管大多数浏览器都会允许):

<a href='http://www.google.com/search?q=foo&hl=en'>Search for foo</a>

更准确地说,应该是:

<a href='http://www.google.com/search?q=foo&amp;hl=en'>Search for foo</a>
<!--                                       ^^^^^--- difference here   -->

...因为HTML解析器会解析该值,然后将解析的结果分配给href属性。当然,&引入了一个字符实体,因此要真正获得&,您必须在HTML中的任何地方使用&amp;。 (同样,如果&后面的内容看起来不像实体,大多数浏览器都会让你逃脱它。但这可能并且会咬你。)