首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sql中创建可以接受多个参数的存储过程

在sql中创建可以接受多个参数的存储过程
EN

Stack Overflow用户
提问于 2021-11-15 10:20:42
回答 1查看 267关注 0票数 0

我正在尝试使用express.js和mysql来制作基本的登录/注册系统。在第一个原型中,我使用字符串查询从数据库中输入和检索数据。现在,我想升级它并使用存储过程,就像堆栈溢出上的人告诉我的那样,将查询提供为string会使系统容易受到sql注入的影响。我的查询包含通过注册或登录表单从用户那里提供的两个参数。

以下是查询

代码语言:javascript
复制
    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岁的大部分);我仍然尝试使用很多,但都没有用。

此外,我试图查看官方文件,但我没有完全理解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-15 11:59:50

首先,您需要将过程存储在数据库中。

代码语言:javascript
复制
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;

然后,您可以在代码中使用它们:

代码语言:javascript
复制
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之前保存之前,我将散列来自请求的密码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69972796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档