Node.js数据库操作之查询MySQL数据库(二)

2020-06-17 07:04:03易采站长站整理

在进行数据库查询时,有一个重要的原则就是永远不要相信用户的输入。为什么不能相信用户的输入呢,首先让我们来了解一下SQL注入攻击。

SQL注入攻击

所谓的SQL注入攻击,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。由于笔者并不是从事数据库方面的工作,也不是数据库方面的砖家,所以只能通过一个简单的DEMO来演示一下SQL注入攻击。

假如我们拼接的SQL语句是这样的


var username = 'xyf';
var sql = 'select * from book where author = "'+username+'"';

这里我们期待用户输入的username是Jack或者LiLi之类的,但是用户说我偏不,我就输入一串恶意代码:


var username = '"1 or 1=1';
var sql = 'select * from book where author = "'+username+'"';

最后我们拼接的查询语句就变成了下面这样的:


select * from book where author = "" or 1=1

如果读者对SQL语句有一些基本了解,就会知道如果把这段查询语句放到数据库中进行查询,那么所有用户的信息都被查出来了,但是这并不是我们想要看到的结果。

避免SQL注入攻击

那么怎么才能避免SQL注入攻击呢?mysql提供了两种方法给我们,第一种方法就是每次查询时都把用户输入的数据都用escape()函数解析一下,有点类似预处理语句。


var authorname = 'user input';
connection.escape(authorname);
// 或者使用mysql.escape(authorname);
connection.query(
'select * from book where author = "'+authorname+'"',
function(err, result) {
console.log(result);
}
);

第二种方法就是在查询时通过上面说到的占位符注入查询的查询方式来进行查询。但它内部的实现也是通过上面所说的escape()方法将用户输入解析了一下。推荐使用第二种方法来得简单快捷。

多语句查询

mysql还支持多语句查询,但是由于某些安全原因(官方解释是因为如果值没有正确解析会导致SQL注入攻击)默认是被禁止的。那么让我们来打开这个“潘多拉魔盒”把。

在创建数据库连接时首先把这个功能开启。


let connection = mysql.createConnection({
// 其他配置
multipleStatements: true,
});

然后我们就可以使用多语句查询了。


connection.query(
{
sql: `select * from book where username = ?;
select * from book where username = ?;`,
},
['ace','xyf'],