【问题标题】:Does JSON.stringify a string protect against (My)SQL injection?JSON.stringify 字符串是否可以防止(My)SQL 注入?
【发布时间】:2015-07-22 02:47:39
【问题描述】:

我遇到了一些 node.js 代码,它获取用户提供的字符串,调用 JSON.stringify(str) 并将值直接注入 SQL 语句。

例如

var x = JSON.stringify(UNSAFE_USER_STRING);
mysql_execute('UPDATE foo SET v = ' + x + ' WHERE id = 1');

显然这是对 JSON.stringify 的滥用,但这不是我的代码,作者希望在修补之前查看攻击向量。因为 UNSAFE_USER_STRING 是一个字符串,而不是一个对象,并且会转义明显的 "\,所以如果存在严重问题并不明显

这段代码安全吗?如果没有,有人可以证明什么是不安全的输入吗?

谢谢!

【问题讨论】:

标签: mysql json node.js sql-injection


【解决方案1】:

即使像 " 这样的字符被转义。用于 cmets 的字符(组合)像 -- 或 # 仍然可能导致 WHERE 子句被忽略。

【讨论】:

    【解决方案2】:

    如果您确定 x 是一个字符串,那么我 99% 的把握这使得执行 SQL 注入攻击是不可能的。当您不确定 x 的类型时,我的信心会下降到 90%。也就是说,考虑到以下所有情况不应构成漏洞:

    • Null、NaN、Infinity、-Infinity 似乎都返回为空值,这是安全的。
    • 未定义返回值未定义,而不是字符串,所以我不确定。我认为它只会被认为是无效的 SQL,而不是构成漏洞。
    • node.js JSON.stringify(new Date()) 中的日期返回 '"2015-11-09T18:53:46.198Z"' 这正是您想要的。
    • 尽管智能转换可以成功使用 SQL 数组,但数组和对象会导致无效的 SQL。也就是说,可能有一些棘手的方法可以用可能导致漏洞的对象填充数组,但我对此表示怀疑。
    • 十六进制似乎只是将其转换为整数。
    • Buffers 和 Uint8Arrays 似乎作为对象返回。同样,可能有某种方法可以使用可能存在漏洞的东西来填充对象,但我对此表示怀疑。

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多