- Home
- Categorie
- Coding e Sistemistica
- PHP
- Sessione Utente con Database
-
Sessione Utente con Database
Salve a tutti ragazzi,
premesso che conosco in linea di massima l'uso delle sessioni di PHP per effettuare l'autenticazione dell'utente e il mantenimento della stessa su più pagine e per diverso tempo; premesso che so che per rendere maggiormente sicure le suddette sessioni di PHP bisogna cambiare il percorso di salvataggio dei dati relativi ad esse su disco (quando si è su hosting condiviso);
mi chiedevo: è sensato creare delle sessioni su Database MySQL funzionanti in questo modo?
Eviterò di specificare funzioni relative la sicurezza del codice.Poiniamo il caso che l'utente si trovi per la prima volta dopo la registrazione a loggarsi sul sito:
- Inserisce user e password;
- Se si trova corrispondenza tra user/pass l'utente è loggato;
2.1 Viene creato un record nella tabella SESSIONE con un ID di sessione univoco, e dati relativi all'utente;
2.2 Viene creato un cookie contenente solo l'id della sessione appena salvata in database, con scadenza ad esempio di 30 minuti;
L'utente chiude il browser e torna dopo un pò di tempo sul sito:
- Apre la pagina;
- Viene cercato il cookie impostato;
2.1 Se non esiste o è scaduto si ripete la fase di login;
2.2 Recupero il valore, trmite query trovo la sessione di riferimento, confronto i dati in db (ottenuti dal primo collegamento) con quelli attuali dell'utente.
Come ragionamento è sensato? Se si, i dati che è possibile recuperare dell'utente sono abbastanza affidabili?
Ad esempio recuperando IP e Browser con le variabili $_SERVER['REMOTE_ADDR'] e $_SERVER['HTTP_USER_AGENT'] si va abbastanza sul sicuro?
Onestamente non mi va di creare l'autenticazione solo con le sessioni di php, anche perchè mi servirebbe quantificare gli utenti connessi e sapere il tipo e la quantità di traffico che c'è in un determinato arco di tempo sul sito.
Consigli? Pareri?
Grazie mille, McK
-
63 visite e nessuna risposta? E' così strana la mia idea?
-
Non riesco a capire...:?
L'id di sessione cambia ogni volta che chiudi e riapri il browser, l'ip cambia ogni volta che spegni e riaccendi il router (a meno che sia un ip fisso).
-
Ciao tigrone,
a me non importa della Sessione di php, io vorrei creare un metodo per autenticare e mantenere una sorta di "sessione di login" tramite database, con uno script che imposto io. Quindi senza utilizzare le sessioni di php. In modo da avere maggiore sicurezza ed evitare che utenti malevoli si approprino di dati di sessione di altri utenti.
-
Le sessioni di php non mi risulta siano cosi pericolose per la sicurezza, anche perchè volendo metti IP e browser pure nella sessione e fai confronti per verificare siano uguali, e non vi è alcuna differenza.
-
@Mck said:
io vorrei creare un metodo per autenticare e mantenere una sorta di "sessione di login" tramite database, con uno script che imposto io. Quindi senza utilizzare le sessioni di php.
Ma sempre una sessione o un cookie dovresti usare (se proprio non ti fidi delle sessioni...) altrimenti l'utente, ogni volta che cambia o ricarica una pagina, sarebbe costretto a reinserire user e password!
-
Ciao ragazzi,
allora! Ho letto un pò a riguardo e finalmente ho trovato una guida esaustiva sulle sessioni.
In pratica ho capito che, per evitare Session fixation, session hijacking, e altri problemi legati alle sessioni, basta rendere sicure le applicazioni da CrossSite Scripting ed SQL Injection, e salvare i dati di sessione su database anzichè su file testuali risiedenti su server.Quello che non ho capito esattamente è come salvare questi dati su database. Voi ne sapete qualcosa? Io naturalmente nel frattempo mi documento meglio.
Devo dire che avevo tralasciato le sessioni tempo fa quando iniziai a studiare php, e me ne sto pentendo molto.
Grazie per il supporto intanto.
-
Fino ad adesso ho trovato due modi:
- Creare sessioni manualmente con solo codice php+database;
- session_set_save_handler();
oppure?
-
Ciao Mck,
Io personalmente utilizzerei le sessioni di php.Se i permessi sono impostati correttamente risolvi il problema del crossSite, mentre per risolvere il problema dell'injection basta rigenerare la sessione ogni volta che si fa il session_start...
Se non stai sviluppando un framework per l'FBI sei sufficientemente sicuro.
Inoltre, dove dovresti far girare tutto ciò, su un server proprietario?
Perché se tutto gira su un hosting condiviso, allora è inutile preoccuparsi troppo: se vogliono bucarti il db, o il sito, stai pur certo che c'è almeno un furbone sulla tua stessa macchina che fornisce tutte le vulnerabilità necessarie ad entrare direttamente sul server.Ciao,
Luca Bartoli
-
in che senso se i permessi sono impostati correttamente?
per prevenire XSS bisogna filtrare i dati in ingresso e uscita, no?Che mi dici invece per il furto dei cookie?
Grazie
-
Se un sito web non ha problemi di XSS, e nessuno può modificare le pagine, non c'è alcun pericolo di furto cookie.
Utilizzare il database per le sessioni dovrebbe degradarne enormemente le prestazioni e l'utilizzo di risorse sale, a fronte di ciò che è a mio avviso un ipotetico incremento di sicurezza.Tu i problemi citati non esistono se effetti un opportuna validazione di tutti i dati di input, volendo ottenere comunque la massima sicurezza usare un sistema di crypt sui cookie memorizzando anche l'indirizzo IP abbatte qualsiasi possibilità che questo possa essere soggetto ad un furto.
Questo sistema viene adottato ad esempio da codeigniter di default (Anche le sessioni vengono memorizzate in un cookie e non sul server), con rigenerazione dopo un certo intervallo di tempo, ma tale scelta è indicata non per motivi di sicurezza ma solo per dare maggior flessibilità agli sviluppatori.
Salvare le sessioni su file o su database, all'atto pratico non fà tutta questa differenza, puoi gestirle tutte allo stesso modo.
-
Però scusami, ho capito che utilizzare l'ip non è comunque molto conveniente.
Un utente può utilizzare una connessione con IP dinamico, che addirittura cambia ad ogni richiesta di pagina, e quindi non poter mai trovare una corrispondenza tra lui/il suo computer e il cookie che gli è stato asssegnato nella pagina precedente.Senza considerare che i dati recuperati dalle variabili superglobali $_SERVER['REMOTE_ADDR'] non sono affidabili. Almeno così scrivono in molti e anche il mio libro di testo. Ma quasi non ci capisco più nulla.
Riguardo le sessioni via database, eviterei problemi tipo Session Hijacking e avrei un maggiore controllo sulle sessioni, potrei comunque eseguire dei calcoli e delle statistiche. (Che posso comunque gestire anche utilizzando le sessioni di php).
Se posso vorrei porvi due domande oltre quello scritto fin'ora:
-
Quando si inizia una sessione, in automatico viene creato un cookie nel client con nome PHPSESSID, per modificare il nome di questo cookie mi basta scrivere session_name(nuovonome);?
-
Quali sono secondo voi i migliori metodi per scongiurare falle di XSS?
Filtrare tutti i dati in ingresso GET/POST con htmlentities e un preg_match specifico, può bastare?
Grazie ancora!
-
-
Con quello che fà htmlentities risolvi i problemi dei tag html, ovvio che se fai echo diretto in mezzo ad un tag script hai sempre problemi di XSS.
Ogni dato deve essere trattato in base all'utilizzo che dovremo farne, non esiste una regola generale.
Tutte le connessioni domestiche sono per lo più con IP dinamico, ma non cambiano IP con una frequenza così elevata nella realtà, a me è capitato un solo utente che avesse un cambio IP frequente su un numero immenso di utenti con cui ho avuto a che fare.Francamente prenderei con le pinze tutto ciò che si può leggere, tenendo in forte considerazione l'anno in cui certe cose vengono scritte(Anni fà la sicurezza è molto lasciata andare a se stessa, e register_global ad esempio comprometteva moltissimo la sicurezza), e la preparazione di chi le scrive, perchè non tutto quello che si legge in molti forum corrisponde alla verità, molte cose vengono riportare per sentito dire e finiscono con il cambiare di post in post.
Ad esempio prova a cercare come si fa ad alterare $_SERVER['REMOTE_ADDR'] e provare a vedere se trovi come è possibile farlo in realtà.Anche utilizzando un database eventualmente non risolveresti, un confronto con qualcosa che ha il client devi sempre farlo per verificare sia effettivamente suo, una soluzione completa non esiste, ognuna può presentare degli aspetti "negativi".
-
allora mi preparo una funzione anti XSS che in pratica:
-
tramite preg_replace e un pattern ad hoc mi toglie tutti i caratteri che non mi aspetto in quel determinato contesto (Es. "£'$%&/,.-+).
-
eseguo un htmlentities sul dato pulito per precauzione e per rendere la funzione utilizzabile su più ambiti.
che te ne pare conterraneo?
Potresti darmi un tuo parere su un mio dubbio esposto prima? Te lo riporto:
- Quando si inizia una sessione, in automatico viene creato un cookie nel client con nome PHPSESSID, per modificare il nome di questo cookie mi basta scrivere session_name(nuovonome);?
Grazie!
-
-
Direi che come soluzione, in linea generale, sia sufficiente.
Si con session_name modifichi il nome del cookie.