请仔细阅读knex文档,了解如何将值传递给knex raw(
http://knexjs.org/#Raw).
如果要将值作为参数绑定传递给raw,如:
knex.raw('select * from foo where id = ?', [1])
在这种情况下,参数和查询字符串分别传递给数据库驱动程序保护SQL注入查询.
其他查询构建器方法内部始终使用绑定格式,因此它们也是安全的.
要查看如何将某个查询传递给数据库驱动程序,可以执
knex('foo').where('id', 1).toSQL().toNative()
使用knex原始查询可以做的最大错误是使用javascript模板字符串并直接将变量插入到SQL字符串格式,如:
knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS
需要注意的一点是,knex表/标识符名称不能作为绑定传递给驱动程序,因此对于那些人应该格外小心,不要从用户读取表/列名称并使用它们而不首先正确验证它们.
编辑:
通过说标识符名称不能作为绑定传递我的意思是当一个人使用?标识符名称的绑定绑定,在传递给数据库驱动程序时将作为SQL字符串的一部分呈现.