I privilegi delle Stored Routine
Contents
E' importante decidere con cura i privilegi associati alle Stored Function e delle Stored Procedure. Di seguito è spiegato come funzionano.
Creare Stored Routine
- Per creare una Stored Routine, è necessario il privilegio CREATE ROUTINE. Il privilegio SUPER è necessario se si dichiara un DEFINER che non è il creatore stesso (si veda la clausola DEFINER sotto). Questo privilegio è necessario anche se si utilizza il binary logging basato sulle istruzioni. Si veda Binary Logging of Stored Routines per ulteriori dettagli.
Modificare le Stored Routine
- Per modificare o eliminare una Stored Routine, è necessario il privilegio ALTER ROUTINE. Al creatore della Routine è temporaneamente garantito il permesso di eliminare o modificare la Routine creata, a meno che la variabile automatic_sp_privileges sia impostata a
0
(il valore predefinito è 1).
Eseguire le Stored Routine
- Per eseguire una Stored Routine, è necessario il privilegio EXECUTE. Anche questo privilegio è garantito al creatore della Routine, a meno che la variabile automatic_sp_privileges sia impostata a
0
. - La clausola SQL SECURITY (per default DEFINER) specifica quali privilegi devono essere usati quando la Routine viene chiamata. Se SQL SECURITY è INVOKER, il corpo della funzione viene eseguito utilizzando i privilegi dell'utente che chiama la funzione. Se SQL SECURITY è DEFINER, il corpo della funzione viene sempre valutato usando i privilegi dell'account del definer. DEFINER è il default. Perciò, per default, anche gli utenti che accedono al database associato alla Stored Routine possono eseguire la Routine e potenzialmente eseguire operazioni per le quali normalmente non avrebbero i permessi.
- Il creatore di una Routine è l'account che ha eseguito l'istruzione CREATE FUNCTION o CREATE PROCEDURE, a prescindere dal fatto che la clausola DEFINER sia presente. Il definer per default è il creatore, a meno che non sia specificato diversamente.
- Il server modifica automaticamente i privilegi nella tabella mysql.proc nel modo opportuno, ma non cerca le modifiche effettuate manualmente.
La clausola DEFINER
Se non è specificato, il DEFINER è l'account che ha creato la Stored Routine o la vista. Se tale account dispone del privilegio SUPER, può specificare un altro account come DEFINER.
La clausola SQL SECURITY
Questa clausola specifica il contesto nel quale la Stored Routine o la vista viene eseguita. Può assumere due valori - DEFINER o INVOKER. DEFINER è l'account specificato come DEFINER quando la Stored Routine o la vista è stata creata (vedi sopra). INVOKER è l'account che invoca la Routine o la vista.
Come esempio prendiamo una Routine, creata da un superuser che è specificato come DEFINER, ed elimina tutti i record di una tabella. Se SQL SECURITY=DEFINER, chiunque può eseguire la Routine, che abbia il privilegio delete o meno. Se SQL SECURITY = INVOKER, la Routine elimina i record solo se l'account che la invoca ha i permessi per eseguire questa azione.
INVOKER di solito è meno rischioso, perchè non permette agli utenti di eseguire azioni che normalmente non potrebbero eseguire. Tuttavia non è raro che gli account abbiano permessi relativamente limitati, e che gli sia specificamente garantito l'accesso alle Routine, che sono poi invocate nel contesto DEFINER.