【问题标题】:Is there any reason to escape integers in HTML?是否有任何理由在 HTML 中转义整数?
【发布时间】: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 漏洞。这仅适用于涉及用户输入的情况,但您可以通过这种方式轻松利用字段的未转义值。例如,如果我将您链接到易受攻击的页面,该页面可能会在“值”字段中显示如下内容:"&gt;&lt;script&gt;send_your_cookies_to_my_website();&lt;/script&gt;。引号和尖括号会将脚本移出“值”属性。
  • @RadGH 我解释得不够清楚。我的观点是,即使它不是用户输入,您仍然必须对其进行转义,否则您可能会冒着在字符串中出现引号(或
  • @Juan Mendes 够公平的。只要其他读者理解转义数据的两面。

标签: javascript html ajax escaping underscore.js-templating


【解决方案1】:

如果您想完全安全,请逃避一切。代码可能会更改,您可能会决定在以前使用数字的地方使用字符串。如果你逃避一切,你就不会有问题。

但是,这只是谨慎。如果您可以保证它始终是一个数字,即使 AJAX 请求失败,并且在所有边缘情况下,也可以不转义它。请注意,在我工作过的所有地方,大家的共识都是谨慎行事。

【讨论】:

    【解决方案2】:

    您显然不需要转义整数。一般来说,逃避一切并打印您打算打印的原始版本可能是一个好习惯。但是,您也可以说您应该相信来自服务器的内容,而不是来自客户端的内容。最后,只有你想要养成的习惯才重要。我个人不会想逃避它(因为它不需要逃避)所以我不会逃避它。

    【讨论】:

    • 我同意这种观点。然而,无论我在哪里工作,我们都倾向于逃避一切以避免错过一些边缘情况。
    • 我也同意这可能是一个更好的主意。我会同意的。
    【解决方案3】:

    JavaScript 是动态类型的,因此无法确保product.stock 在到达模板时确实是一个数字。将来使用模板编写的任何代码(可能由其他人编写)都可以为product 传递任何值,因此stock 可以是任何类型。

    最好总是转义,除非在极少数情况下您期望值实际上是 HTML,在这种情况下您不能转义,这样以后对代码的更改不太可能破坏模板。

    【讨论】:

    • 好点,HTML 是您不应该逃避的情况。我不想让服务器返回 HTML,但我知道这不是每个人的方式
    【解决方案4】:

    如果输入是number 类型,那么您肯定会在该输入中得到一个数字或什么也没有。

    作为测试,尝试将字符串 drop database 添加到类型 number 的输入中。 剧透警告:输入将保持空白。

    text 类型的输入可能更危险。

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2018-10-30
      • 2020-11-28
      • 2011-10-08
      相关资源
      最近更新 更多