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

时间:2015-05-11 14:29:10

标签: mysql json node.js sql-injection

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

e.g。

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您确定x是一个字符串,那么我99%肯定这使得无法进行SQL注入攻击。当你不确定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似乎作为对象返回。同样,可能有一些方法可以使用易受攻击的东西来填充Object,但我对此表示怀疑。

答案 1 :(得分:-1)

即使像“正在被转义这样的字符。用于评论的字符(组合),如 - 或#仍然可能导致WHERE子句被忽略。