Node.js mysql 包中的转义函数是否足以安全查询 mysql 数据库(不使用准备好的语句)?
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 package documentation:
In order to avoid SQL Injection attacks, you should always escape any user provided data before using it inside a SQL query. You can do so using the mysql.escape(), connection.escape() or pool.escape() methods.
我找不到任何关于在 mysql 中使用准备好的语句的文档/参考,除了在使用“?”的参考中人物。它声明如下:
Alternatively, you can use ? characters as placeholders for values you would like to have escaped...
This looks similar to prepared statements in MySQL, however it really
just uses the same connection.escape() method internally.
根据我与其他开发人员交谈的经验,开发人员社区的普遍共识是准备好的语句是 唯一 安全的方式来执行来自 mysql 的查询=30=] 但是,正如您在 mysql 包中看到的那样,没有明显支持准备好的语句。但是,表明他们避免 SQL 注入的方法是通过使用转义函数。
我的问题:
mysql 包中的转义函数是否足以安全地查询 mysql 数据库(不使用准备好的语句)?
转义实际上与使用参数化查询一样安全,如果你坚持这样做的话。
但建议使用参数,因为它使您的代码更简单。因此,开发人员可能更有可能这样做。
如果 Node.js 库使它像参数一样方便,但通过修改查询字符串在内部实现,用参数值替换 ?
标记,那么你很好。
就其价值而言,Python 的 MySQL 驱动程序也这样做,并且当 "emulate prepares" 选项生效时 PHP 的 PDO 扩展也是如此。只要这些库经过良好测试,就应该是安全的。
FWIW,在 SQL 注入预防中,转义和参数都受到限制,因为在这两种情况下,您只能保护 values 与 SQL查询。您无法保护标识符(如 table 名称或列名称)或 SQL 关键字或表达式等。在这些情况下,请注意在将任何动态内容与您的内容组合之前对其进行审查SQL查询。
另请参阅:
- Preventing SQL injection in Node.js
- Difference between real_escape_string and prepare()?
根据 Node.js' mysql package documentation:
In order to avoid SQL Injection attacks, you should always escape any user provided data before using it inside a SQL query. You can do so using the mysql.escape(), connection.escape() or pool.escape() methods.
我找不到任何关于在 mysql 中使用准备好的语句的文档/参考,除了在使用“?”的参考中人物。它声明如下:
Alternatively, you can use ? characters as placeholders for values you would like to have escaped...
This looks similar to prepared statements in MySQL, however it really just uses the same connection.escape() method internally.
根据我与其他开发人员交谈的经验,开发人员社区的普遍共识是准备好的语句是 唯一 安全的方式来执行来自 mysql 的查询=30=] 但是,正如您在 mysql 包中看到的那样,没有明显支持准备好的语句。但是,表明他们避免 SQL 注入的方法是通过使用转义函数。
我的问题:
mysql 包中的转义函数是否足以安全地查询 mysql 数据库(不使用准备好的语句)?
转义实际上与使用参数化查询一样安全,如果你坚持这样做的话。
但建议使用参数,因为它使您的代码更简单。因此,开发人员可能更有可能这样做。
如果 Node.js 库使它像参数一样方便,但通过修改查询字符串在内部实现,用参数值替换 ?
标记,那么你很好。
就其价值而言,Python 的 MySQL 驱动程序也这样做,并且当 "emulate prepares" 选项生效时 PHP 的 PDO 扩展也是如此。只要这些库经过良好测试,就应该是安全的。
FWIW,在 SQL 注入预防中,转义和参数都受到限制,因为在这两种情况下,您只能保护 values 与 SQL查询。您无法保护标识符(如 table 名称或列名称)或 SQL 关键字或表达式等。在这些情况下,请注意在将任何动态内容与您的内容组合之前对其进行审查SQL查询。
另请参阅:
- Preventing SQL injection in Node.js
- Difference between real_escape_string and prepare()?