【问题标题】:Are the escape functions in the Node.js mysql package sufficient enough to securely query a mysql database (without the use of prepared statements)?Node.js mysql 包中的转义函数是否足以安全地查询 mysql 数据库(不使用准备好的语句)?
【发布时间】:2017-09-22 01:10:22
【问题描述】:

根据Node.js的mysqlpackage documentation

为了避免 SQL 注入攻击,在 SQL 查询中使用任何用户提供的数据之前,您应该始终对其进行转义。您可以使用 mysql.escape()、connection.escape() 或 pool.escape() 方法来执行此操作。

我找不到任何关于在 mysql 中使用准备好的语句的文档/参考,除了使用“?”的参考。人物。它声明如下:

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

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

根据我与其他开发人员交谈的经验,开发人员社区的普遍共识是,prepared statements 是从 Node.js 执行 mysql 查询的唯一安全方式,正如您所见mysql 包中,没有明显支持prepared statements。但是,表明他们避免SQL注入的方法是通过使用转义函数。

我的问题:

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

【问题讨论】:

    标签: mysql node.js function prepared-statement sql-injection


    【解决方案1】:

    如果您始终如一地进行转义,则转义实际上与使用参数化查询一样安全。

    但建议使用参数,因为它使您的代码更简单。因此,开发人员可能更有可能这样做。

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

    不管怎样,Python 的 MySQL 驱动程序也能做到这一点,当“emulate prepares”选项生效时,PHP 的 PDO 扩展也是如此。只要这些库经过良好测试,它就应该是安全的。

    FWIW,转义和参数都在 SQL 注入预防中受到限制,因为在这两种情况下,您只能保护您将与 SQL 查询结合使用的 。您无法保护标识符(如表名或列名)或 SQL 关键字或表达式等。在这些情况下,请注意在将动态内容与 SQL 查询结合之前已对其进行了审查。

    另见:

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2011-01-13
      • 2011-06-13
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      相关资源
      最近更新 更多