2009-12-18 25 views
5

Io uso un semplice sistema di login basato su SESSION vars. Una volta che l'utente effettua l'accesso, viene impostata una variabile var che indica al mio script che l'utente deve essere accettato. Non uso alcun cookie clientide personalizzato var.come creare un sistema di login php sicuro, tenendo conto della funzionalità "mantieni il login"?

Mi piacerebbe offrire l'opzione nella schermata di accesso che dice "mantieni l'accesso all'intero giorno". Come si fa in modo sicuro?

risposta

14

First : Configurare la direttiva session.cookie_lifetime, in php.ini, file di configurazione o tramite session_set_cookie_params().

Successivamente, memorizzare il nome utente e il valore hash della password nella sessione e convalidare tale accesso su ogni pagina. Finché è ancora valido, possono rimanere loggati.

La scadenza naturale del cookie di sessione dovrebbe in genere mantenere le cose in ordine, poiché non sarà possibile disconnettere nessuno nel mezzo della propria sessione (se le stelle sono allineate per questo, ovviamente) se lo mantengono attivo. In mancanza di questo, però, mi piacerebbe prendere in considerazione la soluzione di eCartoth un secondo vicino, come si può solo aggiungere una seconda linea per l'istruzione if:

if (my_validate_user_function($_SESSION['username'],$_SESSION['passhash']) 
    && $_SESSION['deathstamp'] > time() 
) { 
    // user is logged in again, oh boy! 
} 
else { 
    // send in the death robots 
    header('Location: /login.php',true,302); 
} 

EDIT: Una cosa che si potrebbe prendere in considerazione è la sessione di fissazione e/o sessione di dirottamento.Al fine di evitare che, io consiglierei di uno (o entrambi) di due soluzioni:

  1. negozio indirizzo IP dell'utente nella sessione
  2. uso session_regenerate_id() dopo ogni tentativo di accesso riuscito.
+0

L'utilizzo di SESSIONS è l'unico modo per iniziare un buon sistema di sicurezza, +1 – TravisO

+0

puoi esplicitare l'ultima modifica: perché memorizzare l'indirizzo IP dell'utente e rigenerare l'ID della sessione? – pixeline

+2

PHP Accetta più meccanismi per specificare l'ID di sessione (es. Stringa di query), che consente a qualcuno di impostare un ID di sessione predeterminato, inviarlo tramite url a una vittima ignara e, una volta effettuato l'accesso, l'utente malintenzionato potrebbe utilizzare lo stesso ID di sessione per falsificare le credenziali di accesso dell'utente legittimo che sono memorizzate nella sessione. Memorizzando l'IP e/o rigenerando l'ID di sessione su ogni richiesta, l'ID di sessione "fissato" dell'utente malintenzionato è, in effetti, privo di valore. Leggi questo per ulteriori informazioni: http://en.wikipedia.org/wiki/Session_fixation – Dereleased

2

Un'opzione potrebbe essere quella di impostare una tabella MySQL che salvi le variabili di sessione e le associ agli indirizzi IP e una scadenza, ma non sono sicuro di tutti i dettagli su come sarebbero implementati.

Il più semplice (anche se non consigliata) modo per fare quello che stai cercando sarebbe quella di impostare un $_COOKIE con il nome utente e la password sul computer, che il vostro sito sarà allora verificare quando l'utente via.

Per maggiore sicurezza,, sarebbe meglio servire a salvare un solo cookie come hash MD5 salato dei dati dell'utente per fornire a un potenziale hacker minori informazioni sui dati dell'account dell'utente. La durata può essere impostata quando si imposta il cookie; php.net ha una documentazione ragionevolmente completa su come farlo.

+1

Si prega di non inserire la password dell'utente in un cookie – Simon

+1

D'accordo, da qui il suggerimento di hashing l'ho seguito. Consiglio vivamente contro lo stesso tipo di hash che presumibilmente si utilizza per memorizzare la password dell'utente in primo luogo, in quanto sarebbe quasi altrettanto grave. Basalo su diversi dati unici o almeno usa un sale diverso per questo. – Kaji

3

Quando si dice "mantieni l'accesso all'intero giorno", suppongo che intendi solo su quella specifica macchina, giusto? È possibile utilizzare una tabella mysql per ricordare "time of login" o un timestamp di quando tale accesso non sarà più valido se si sceglie di rimanere loggati per tutto il giorno. Quindi aggiungi un po 'di script all'inizio del codice che recupera l'id di quell'utente dai vars della sessione. Confronta il timestamp corrente di quell'utente con l'ultimo 'ts' valido e se è passato quel tempo, sai che dovrebbero essere disconnessi, a quel punto si cancella la sessione e si costringe l'utente ad accedere nuovamente. Questo metodo significa che non verranno effettivamente disconnessi fino a quando non provano a fare qualcosa oltre quel punto, ma a loro sembrerà simile. Inoltre, anziché utilizzare un DB mysql, è possibile memorizzare anche l'ultimo TS valido in una variabile di sessione.

Così, per esempio, quando l'utente accede prima con "Resta collegato tutto il giorno selezionato":

$_SESSION['log_me_out_at'] = strtotime(date("Y-m-d ")."23:59:59"); 

Poi ogni volta che una pagina si accede nel sistema:

if($_SESSION['log_me_out_at'] < time()){ 
    unset($_SESSION['user_is_accepted_in']); 
} 
+0

Hai dimenticato di menzionare che, facendo ciò con le vars di sessione, stai limitando l'accesso a quella macchina specifica, e dal momento che le variabili di sessione non sono accessibili dal lato client in alcun modo non ti preoccupi che questi dati vengano modificati al di fuori del tuo controllo . – eCaroth

+0

il problema con la tua logica è che le vars di sessione non devono essere configurate per durare per un giorno intero! Quindi scadranno prima dell'effettivo 24H, costringendo quindi l'utente a effettuare di nuovo l'accesso. – pixeline

+0

Quindi imposta un cookie sulla macchina degli utenti con il loro uname con la scadenza alla fine di quel giorno. Memorizza un record in una tabella mysql con il loro uname e l'indirizzo IP a cui hanno effettuato l'accesso e, se accedono all'app da quell'IP e il timestamp è ancora valido, lascia che em in altrimenti li costringa ad accedere nuovamente. – eCaroth