mysql - Knex.js 可以防止 sql 注入(inject)吗?

标签 mysql node.js knex.js

我正在使用 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/

相关文章:

mysql - 在将 XML 值插入 MySQL 表之前修改列

mysql - SQL中基于datediff和curdate函数计算列值

sql-server - node-mssql 如何处理连接池?

javascript - Electron :将应用程序图标添加到任务栏的右下角

knex.js - 从 Knex.js 获取连接池统计信息

node.js - 将 Knex 与自己的 pg 连接池一起使用

mysql - 组函数MySql的无效使用

java - 检查是否可以插入 MySQL 数据库

javascript - 无法读取未定义的属性 'createStream'

sql - 将sequelize查询转换为knex