我创建了一个基本的全栈应用程序,在其中我发现它非常容易受到SQL注入的攻击。
应用程序正在使用react,但后端本身由express / mssql npm软件包组成。
下面是我的server.js文件中的片段,描述了用户如何注册。但是,如果用户输入放置表语句或什至更糟的是放置数据库,则会损害整个系统。
Server.js
app.post("/admin-Add-Users", async (req, response) => {
sql.connect(config, function(err) {
if (err) {
console.log(err);
response.status(400);
response.send(err);
} else {
try {
// create Request object
var request = new sql.Request();
var body = req.body;
console.log(body);
if (body) {
var email = body.email;
var password = body.password;
var queryString = `insert into Login (email,password) values ('${email}', '${password}')`;
console.log(queryString);
request.query(queryString, function(err, recordset) {
console.log(err);
response.status(400);
// response.send(err);
});
response.status(201);
response.send("User added ");
} else {
response.status(400);
response.send("no content was provided");
}
} catch (e) {
console.log(e);
response.status(400);
response.send(e);
}
}
});
});
我知道存储过程可以安全地进行注入,但是我对此并不陌生,并且不知道确切地从哪里开始。
然而,在npm mssql文档中,它实际上谈论的是SQL注入和对此的内置预防(https://github.com/tediousjs/node-mssql#sql-injection。
这里是文档中给出的示例
const request = new sql.Request()
request.input('myval', sql.VarChar, '-- commented')
request.query('select @myval as myval', (err, result) => {
console.dir(result)
})
但是到目前为止,我对如何在代码中实现这一点的理解为空。
最佳做法是什么?进一步研究存储过程是一个更好的主意,还是可以将其应用于我的代码以成功阻止SQL注入的任何威胁?