我正在使用MySql数据库,并试图找到一个替代tedious.js(一个SQL服务器参数化查询生成器)的MySQL替代品.我正在使用Node.js作为我的后端.
我读到knex.js中的.raw()命令很容易被sql注入,如果没有用于绑定.但其他命令和knex.js作为一个整体安全使用,以防止SQL注入?还是我在错误的树上吠叫?
请仔细阅读knex文档,了解如何将值传递给knex raw(http://knexjs.org/#Raw).
如果要将值作为参数绑定传递给raw,如:
knex.raw('select * from foo where id = ?', [1])
在这种情况下,参数和查询字符串分别传递给数据库驱动程序保护SQL注入查询.
其他查询构建器方法内部始终使用绑定格式,因此它们也是安全的.
要查看如何将某个查询传递给数据库驱动程序,可以执
knex('foo').where('id', 1).toSQL().toNative()
这将输出为驱动程序提供的SQL字符串和绑定以运行查询(https://runkit.com/embed/2yhqebv6pte6).
使用knex原始查询可以做的最大错误是使用javascript模板字符串并直接将变量插入到SQL字符串格式,如:
knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS
需要注意的一点是,knex表/标识符名称不能作为绑定传递给驱动程序,因此对于那些人应该格外小心,不要从用户读取表/列名称并使用它们而不首先正确验证它们.
编辑:
通过说标识符名称不能作为绑定传递,我的意思是当一个人使用??
knex -binding作为标识符名称时,它将在传递给数据库驱动程序时呈现为SQL字符串的一部分.