close

在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

 

 

arrow
arrow
    文章標籤
    MySQL
    全站熱搜

    Louis 發表在 痞客邦 留言(0) 人氣()