编码"在Javascript onclick事件中被视为真正的双引号-为什么
Encoded " treated as a real double quote in Javascript onclick event - why?
我注意到一些我很难理解的行为。考虑以下代码片段:
<input type="button" value="test" onclick="window.location.href = "foo;bar;"">
当我点击测试按钮时,它会将页面重定向到http://www.example.com/foo;酒吧所以在";字符被视为字符串文字,就好像";是真正的引号字符。我的期望是;quot;字符是编码的,它们不会影响代码的执行,所以我希望foo和bar之间的分号终止对window.location.href的赋值,并让javascript将bar视为一个单独的语句。
只是为了进一步确认这就是正在发生的事情,如果我删除第一个";然后点击按钮我在控制台中得到以下错误:
SyntaxError:未终止的字符串文字
window.location.href=foo;酒吧"
(用一个箭头指示尾部",这实际上是一个&",这是问题所在。)
我错过了什么?javascript引擎是否在执行编码字符之前对其进行解码?如果这调用了用户输入,并且应用程序尝试将引号字符编码为";为了防止跨站点脚本,攻击者是否仍然能够爆发,因为他的";仍然会被尊为真正的引用吗?
您的解析顺序似乎颠倒了。
HTML解析器将属性的值转换为文本(因此"
变为"
)。该文本被然后传递给JavaScript引擎。
所以你所拥有的一切都很好,并且可以正常工作。
javascript引擎是否在执行编码字符之前对其进行解码?
不,在JavaScript引擎看到它之前,HTML解析器就会对它进行解码
如果这涉及到用户输入,并且应用程序尝试将引号字符编码为";为了防止跨站点脚本,攻击者是否仍然能够爆发,因为他的";仍然会被尊为真正的引用吗?
假设你的意思是用户输入被服务器接受,那么运行一个标准的HTML编码例程,使其可以安全地插入HTML,然后插入HTML:
如果用户键入"
,则服务器端应用程序将其编码为&quot;
,HTML解析器将其解码回"
而不是"
。
当然,如果您要将用户输入插入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;'">
- 为什么spyOn"停止函数“”的所有执行;Jasmine(要求澄清Jasmine 2.2间谍文件)
- 为什么我会出现此错误"未捕获引用错误:未定义标题;
- 为什么"构造函数是一种特殊情况;
- 为什么"这个“;指的是javascript中forEach中的Window
- 为什么"undefined为null或不是对象”;
- 为什么"document.styleSheets”;每次刷新3到5次浏览器后返回空值
- Javascript:为什么"这个“;内部私有函数指的是全局范围
- 为什么"结束”;音频html5的事件触发不止一次
- 为什么"对象未定义”;在这种情况下没有抛出错误
- 为什么"~未定义的“;在JavaScript中为-1
- 为什么"requestAnimationFrame”;递归获胜'不要占用RAM
- 为什么"1.0〃;不等于“+1.0〃;在JavaScript中
- 为什么"i〃;不等于“;i̇”;
- 为什么"Microsoft JScript运行时错误:应为对象“”;
- 为什么“-"(破折号)给予“;意外的令牌错误“;和Gulp在Babelify上
- 为什么“"==在JavaScript中为[null]true
- 为什么"typeof+''"返回'数字'
- 为什么"打印“;不会'不能在node.js中工作
- 为什么"这个“;在胖箭头函数定义中未定义
- 为什么"使用严格的“;在本例中性能提高了10倍