Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    47

    Controllo utente loggato

    Salve, sono di nuovo qui per chiedere consigli ai pi� esperti.
    Sto realizzando un modulo di login per proteggere le pagine con gli accessi autorizzati.
    Praticamente se le credenziali sono giuste salvo le sessioni compresa la password hash e poi verifico se esistono e se email e password coincidono.
    Lo so che basterebbe memorizzare solo la sessione id per proteggere le pagine ma a me interessa la sicurezza.
    E' giusto come ragionamento? O c'� un modo pi� pulito per scrivere questo?

    Codice PHP:
    public function utenteLoggato(){
        
    $utenteLoggato = array($_SESSION['utente_loggato'], $_SESSION['utente_id'], $_SESSION['utente_email'], $_SESSION['utente_nome'], $_SESSION['utente_password']);
          if (isset(
    $utenteLoggato[0], $utenteLoggato[1], $utenteLoggato[2], $utenteLoggato[3], $utenteLoggato[4]) && $utenteLoggato[0] === true) { //controllo se ci sono tutte le variabili
            
    if ($this->utentecollegato->password === $_SESSION['utente_password'] && $this->utentecollegato->email === $_SESSION['utente_email']) { //controllo se la password e l'email corrispondono
            
    return true;  
          } else {
            
            
    $this->logout(); // scollego l'utente
            
    return false;
          }
          } else {
            return 
    false;
          }
          
        } 

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,941
    Io vedo un po' di confusione nel codice.
    Per decidere se un utente è loggato o no basta una variabile in sessione e la password in sessione non ci si mette mai, quella sta bene nel db.

    Quando un utente tenta il login verifichi l'email e la password inserite, se hanno riscontro nel db salvi una variabile in sessione che chiamerai come ti pare e alla quale darai il valore che ti pare. In ogni pagina riservata agli utenti loggati verifichi la presenza di tale variabile.
    Se poi vuoi anche avere disponibili alcuni dati dell'utente, password esclusa, metti anche questi in sessione, ma per fare ordine li organizzerei in una struttura del tipo
    $_SESSION['utente']['username'], $_SESSION['utente']['email'] ecc...

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    758
    Non ho capito quel codice dove va all'interno del processo di login, comunque mi sembra una ridondanza inutile, questi sono i passi che farei io.

    Partiamo con l'utente che ti invia username e password per fare il login, tu poi:

    - cerchi nel db l'utente tramite la mail, così sei sicuro che la mail appartiene a lui
    - a questo punto avrai un oggetto utente con dentro id, email e password
    - verifichi la correttezza della password confrontando gli hash tra quella inviata e quella nel db
    - se la pass è corretta crei la sessione e imposti le varie variabili di sessione che ti servono
    - se la pass non è corretta non crei la sessione e gestisci l'errore

    Quello che fai tu è ricontrollare email e password subito dopo che l'utente si è loggato, ho capito bene?
    In questo caso è inutile, perché entrambe i controlli sono stati fatti in fase di login, quindi rifarli è superfluo.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    47
    Allora, in realtà quello di ricontrollare email e password anche dopo il login è un consiglio scritto in un libro aggiornato di php da cui sto cercando di imparare.
    E i motivi che spiega il libro sono i seguenti:
    se un utente per esempio si collega da più postazioni e si scorda la sessione aperta su una postazione, quella sessione sarà attiva finchè non scade e qualsiasi maleintonziato potrebbe averci accesso.
    Esempio: l'utente ritornando a casa si ricorda di aver lasciato il pc dell'università acceso, decide quindi di cambiare password. Il maleintonziato che ha accesso all'altro pc verrebbe disconnesso perchè non c'è più riscontro con la password del database e quella della sessione.
    ovviamente il libro chiarisce che l'importante è salvare la password in hash sulla sessione, perchè anche se qualcuno dovesse avere accesso ai file in cui si salvano le sessioni non avrebbe cmq modo in alcun modo di decifrarla, visto che la si salva in argon2I.

    Io vorrei avere queste sicurezze. Come si potrebbe fare quindi se voi dite che è meglio non salvare la password in sessione?

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    758
    Se vuoi che l'utente non possa essere loggato da più postazioni contemporaneamente puoi salvarti nel db all'interno dell'oggetto utente l'id di sessione (in fase di login) e fare un controllo solo su quello. In ogni pagina in cui l'utente deve essere autenticato controlli se l'id della sessione e quello sul db sono gli stessi, in quel caso è tutto ok, se invece non è così consideri nulla l'autenticazione, ripulisci sessione e campo del database e fai effettuare il login nuovamente. Ovviamente in fase di logout devi cancellare sia la sessione sia il campo del db dove hai salvato l'id di sessione.

    Così, nel caso che mi hai descritto, se un utente lascia il browser aperto con una sessione attiva in ufficio/facoltà una volta arrivato a casa invaliderà quella sessione semplicemente facendo il login da una postazione diversa, senza bisogno di cambiare password.

    Su questi argomenti sono un po' arrugginito perché negli ultimi anni usando i framework il processo di autenticazione spesso lo tocco a fatica, ma non credo di averti detto cazzate

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    47
    Quote Originariamente inviata da M4V1 Visualizza il messaggio
    Se vuoi che l'utente non possa essere loggato da più postazioni contemporaneamente puoi salvarti nel db all'interno dell'oggetto utente l'id di sessione (in fase di login) e fare un controllo solo su quello. In ogni pagina in cui l'utente deve essere autenticato controlli se l'id della sessione e quello sul db sono gli stessi, in quel caso è tutto ok, se invece non è così consideri nulla l'autenticazione, ripulisci sessione e campo del database e fai effettuare il login nuovamente. Ovviamente in fase di logout devi cancellare sia la sessione sia il campo del db dove hai salvato l'id di sessione.

    Così, nel caso che mi hai descritto, se un utente lascia il browser aperto con una sessione attiva in ufficio/facoltà una volta arrivato a casa invaliderà quella sessione semplicemente facendo il login da una postazione diversa, senza bisogno di cambiare password.

    Su questi argomenti sono un po' arrugginito perché negli ultimi anni usando i framework il processo di autenticazione spesso lo tocco a fatica, ma non credo di averti detto cazzate
    Lo avevo pensato, ma io uso il session regenerate id, quindi non credo si possa fare perchè cambia sempre ad ogni azione.
    Avevo pensato invece a memorizzare ad ogni login l'user agent con
    Codice PHP:
    $_SERVER['HTTP_USER_AGENT'
    memorizzare tutti gli accessi dai vari dispositivi, ad ogni azione viene fatto un controllo se esiste l'user agent altrimenti termina la sessione.
    E poi dare la possibilità all'utente di disconnettere tutti i dispositivi semplicemente cancellando tutti i record sul database.
    E'giusto come ragionamento? E soprattutto l'user agent è univoco o possono esisterne di uguali?

  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,941
    Quote Originariamente inviata da carlos84 Visualizza il messaggio
    ...
    E'giusto come ragionamento? E soprattutto l'user agent è univoco o possono esisterne di uguali?
    L'user agent altro non è che la firma del browser in uso quindi un certo browser browser nella stessa versione, avrà user agent uguale ovunque viene installato.
    Firefox 67.0 sul mio PC risulta lo stesso user agent di Firefox 67.0 installato sul tuo.

    Ti voglio chiedere una cosa: stai facendo tutto questo a scopo didattico, perché la tua applicazione gestisce dati sensibili o per tua paranoia?
    Perché per un sito normale tutto ciò è esagerato.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    758
    Va bene rigenerare l'id, ma solitamente si fa a login/logout o quando cambiano i permessi dell'utente loggato (se gli cambi il livello di autorizzazione o se l'utente modifica i suoi dati personali). In generale tra login e logout ti conviene mantenere lo stesso id di sessione.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    47
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    L'user agent altro non è che la firma del browser in uso quindi un certo browser browser nella stessa versione, avrà user agent uguale ovunque viene installato.
    Firefox 67.0 sul mio PC risulta lo stesso user agent di Firefox 67.0 installato sul tuo.

    Ti voglio chiedere una cosa: stai facendo tutto questo a scopo didattico, perché la tua applicazione gestisce dati sensibili o per tua paranoia?
    Perché per un sito normale tutto ciò è esagerato.
    sto realizzando un gioco online ovviamente a scopo amatoriale e visto che è pratica comune il furto di account nei giochi online, voglio evitare che ciò possa accadere

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    47
    Quote Originariamente inviata da M4V1 Visualizza il messaggio
    Va bene rigenerare l'id, ma solitamente si fa a login/logout o quando cambiano i permessi dell'utente loggato (se gli cambi il livello di autorizzazione o se l'utente modifica i suoi dati personali). In generale tra login e logout ti conviene mantenere lo stesso id di sessione.
    Alla fine ho realizzato il metodo che mi hai consigliato, ovvero salvare nel database l'id della sessione al momento del login e fare un controllo se ad ogni azione corrisponde l'id.

    Ma quindi un modo per sapere se un utente si collega da una postazione diversa non esiste?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.