在HTML中转义整数有什么原因吗?

3
如果我通过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属性总是一个整数,是否有必要对其进行转义?

我想不出利用它的方式,所以我想知道“转义一切”是否是一个好策略,或者“只转义你需要转义的内容”更好。


如果该值不是用户输入,则无需进行转义。 - Ram
@undefined 转义并不是为了防止 XSS 攻击,而是因为某些字符(如引号)可能需要进行转义。整数则不需要。 - Ruan Mendes
1
@Juan Mendes 这适用于两种情况。如果您不对引号进行消毒,则会打开XSS漏洞。这仅适用于涉及用户输入的情况,但您可以轻松地利用未转义的字段值来实现此目的。例如,如果我链接到一个易受攻击的页面,该页面可能会在“值”字段中显示类似于:“"><script>send_your_cookies_to_my_website();</script>” 的内容。引号和尖括号将脚本移出“值”属性。 - Radley Sustaire
@RadGH,我没有解释清楚。我的观点是,即使不是用户输入,您仍然必须对其进行转义,否则您可能会在字符串中破坏HTML的引号(或<)。防止XSS是转义字符串的副作用。这个评论就是一个例子,我们不想让<造成混乱。 - Ruan Mendes
@Juan Mendes 好的,只要其他读者都能理解转义数据的两个方面就可以了。 - Radley Sustaire
4个回答

1
你不需要显然转义整数。总的来说,转义所有内容并打印所需版本可能是一个好习惯。但你也可以说应该相信来自服务器的内容,而不是来自客户端的内容。最终只有你想养成什么习惯才真正重要。个人而言,我不会考虑转义它(因为它不需要转义),所以我不会转义它。

1
我同意这种观点。然而,在我工作的每个地方,我们都更喜欢转义所有内容以避免错过一些边缘情况。 - Ruan Mendes
我也同意那可能是更好的想法。我会选择那个。 - micah

1

如果你想完全保险起见,就对所有内容进行转义处理。代码可能会发生变化,你可能会决定使用字符串代替之前的数字。如果你对所有内容都进行了转义,那么就不会出现问题。

然而,这只是谨慎的做法。如果你能够保证它始终是一个数字,即使 AJAX 请求失败或出现其他极端情况,那么就可以不进行转义处理。请注意,在我工作的所有地方,共识都是要小心谨慎。


1
JavaScript是动态类型的,因此无法确保在模板中使用product.stock时它真的是一个数字。未来编写使用该模板的任何代码(可能是其他人编写)都可以为product传递任何值,因此stock可以是任何类型。
最好始终进行转义,除非您期望该值实际上是HTML,否则不能转义,以便未来对代码的更改不太可能破坏模板。

好的观点,HTML是一种你不应该转义的情况。我更喜欢服务器不返回HTML,但我理解并不是每个人都这样做。 - Ruan Mendes

0

如果输入的类型是数字,那么你保证会得到一个数字或在该输入中什么也没有。

作为一个测试,试着将字符串drop database添加到一个类型为数字的输入中。剧透警告:该输入将保持为空。

类型为文本的输入可能更加危险。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接