Newsgroup: it.comp.www.php
Titolo: Gestire un'area riservata

Hola!
Torno sul NG per un po' di consigli riguardo alla gestione di un'area
riservata. Premetto che ho fatto tutte le ricerche del caso, senza
trovare "contenuti edificanti" in merito, anche perchè quello che sto
per proporre non è il "solito" argomento, ossia "come si fa a fare
un'area riservata!
La situazione è questa: sto sviluppando un'area riservata per un
progetto web; questa area sarà circa il 95% del sito, in pratica tutta
l'attività del sito (tranne login, informazioni generali e via dicendo)
verrà gestita in un'area riservata.
Quello che mi chiedo a questo punto è: com'è meglio gestirla?
Attualmente uso un metodo del genere:
- dati di login in sessione (ovviamente non in chiaro)
- controllo in ogni pagina dei dati di accesso, del tipo:
  select count(1) from utenti where username='ABC' and password='XYZ';
Ovviamente il tutto è funzionante ma non so quanto possa essere
"funzionale": il dubbio nasce dal fatto che per ogni pagina visitata
chiamo la funzione di controllo dei dati che, oltre a fare un po' di
calcoli, va ad interrogare il DB.
DB che, poverello, è già parecchio "sotto tortura" per le innumerevoli
interrogazioni che vengono fatte (e il tutto è già parecchio ottimizzato).
Ora mi chiedo: esiste un metodo per "alleggerire" le autorizzazioni?
Io pensavo a due soluzioni:
- usare l'autenticazione di apache, ovviamente non con .htaccess ma
  usando php come "gateway" per l'autorizzazione; al primo accesso dovrò
  per forza fare un controllo sul DB, poi tramite PHP_AUTH_USER e
  PHP_AUTH_PW ho già "l'accesso" memorizzato e vivo tranquillo.
  Ovviamente, assieme a questi dati, aprirò anche una sessione per
  memorizzare tutto il resto dei dati che mi interessano.
- continuare ad usare l'autenticazione così come è adesso, ma non tenere
  i dati di accesso (user e pass) in sessione, bensì solo una
  "variabile" del tipo "loggato/non loggato" e faccio affidamento a
  questa per vedere se l'utente ha accesso o meno all'area (anche qui,
  con tutti gli altri dati "accessori" in sessione).
In questo modo alleggerisco il lavoro del DB e, in linea generale, anche
tutti i controlli legati all'autenticazione ma quello che mi chiedo è:
che livelli di sicurezza ho? E' possibile in qualche modo "aggirare" uno
dei metodi sopra per, che ne so, risultare loggati anche se non lo si è,
prendere "possesso" di dati altrui e via dicendo?
Sottolineo il fatto che non sto gestendo dati sensibili (personali o
"finanziari"), gestisco solo nomi utenti ed email, niente di che! In
ogni caso, non mi piacerebbe assistere a casi di account rubati, accessi
fantasma e via dicendo!
Idee?
Grazie!
--ev
-- 
      My Right brain Left,
but my Left brain is always Right

  con tutti gli altri dati "accessori" in sessione).
questa è la soluzione più intelligente.
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Dev.Staff di E-Xoopport - 
http://dev.e-xoopport.it

> Idee?
Partendo dal presupposto che una sessione, viene creata per quell'utente in
quel momento, ha senso memorizzare solo e tutto quello che ti serve per far
sì che l'utente venga riconosciuto, possa navigare tranquillamente in
amministrazione e attivare disattivare le sue opzioni.
Per esempio:
Il nome utente se vuoi farlo comparire da qualche parte.
L'id utente se ti serve nelle varie pagine per poi recuperare i dati dal DB
ad esso collegati
Alcuni parametri che servono per costruire la pagina (abilitato a questa o
quella funzione)
Ma non devi esagerare altrimenti rischi che la gestione delle sessioni
diventi più pesante dell'accesso al DB.
Sostanzialmente io terrei in sessione tutto quello che potrebbe determinare
o meno l'accesso al DB.
Una volta che l'accesso al DB è necessario per forza, allora da lì tiro
fuori anche il resto.
Ciao
-- 
Armand Federico
www.armand.it

 fuori anche il resto.
E fino a qui siamo sempre d'accordo! :-)
Il discorso che forse non ho spiegato granchè bene è: mi fido a fare una
connessione al DB all'inizio della sessione (ossia, appena l'utente
preme "login"), fare i controlli su user e pass e, senza dover più
toccare il DB, semplicemente memorizzare in sessione una variabile che
mi dica se l'utente è loggato o meno?
Solitamente non lo facevo, ad ogni pagina facevo un controllo sul DB
(progetti molto poco "db-intensive"!), ma adesso, sia per un discorso di
db parecchio utilizzato sia per un discorso di "ma chi me lo fa fare",
pensavo di ricorrere alla "variabilina magica", chiedendomi appunto se
questo metodo fosse abbastanza sicuro!
Ciao!


questo metodo fosse abbastanza sicuro!
Si, è abbastanza sicuro anche perché secondo me con controllo su db è
+ facile un sql-injection (e se le variabili di user-password le
memorizzi in sessione tanto vale memorizzare il permesso avvenuto).
Se poi sei dietro a https vai tranquillo. Non penso che ci sia un
metodo sicuro al 100% ma quello delle sessioni è secondo me il
migliore per facilità, sicurezza, leggerezza e indipendenza dal
sistema.
-- 
Per rispondermi togli il cappello