关于这个主题已经有过一些讨论(例如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注入的最佳实践是什么?
答案 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; --')"]
}
});