Queries |
2.4 Query protetta da password. |
Davide La Mantia (Sib) |
(D) Come posso creare una query protetta da password? (R) In prima istanza può sembrare non fattibile, ma si può fare con un piccolo artificio. Immaginiamo di avere la tabella anagrafica con i campi Nome, Cognome, Via, e Telefono. Se proteggiamo la tabella sfruttando la protezione utente, l'utente non autorizzato non può aprirla in alcun modo. Per fare lavorare l'utente dobbiamo fare una query con l'opzione "With owneraccess option", questa opzione consente all'utente generico di accedere ai dati tramite la query. Solitamente si lascia l'utente admin come utente generico privato delle autorizzazioni di amministratore, il problema, in questi casi, è impedire l'accesso ai dati a persone non autorizzate. Si può impostare una password in una maschera, ma rimane la possibilità di accedere direttamente alla query. In un simile caso dovrebbe essere la query stessa a chiedere la password. La mia soluzione fa appunto questo, l'SQL: SELECT Anagrafica.Nome, Anagrafica.Cognome, Anagrafica.Via, Anagrafica.Telefono FROM Anagrafica WHERE (((Anagrafica.Nome) Like Like IIf((ParAcc(NZ([PW];"")));"*";""))) WITH OWNERACCESS OPTION;Dove ParAcc([PW]) è una funzione che restituisce True se il parametro [PW] corrisponde alla password e False in caso contrario. Poichè la funzione potrebbe essere scandita da una query che le mandi dentro valori a casaccio, si povrebbe inserire dentro la funzione una variabile Static che, dopo qualche tentativo fallito, cambi la password o blocchi la funzione rendendo necessario riavviare il db. Qualcosa del tipo: Public Function ParAcc (PW as String) as boolean Static Tentativi as integer If Tentativi>3 Then Exit Function If PW=PassWord Then ParAcc=True Tentativi=0 Else ParAcc=False Tentativi=Tentativi+1 End If End FunctionIn alternativa, invece di passare la password come parametro si puo' inserire una inputbox nella funzione. In questo modo non è possibile scandire con una query la funzione poichè sarebbe sempre necessario inserire a mano la password: Public Function ParAcc () as boolean Dim PW as string PW=InputBox("Inserire PassWord") If PW=PassWord Then ParAcc=True Else ParAcc=False End If End FunctionInfine suggerisco di non inserire nel db una stringa che contiene la password, ma di costruire dinamicamente la password all'interno della funzione, in questo modo non sarà visibile la password neanche con un editor esadecimale. |