mysql - JSON.stringify 字符串是否可以防止 (My)SQL 注入(inject)?

标签 mysql json node.js sql-injection

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

例如

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

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

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

谢谢!

最佳答案

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

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

关于mysql - JSON.stringify 字符串是否可以防止 (My)SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30170363/

相关文章:

Php从多个MySQL表中获取行

javascript - 检查 json Javascript/Jquery 中是否存在数组

node.js - jenkins 中私有(private) git npm 存储库的主机 key 验证失败

node.js - 如何在 Sequelize 中使用 LEFT JOIN?

php - mysql php 中的 SQL 存储过程

mysql - Node : Mysql client libraries on windows

mysql - 我可以为 MySQL 表的每一行定义生命周期吗?

sql - 在 Microsoft 流分析查询中选择 JSON 数组中的第一个元素

javascript - 用于格式化嵌套数组以匹配条件数组的递归函数

node.js - 你能从 Stud > HAProxy > nginx 获取 X-forwarded-for 吗?