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

时间:2014-10-07 21:54:34

标签: javascript encoding xss

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

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

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

只是为了进一步确认这是发生了什么,如果我删除第一个&amp; quot;然后单击按钮我在控制台中收到以下错误:

  

SyntaxError:unterminated string literal

     

window.location.href = foo; bar;“

(带箭头表示尾随“,这实际上是&amp; quot;”是问题。)

我错过了什么?编码字符在执行之前是由javascript引擎解码的吗?如果此involes用户输入,并且应用程序尝试将引号字符编码为&amp; quot;为了防止跨站点脚本,攻击者仍然能够突破,因为他的&amp; quot;仍将被视为真实的报价?

2 个答案:

答案 0 :(得分:0)

您需要使用转义引号

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

或使用单引号

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

答案 1 :(得分:0)

您似乎正在解决您的解析顺序。

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

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


  

编码字符在执行之前是由javascript引擎解码的吗?

不,它在JavaScript引擎甚至可以看到它之前由HTML解析器解码。

  

如果这涉及用户输入,并且应用程序尝试将引号字符编码为“以防止跨站点脚本编写,攻击者是否仍然能够突破,因为他的”仍将被视为真实报价?

假设您的意思是服务器获取用户输入,请运行标准HTML编码例程,以便安全插入HTML,然后插入HTML:

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

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

例如,使用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">