当前位置:  开发笔记 > 编程语言 > 正文

Knex.js会阻止sql注入吗?

如何解决《Knex.js会阻止sql注入吗?》经验,为你挑选了1个好方法。

我正在使用MySql数据库,并试图找到一个替代tedious.js(一个SQL服务器参数化查询生成器)的MySQL替代品.我正在使用Node.js作为我的后端.

我读到knex.js中的.raw()命令很容易被sql注入,如果没有用于绑定.但其他命令和knex.js作为一个整体安全使用,以防止SQL注入?还是我在错误的树上吠叫?



1> Mikael Lepis..:

请仔细阅读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字符串的一部分.


@PhilippeHebert我认为通过Knex Ref API最容易访问:https://knexjs.org/#Ref
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有