好。这个夜晚对我来说是一个非常奇怪的夜晚。我很抱歉在之前创建了另外两个问题后创建了一个新问题,但这是另一个论点。如果我在这里得到答案,我也会得到这些问题的答案,所以请有人听我说试试。
这一切都始于一个简单的脚本JS,它通过一个aspx代码隐藏文件生成。 在控件上,我必须以这种方式放置JavaScript:
this.MyTxtBox.Attributes["onfocus"] = "windows.alert('Hello World!');";
行。你可能会想,问题出在哪里?问题是ASP.NET 4.0对所有内容进行编码,我说一切都是为了避免在网站上执行XSS。嗯,这似乎不是一个问题,但如果你看看渲染的页面,你会像我一样跳到椅子上:
<textarea id="..." onfocus="windows.alert('Hello World!');"></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没有提供一种机制来避免编码,仅仅是因为这个原因!
答案 0 :(得分:8)
回复:
<textarea id="..." onfocus="windows.alert('Hello World!');"></textarea>
没有什么奇怪的(除了你使用windows.alert
而不是window.alert
)。它应该工作正常(并且; example)。 HTML 解析器解析HTML属性值,并处理'
等处理实体。它最终交给JavaScript解释器的JavaScript源代码将在其中引用。浏览器不会将文字字符& # 3 9 ;
传递给JavaScript解释器。
它与:
相同<input type='text' value="This is a 'funny' 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&hl=en'>Search for foo</a>
<!-- ^^^^^--- difference here -->
...因为HTML解析器会解析该值,然后将解析的结果分配给href
属性。当然,&
引入了一个字符实体,因此要真正获得&
,您必须在HTML中的任何地方使用&
。 (同样,如果&
后面的内容看起来不像实体,大多数浏览器都会让你逃脱它。但这可能并且会咬你。)