目前,我正在使用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将永远存在。
发布于 2022-06-18 17:30:25
用户定义的变量是特定于设置它们的会话的。他们不会泄露到其他会议。
每个会话都有自己的变量。不同会话中同名的变量不包含相同的值。就像任何编程语言中的局部变量一样。
即使您使用连接池,以便后续请求重用给定的连接,当连接被回收时也会重置会话。因此,所有特定于会话的状态都被丢弃。这包括会话变量(包括系统变量和用户定义的变量)、临时表、事务、会话字符集、会话计数器等。如果其中的任何内容泄漏到从连接池重用连接的后续请求中,将对安全性非常不利。
SELECT ... INTO @user_defined_variable与SET @user_defined_variable = ...在范围或安全性方面没有区别。两个变量都为该用户定义的变量赋值。变量在会话期间保存其值,或直到被分配给不同的值为止。在会话结束时,变量将被丢弃。
如果需要,我还建议在存储过程或触发器中使用局部变量。必须在存储例程的顶部使用DECLARE来创建这样的变量。局部变量的作用域只是创建它的例程。在该例程返回之后,局部变量将被丢弃。
https://dba.stackexchange.com/questions/313506
复制相似问题