Mysql

在 MySQL 的儲存過程中使用使用者定義的變數是否安全?

  • June 18, 2022

目前我正在使用 MySQL 中的儲存過程,並且在一些過程中使用使用者定義的變數,並且我已經看到該類型的變數在目前會話中被初始化並保持其值直到會話結束。

我也在使用類似的語句,select into @user_defined_variable但我意識到這樣做非常冒險,特別是在登錄/身份驗證方面。所以在這種情況下的解決方案是使用語句set @user_defined_variable而不是select into.

但我真的不確定使用 是否足夠set,因為這種類型的變數會在會話未完成時保持其值。

現在想像一下,伺服器在使用相同的儲存過程上同時收到多個請求,@user_defined_variable在這種情況下會存在值衝突嗎?例如,如果被呼叫的儲存過程login使用了使用者定義的變數@uuidUser,並且被呼叫的儲存過程home也使用了@uuidUser,那麼是否存在該home過程使用過程@uuidUser內部賦值的風險login

注意:我正在使用 Node.js,並且我只有一個與 MySQL 實例的連接,我不會為每個請求創建一個連接。所以@user_defined_variables將永遠存在。

使用者定義的變數特定於設置它們的會話。他們不會洩漏到其他會話。

每個會話都有自己的變數。不同會話中的同名變數不具有相同的值。就像任何程式語言中的局部變數一樣。

即使您使用連接池以便後續請求重用給定連接,當連接被回收時也會重置會話。因此,所有特定於會話的狀態都被丟棄。這包括會話變數(系統變數和使用者定義的變數)、臨時表、事務、會話字元集、會話計數器等。如果這些東西中的任何一個洩漏到重用的後續請求中,對安全性將是非常不利的來自連接池的連接。

SELECT ... INTO @user_defined_variable與之間在範圍或安全性方面沒有區別SET @user_defined_variable = ...。兩者都為該使用者定義的變數賦值。該變數在會話期間保持其值,或者直到它被分配一個不同的值。在會話結束時,該變數被丟棄。

如果需要,我還建議在儲存過程或觸發器中使用局部變數。您必須DECLARE在儲存常式的頂部使用來創建這樣的變數。局部變數的範圍只是創建它的常式。在該常式返回後,局部變數將被丟棄。

引用自:https://dba.stackexchange.com/questions/313506