首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中的存储过程中使用用户定义的变量安全吗?

问在MySQL中的存储过程中使用用户定义的变量安全吗?
EN

Database Administration用户
提问于 2022-06-18 04:24:30
回答 1查看 364关注 0票数 1

目前,我正在使用MySQL中的存储过程,并且在某些过程中使用用户定义的变量,并且在当前会话中初始化了这种类型的变量,并将它们的值保存到会话结束。

我还在处理像select into @user_defined_variable这样的语句,但我意识到这样做是非常危险的,特别是在登录/身份验证方面。因此,在本例中,解决方案是使用语句set @user_defined_variable而不是select into。

但是我真的不确定使用set是否足够,因为当会话还没有结束时,这种类型的变量将保留它们的值。

现在假设服务器同时在使用相同@user_defined_variable的存储过程上接收多个请求,在这种情况下可以存在值冲突吗?例如,如果名为login的存储过程使用用户定义的变量@uuidUser,而称为home的存储过程也使用@uuidUser,那么home过程是否存在使用在login过程中分配的@uuidUser值的风险?

注意:我正在使用Node.js,我只有一个与MySQL实例的连接,并不是为每个请求创建一个连接。因此,@user_defined_variables将永远存在。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2022-06-18 17:30:25

用户定义的变量是特定于设置它们的会话的。他们不会泄露到其他会议。

每个会话都有自己的变量。不同会话中同名的变量不包含相同的值。就像任何编程语言中的局部变量一样。

即使您使用连接池,以便后续请求重用给定的连接,当连接被回收时也会重置会话。因此,所有特定于会话的状态都被丢弃。这包括会话变量(包括系统变量和用户定义的变量)、临时表、事务、会话字符集、会话计数器等。如果其中的任何内容泄漏到从连接池重用连接的后续请求中,将对安全性非常不利。

SELECT ... INTO @user_defined_variable与SET @user_defined_variable = ...在范围或安全性方面没有区别。两个变量都为该用户定义的变量赋值。变量在会话期间保存其值,或直到被分配给不同的值为止。在会话结束时,变量将被丢弃。

如果需要,我还建议在存储过程或触发器中使用局部变量。必须在存储例程的顶部使用DECLARE来创建这样的变量。局部变量的作用域只是创建它的例程。在该例程返回之后,局部变量将被丢弃。

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

https://dba.stackexchange.com/questions/313506

复制
相关文章

相似问题

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