在MySQL上面建立procedure、function or trigger時,會看到要寫DEFINER = XXX@XXX 的語句
因為剛開始還不清楚這個語句會有什麼影響,還真的不小心撞到牆
所以紀錄並分享一下Definer跟SQL sercurity的功用
當我們原本撰寫的語法如下
CREATE PROCEDURE SP名稱()
BEGIN
內文
END
但建立後在開起來改時,會發現增加了DEFINER這段
CREATE DEFINER = 登入帳號@主機IP PROCEDURE SP名稱()
BEGIN
內文
END
DEFINER代表建立者,所以設定建立這隻SP的登入帳號跟對應的主機IP,可以把主機IP改成%,不限制特定主機IP
'AP_USER'@'192.168.0.1' -> 'AP_USER'@'%'
如果只是單純顯示建立者,看起來好像沒什麼影響
這時就要再看到SQL SECURITY這個語句的部分
SQL SECURITY { DEFINER | INVOKER }
SQL SECURITY代表的意思是呼叫這支SP時是使用什麼身分來執行內文
當沒有特別寫SQL SECURITY語句時,其實MySQL是使用預設值,所以可以省略這段
而預設值就是SQL SECURITY DEFINER,代表是使用定義這個SP的帳號,即為範例的AP_USER
如果改使用INVOKER代表是使用呼叫這支SP的帳號去執行內文
這看起來好像沒什麼問題,問題就在於DEFINER or INVOKER有沒有權限執行內文中的操作
可能內文要去存取另一個資料庫的資料,而使用的帳號並沒有權限去存取,這時執行這支SP就會失敗
那好像不要用INVOKER不就好了,但這就是資安權限的問題
有時候我們為了方便不會每個帳號個別設定可以執行哪幾隻SP,都是只設定能不能執行SP
這時設定SQL SECURITY INVOKER就可以在保障一層,避免沒有權限的人即使執行了也無法成功
CREATE DEFINER = 登入帳號@主機IP PROCEDURE SP名稱()
SQL SECURITY {DEFINER | INVOKER }
BEGIN
內文
END
留言列表