编码"在Javascript onclick事件中被视为真正的双引号-为什么

Encoded " treated as a real double quote in Javascript onclick event - why?

本文关键字:为什么 quot amp Javascript 事件 onclick 编码      更新时间:2023-09-26

我注意到一些我很难理解的行为。考虑以下代码片段:

<input type="button" value="test" onclick="window.location.href = &quot;foo;bar;&quot;">

当我点击测试按钮时,它会将页面重定向到http://www.example.com/foo;酒吧所以在&quot;字符被视为字符串文字,就好像&quot;是真正的引号字符。我的期望是;quot;字符是编码的,它们不会影响代码的执行,所以我希望foo和bar之间的分号终止对window.location.href的赋值,并让javascript将bar视为一个单独的语句。

只是为了进一步确认这就是正在发生的事情,如果我删除第一个&quot;然后点击按钮我在控制台中得到以下错误:

SyntaxError:未终止的字符串文字

window.location.href=foo;酒吧"

(用一个箭头指示尾部",这实际上是一个&",这是问题所在。)

我错过了什么?javascript引擎是否在执行编码字符之前对其进行解码?如果这调用了用户输入,并且应用程序尝试将引号字符编码为&quot;为了防止跨站点脚本,攻击者是否仍然能够爆发,因为他的&quot;仍然会被尊为真正的引用吗?

您的解析顺序似乎颠倒了。

HTML解析器将属性的值转换为文本(因此&quot;变为")。该文本被然后传递给JavaScript引擎。

所以你所拥有的一切都很好,并且可以正常工作。


javascript引擎是否在执行编码字符之前对其进行解码?

不,在JavaScript引擎看到它之前,HTML解析器就会对它进行解码

如果这涉及到用户输入,并且应用程序尝试将引号字符编码为";为了防止跨站点脚本,攻击者是否仍然能够爆发,因为他的";仍然会被尊为真正的引用吗?

假设你的意思是用户输入被服务器接受,那么运行一个标准的HTML编码例程,使其可以安全地插入HTML,然后插入HTML:

如果用户键入&quot;,则服务器端应用程序将其编码为&amp;quot;,HTML解析器将其解码回&quot;而不是"

当然,如果您要将用户输入插入JavaScript(即使该JavaScript也在HTML属性中),那么在将其转义为HTML之前,您需要将其转义成JS。

例如,使用常见的PHP:

<?php
$unsafe_input = $_GET['data'];
$js_safe_input = json_encode($unsafe_input);
$html_safe_input = htmlspecialchars($js_safe_input);
?>
<input type="button" onclick="alert(<?php echo $html_safe_input; ?>)" value="click">

您需要使用转义引号而不是

<input type="button" value="test" onclick="window.location.href = "'"foo;bar'"">

或者也使用单引号

<input type="button" value="test" onclick="window.location.href = 'foo;bar;'">