繁体   English   中英

为什么node.js中的mysql多语句选项增加了SQL注入的范围?

[英]Why mysql in node.js multiple statements option increase the scope of the SQL injection?

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

我知道如果我将 SQL 语法与 '?' 一起使用会转义 SQL 语法。 所以我想,如果我使用 ? 使用多个查询,SQL注入攻击无法完成。 这样对吗?

例如,

let sql = "UPDATE auth_user SET last_login=now() WHERE username=?; SELECT id, nickname FROM auth_user WHERE username = ? LIMIT 1"; let params = [username, username]; pool.getConnection(function(err, conn){ conn.query(sql, params, (err, datas, fields)=>{..}

如果有人给"foo'; DROP TABLE auth_user;--" 用户名参数来做 SQL 注入,mysql 库不会自动将参数读取为带有转义字符串的字符串吗? 然后我猜测出现SQL注入攻击的可能性和单个语句是一样的。

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

SQL注入bad'); DROP TABLE users -- bad'); DROP TABLE users --可能导致以下 SQL:

INSERT INTO users (firstname, lastname) VALUES ('bob', 'bad'); DROP TABLE users --')

如果在单个查询中禁用多个语句,则这种情况是不可能的,因为只会执行第一条语句。

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

来自官方mysqljs github

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

 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; // ... });

习惯检查您的库文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM