我正在使用 MySql 数据库,并试图找到 tedious.js(一个 SQL 服务器参数化查询生成器)的 MySQL 替代品。我正在使用 Node.js 作为我的后端。
我读到,如果不与绑定(bind)一起使用,knex.js 中的 .raw() 命令很容易受到 SQL 注入(inject)的影响。 但是其他命令和 knex.js 作为一个整体可以安全地用于防止 sql 注入(inject)吗?还是我找错了树?
最佳答案
仔细阅读 knex 文档,了解如何将值传递给 knex raw ( https://knexjs.org/guide/raw.html#raw )。
如果您将值作为参数绑定(bind)传递给原始数据,例如:
knex.raw('select * from foo where id = ?', [1])
在这种情况下,参数和查询字符串将单独传递到数据库驱动程序,以保护查询免受 SQL 注入(inject)。
其他查询生成器方法始终在内部使用绑定(bind)格式,因此它们也是安全的。
要查看特定查询如何传递到数据库驱动程序,可以执行以下操作:
knex('foo').where('id', 1).toSQL().toNative()
这将输出 SQL 字符串和绑定(bind),这些字符串和绑定(bind)提供给驱动程序以运行查询 ( https://runkit.com/embed/2yhqebv6pte6 )。
使用 knex 原始查询可能犯的最大错误是使用 JavaScript 模板字符串并将变量直接插入 SQL 字符串格式,例如:
knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS
需要注意的一件事是 knex 表/标识符名称不能作为绑定(bind)传递给驱动程序,因此使用这些名称时应格外小心,不要从用户读取表/列名称并在没有先正确验证它们的情况下使用它们。
编辑:
通过说标识符名称不能作为绑定(bind)传递,我的意思是当使用 ??
knex -binding 作为标识符名称时,在传递到数据库时将呈现为 SQL 字符串的一部分司机。
关于mysql - Knex.js 可以防止 sql 注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49665023/