我注意到一些我很难理解的行为。请考虑以下代码段:
<input type="button" value="test" onclick="window.location.href = "foo;bar;"">
当我点击测试按钮时,它会将页面重定向到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;仍将被视为真实的报价?
答案 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解析器将属性的值转换为文本(因此"
变为"
)。该文本然后传递给JavaScript引擎。
所以你所拥有的一切都很好,并且可以正常工作。
编码字符在执行之前是由javascript引擎解码的吗?
不,它在JavaScript引擎甚至可以看到它之前由HTML解析器解码。
如果这涉及用户输入,并且应用程序尝试将引号字符编码为“以防止跨站点脚本编写,攻击者是否仍然能够突破,因为他的”仍将被视为真实报价?
假设您的意思是服务器获取用户输入,请运行标准HTML编码例程,以便安全插入HTML,然后插入HTML:
如果用户键入"
,则服务器端应用程序会将其编码为&quot;
,HTML解析器会将其解码回"
而不是"
。< / 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">