Node.js mysql包中的转义函数是否足够安全地查询mysql数据库(不使用预处理语句)?

根据Node.js的mysql 包文档 :

为了避免SQL注入攻击,在SQL查询中使用数据之前,应该始终转义任何用户提供的数据。 你可以使用mysql.escape(),connection.escape()或pool.escape()方法。

我找不到任何使用mysql准备语句的文档/参考,除了在引用中使用'?' 字符。 它声明如下:

或者,你可以使用? 字符作为您想要转义的值的占位符…

这看起来与MySQL中的预处理语句类似, 但是它实际上在内部使用相同的connection.escape()方法。

从我与其他开发人员谈话的经验来看,开发人员社区中的普遍共识是准备好的语句是从Node.js执行mysql查询的唯一安全方式,但是,您可以使用mysql包来看到,没有明显的支持准备好陈述。 但是,表明他们避免SQL注入的方法是通过使用转义函数。

我的问题:

mysql包中的转义函数是否足够安全地查询mysql数据库(不使用预准备语句)?

实际上,转义实际上和使用参数化查询一样安全,如果你一致的话。

但是build议使用参数,因为它使代码更简单。 因此开发者可能更有可能这样做。

如果Node.js库与参数一样方便,但通过修改查询string在内部实现它, 用参数值标记,那么你很好。

对于什么是值得的,Python的MySQL驱动程序也是这样做的,而且在“模拟准备”选项生效时也是PHP的PDO扩展。 只要这些图书馆经过了充分的testing,就应该是安全的。

FWIW,在SQL注入预防中,转义和参数都是有限的,因为在这两种情况下,只能保护将与SQL查询结合的 。 您不能保护标识符(如表名称或列名称)或SQL关键字或expression式等。在这些情况下,请注意您在与SQL查询结合之前已经审核了任何dynamic内容。

也可以看看:

  • 防止Node.js中的SQL注入
  • real_escape_string和prepare()之间的区别?
Interesting Posts