我创建了一个基本的全栈应用程序,其中我突然想到它非常容易受到SQL注入的影响。
应用程序正在使用 act,但后端本身由 express/mssql npm 包组成。
下面是我的服务器.js文件中描述用户如何注册的片段。但是,如果用户输入删除表语句,甚至更糟的是删除数据库,则会危及整个系统。
服务器.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注入威胁?
对于任何想知道这似乎可以解决问题的人来说
var email = body.email;
var password = body.password;
var queryString =
"insert into Login (email,password) values (@email, @password)";
request.input("email", sql.VarChar, email);
request.input("password", sql.VarChar, password);
request.query(queryString, function(err, recordset) {
console.log(err);
response.status(400);
});