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 Function
In 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 Function
Infine 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.


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.