Javascript 为什么node.js multiple statements选项中的mysql会增加SQL注入的范围?

Javascript 为什么node.js multiple statements选项中的mysql会增加SQL注入的范围?,javascript,mysql,node.js,Javascript,Mysql,Node.js,您好,我正在使用node.js和mysql开发服务器。当我阅读一些关于mysql库的文档时,我发现打开多个语句选项会增加SQL注入攻击的范围 我知道如果将SQL语法与“?”一起使用,将转义SQL语法。所以我想如果我用?使用多查询时,无法进行SQL注入攻击。是这样吗 比如说, let sql=“UPDATE auth_user SET last_login=now(),其中username=?;从auth_user中选择id、昵称,其中username=?LIMIT 1”; 设params=[us

您好,我正在使用node.js和mysql开发服务器。当我阅读一些关于mysql库的文档时,我发现打开多个语句选项会增加SQL注入攻击的范围

我知道如果将SQL语法与“?”一起使用,将转义SQL语法。所以我想如果我用?使用多查询时,无法进行SQL注入攻击。是这样吗

比如说,

let sql=“UPDATE auth_user SET last_login=now(),其中username=?;从auth_user中选择id、昵称,其中username=?LIMIT 1”;
设params=[username,username];
pool.getConnection(函数(err,conn){
conn.query(sql,参数,(错误,数据,字段)=>{..}

如果有人给了“foo”;DROP TABLE auth_user;--“username params”来进行SQL注入,mysql库是否会自动将这些参数读取为带有转义字符串的字符串?然后我猜测,引发SQL注入攻击的可能性与单个语句相同


为什么多语句选项会增加SQL注入的范围?如何安全地使用多语句?

来自官方mysqljs

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


习惯于检查库文档。

SQL注入
bad');删除表用户--
可能导致以下SQL:

INSERT-INTO-users(firstname,lastname)值('bob','bad');DROP-TABLE-users--)
如果在一个查询中禁用多条语句,则不可能出现这种情况,因为只会执行第一条语句


通过启用多个语句,您将面临这样的SQL注入攻击。这“增加了范围”对于SQL注入攻击,但如果您已经在使用准备好的语句,则应防止SQL注入。

IIRC MySQL具有真正的参数化查询,但您不能将其用于多个语句,这会打开,但在这种情况下没有区别,因为Node.js的MySQL包从不使用真正的参数化查询不管怎样,你能引用一下你读到的吗?在你下面提到的文档中,他们说“或者,你可以使用?字符作为占位符,作为你想转义的值:connection.query('SELECT*FROM users WHERE id=?',[userId],function(error,results,fields){if(error)抛出错误;//…});”。所以我认为?与connection.escape(userId)具有相同的角色。我真正想问的是,如果我使用connection.escape(userId)或“”编写SQL语句,即使我使用了多个语句,所有SQL注入问题都得到解决了吗?那么为什么上面提到的文档允许每个查询使用多个mysql语句。请注意,这可能会增加SQL注入攻击的范围。(默认值:false)
var userId = 'some user provided value';
var sql    = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function (error, results, fields) {
  if (error) throw error;
  // ...
});