我正在尝试使用express.js和mysql来制作基本的登录/注册系统。在第一个原型中,我使用字符串查询从数据库中输入和检索数据。现在,我想升级它并使用存储过程,就像堆栈溢出上的人告诉我的那样,将查询提供为string会使系统容易受到sql注入的影响。我的查询包含通过注册或登录表单从用户那里提供的两个参数。
以下是查询
var username, password;
var userInfoArray = [username, password]
var registrationQueryString = "INSERT INTO userinfo (username, password) VALUES ( ?, ? )"
var loginQueryString = "SELECT username, password FROM userinfo WHERE EXISTS (SELECT username, password FROM userinfo WHERE userinfo.username = ( ? ) AND userinfo.password = ( ? ))"
function userRegistration (userInfoArray){
dbConnection.query( registrationQueryString, userInfoArray, function(err, results, fields) {
if (err) throw err
console.log("registered new user")
})
}
function userLogin (userInfoArray){
dbConnection.query( loginQueryString, userInfoArray, function(err, results, fields) {
if (err) throw err
console.log(results)
})
}我希望使存储过程与我提供的代码等效。
,我在这个问题上找到了太多的答案,但所有的答案都太老了( 4-5岁的大部分);我仍然尝试使用很多,但都没有用。
此外,我试图查看官方文件,但我没有完全理解。
发布于 2021-11-15 11:59:50
首先,您需要将过程存储在数据库中。
CREATE PROCEDURE RegisterUser @username varchar(30), @password varchar(10)
AS
BEGIN
INSERT INTO userinfo (username, password)
VALUES (@username, @password)
END;
________________________________________________________________________________________
CREATE PROCEDURE LoginUser @username varchar(30), @password varchar(10)
AS
BEGIN
SELECT username, password
FROM userinfo
WHERE EXISTS (
SELECT username, password
FROM userinfo
WHERE userinfo.username = @username AND userinfo.password = @password
)
END;然后,您可以在代码中使用它们:
var username, password;
var userInfoArray = [username, password]
var registrationProcedure = "EXEC RegisterUser @username = $1, @password = $2"
var loginProcedure = "EXEC LoginUser @username = $1, @password = $2"
function userRegistration (userInfoArray) {
dbConnection.query(registrationProcedure, userInfoArray,
function(err, results, fields) {
if (err) throw err
console.log("registered new user")
})
}
function userLogin (userInfoArray) {
dbConnection.query(loginProcedure, userInfoArray,
function(err, results, fields) {
if (err) throw err
console.log(results)
})
}请注意,使用存储过程并不意味着不再像以前那样向查询传递参数(string concat),只是意味着将查询实现隐藏在数据库中,从而提高了安全性。
这里是我用来回答这个问题的参考。
这只是一个例子,但我也避免在输入变量中使用相同的列名,而只将密码的散列存储在db上。因此,在注册期间和比较部分WHERE ... AND userinfo.password = @password之前保存之前,我将散列来自请求的密码。
https://stackoverflow.com/questions/69972796
复制相似问题