【发布时间】:2014-08-05 21:37:28
【问题描述】:
如果我通过 Ajax 从服务器获取以下对象:
$.get('/product/10', function (response) {
product = response;
// product:
// {
// name: "Product X",
// stock: 20
// }
});
然后使用 Underscore.js 模板将其输出到 HTML,如下所示:
<input type="number" value="<%- product.name %>">
<input type="number" value="<%= product.stock %>">
如果我知道stock 属性总是以整数形式来自服务器,是否还有任何理由转义它?
我想不出一种利用它的方法,所以我想知道“逃避所有事情”是一个好策略,还是“只逃避你需要的东西”是否更好。
【问题讨论】:
-
如果该值不是用户输入的,则无需转义。
-
@undefined 转义不是为了防止 XSS。这是因为某些字符(例如引号)可能需要转义。整数不需要它。
-
@Juan Mendes 两者兼得。如果您不清理引号,则会打开 XSS 漏洞。这仅适用于涉及用户输入的情况,但您可以通过这种方式轻松利用字段的未转义值。例如,如果我将您链接到易受攻击的页面,该页面可能会在“值”字段中显示如下内容:
"><script>send_your_cookies_to_my_website();</script>。引号和尖括号会将脚本移出“值”属性。 -
@RadGH 我解释得不够清楚。我的观点是,即使它不是用户输入,您仍然必须对其进行转义,否则您可能会冒着在字符串中出现引号(或
-
@Juan Mendes 够公平的。只要其他读者理解转义数据的两面。
标签: javascript html ajax escaping underscore.js-templating