什么是在node-mysql中阻止SQL注入的最佳实践?

时间:2015-09-21 15:50:03

标签: mysql node.js sql-injection node-mysql

关于这个主题已经有过一些讨论(例如Preventing SQL injection in Node.js),但实际上没有明确的清晰度或深入的讨论,更不用说任何地方的好文档了。 node-mysql文档讨论了SQL注入的防止和一些转义函数。但是,目前还不清楚这些函数如何阻止SQL注入。手册说"字符串安全地逃脱。"没有更多......仅限于逃避某些角色吗?

在node-mysql中似乎还有与connection.escape和pool.escape相同功能的其他等价物,并再次强调这些函数用于防止SQL注入。

在node-mysql中似乎也没有支持真正的prepare语句。计划和文件再次不清楚。 Node-mysql显然是node.js环境中非常流行的模块,并且至少在我使用它的有限经验中相当稳定。 在node-mysql中阻止SQL注入的最佳实践是什么?

2 个答案:

答案 0 :(得分:2)

请记住,SQL注入是由被视为命令的恶意字符串引起的,而不是由阻塞命令引起的。您确定要获得原始字符串,而不是字符串化版本吗?

例如,这两者之间存在巨大差异:"test""'test'"

通常只有有害字符被转义,其余字符保持原样。

最好避免使用低级驱动程序。尝试使用像Sequelize这样的库来提供一些抽象和更多支持。该模块支持通常会使非问题转义的占位符语句,它会自动处理。

请参阅raw queries with replacements上您可以执行此操作的部分:

sequelize.query('SELECT * FROM projects WHERE status = ?',
  { replacements: ['active'], type: sequelize.QueryTypes.SELECT }
).then(function(projects) {
  console.log(projects)
})

没有用户数据泄露的风险,因为您已将其作为正确处理的显式值提供,而不是查询中的内联字符串。

答案 1 :(得分:1)

仍然是续集是脆弱的

db.query('SELECT Desc FROM Items WHERE Username IN (:names)', {
  replacements: {
    names: ["Bobby", "'); DELETE FROM Items WHERE 1=1; --')"]
  }
});