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

And*_*dry 1 javascript asp.net html-encode

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

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

this.MyTxtBox.Attributes["onfocus"] = "windows.alert('Hello World!');";
Run Code Online (Sandbox Code Playgroud)

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

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

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

ASP.NET引号字符编码在设置控件的属性时会导致问题

Asp.Net编码配置

好吧,我仍然没有得到任何答案是的我们无法理解在.net配置中需要修改的内容,以免发生这种情况.

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

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

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

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

T.J*_*der 8

回覆:

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

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

它与以下相同:

<input type='text' value="This is a &#39;funny&#39; value too">
Run Code Online (Sandbox Code Playgroud)

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

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

<a href='http://www.google.com/search?q=foo&hl=en'>Search for foo</a>
Run Code Online (Sandbox Code Playgroud)

更准确地说,那应该是:

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

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