Risoluzione dei problemi delle variabili globali
In generale, la risoluzione dei problemi delle applicazioni relativi alle variabili globali non è un problema se l'utente che riscontra il problema ha il permesso di LEGGERE le variabili globali. Per conoscere il valore della variabile globale è sufficiente avere l'autorizzazione di READ, emettendo un'istruzione VALUES(Global Variable Name). In alcuni casi, l'utente che esegue l'applicazione non avrà accesso alla lettura della variabile globale.
Il primo scenario illustra un possibile problema di riferimento a variabili globali che ha una soluzione semplice. Il secondo scenario presenta una situazione più probabile in cui l'autorizzazione a LEGGERE le variabili globali deve essere concessa agli utenti appropriati.
Scenario 1
I riferimenti alle variabili globali devono essere qualificati correttamente. È possibile che esista una variabile con lo stesso nome e uno schema diverso, dove lo schema errato viene incontrato prima nel valore del registro PATH. Una soluzione consiste nell'assicurarsi che i riferimenti alla variabile globale siano completamente qualificati.
Scenario 2
Uno sviluppatore di applicazioni developerUser ) crea una serie molto complessa di procedure, viste, trigger e così via, basandosi sul valore di alcune variabili globali di sessione (al contrario delle variabili globali del database) a cui solo lui ha accesso in lettura. Un utente finale dell'applicazione finalUser ) si collega e inizia a emettere SQL utilizzando l'ambiente creato da developerUser. finalUser si lamenta con developerUser perché non può vedere i dati che deve essere autorizzato a vedere. Per risolvere il problema, developerUser cambia il suo ID di autorizzazione in quello di finalUser, collega come finalUser, e prova lo stesso SQL di finalUser. developerUser scopre che finalUser ha ragione e che c'è un problema.
developerUser deve determinare se finalUser vede gli stessi valori delle variabili globali della sessione. developerUser esegue SET SESSION USER per vedere i valori delle variabili globali di sessione che vede finalUser. Ecco un metodo proposto per determinare questo problema e risolverlo.
developerUser chiede all'amministratore della sicurezza secadmUser ) di concedergli il permesso di usare SET SESSION USER come finalUser. Quindi developerUser accede come se stesso e utilizza l'istruzione SET SESSION AUTHORIZATION per impostare il registro speciale SESSION_USER su quello di finalUser. Dopo aver eseguito l'SQL che presenta il problema, si passa nuovamente a developerUser utilizzando un'altra istruzione SET SESSION AUTHORIZATION. developerUser può ora eseguire un'istruzione VALUES e vedere il valore effettivo della variabile globale di sessione.
Segue un esempio di SQL che mostra le azioni compiute nel database da developerUser.
########################################################################
# developerUser connects to database and creates needed objects
########################################################################
db2 "connect to sample user developerUser using xxxxxxxx"
db2 "create table security.users \
(userid varchar(10) not null primary key, \
firstname varchar(10), \
lastname varchar(10), \
authlevel int)"
db2 "insert into security.users values ('ZUBIRI', 'Adriana', 'Zubiri', 1)"
db2 "insert into security.users values ('SMITH', 'Mary', 'Smith', 2)"
db2 "insert into security.users values ('NEWTON', 'John', 'Newton', 3)"
db2 "create variable security.gv_user varchar(10) default (SESSION_USER)"
db2 "create variable security.authorization int default 0"
# Create a procedure that depends on a global variable
db2 "CREATE PROCEDURE SECURITY.GET_AUTHORIZATION() \
SPECIFIC GET_AUTHORIZATION \
RESULT SETS 1 \
LANGUAGE SQL \
SELECT authlevel INTO security.authorization \
FROM security.users \
WHERE userid = security.gv_user"
db2 "grant all on variable security.authorization to public"
db2 "grant execute on procedure security.get_authorization to public"
db2 "terminate"
########################################################################
# secadmUser grants setsessionuser
########################################################################
db2 "connect to sample user secadmUser using xxxxxxxx"
db2 "grant setsessionuser on user finalUser to user developerUser"
db2 "terminate"
########################################################################
# developerUser will debug the problem now
########################################################################
echo "------------------------------------------------------------"
echo " Connect as developerUser "
echo "------------------------------------------------------------"
db2 "connect to sample user developerUser using xxxxxxxx"
echo "------------------------------------------------------------"
echo " SET SESSION AUTHORIZATION = finalUser "
echo "------------------------------------------------------------"
db2 "set session authorization = finalUser"
echo "--- TRY to get the value of gv_user as finalUser (we must not be able to)"
db2 "values(security.gv_user)"
echo "--- Now call the procedure---"
db2 "call security.get_authorization()"
echo "--- if it works it must return 3 ---"
db2 "values(security.authorization)"
echo "------------------------------------------------------------"
echo " SET SESSION AUTHORIZATION = developerUser "
echo "------------------------------------------------------------"
db2 "set session authorization = developerUser"
echo "--- See what the variable looks like ----"
db2 "values(security.gv_user)"
db2 "terminate"