2011-09-29 13 views
15

Desidero avere un controllo di opzione di accesso automatico per un utente. Fondamentalmente ciò significa che un cookie verrà memorizzato sul lato client.Progettazione di un sistema di cookie di accesso automatico sicuro in PHP

Ora la domanda è, come posso renderlo sicuro in modo che il cookie non possa essere falsificato/modificato.

Uno dei miei amici suggerisce di avere una tabella di db che memorizzi il session_id, l'ip dell'utente, le informazioni del browser, ecc. E poi la confronta tutte le informazioni una volta che un utente torna al sito.

Mi sento come se avere un tavolo separato per quello è un po 'troppo disturbo. C'è un altro modo per farlo? Forse con gettoni o qualcosa del genere?

risposta

26

Più sicuro si desidera questo cookie infame, più problemi sarà per voi. Se i tuoi utenti dovessero essere particolarmente sicuri, dovrai adottare l'approccio più problematico.

Accettate questo cookie con https se volete essere il più sicuro possibile. Se il cookie è accettato su http, può essere annusato e rubato.

Suggerirei che il cookie non abbia alcun dato utente (un token, come suggerito). Questo, purtroppo, richiederà un altro tavolo. Quando un utente accede e sceglie "keep login", crea una voce in questa tabella. La voce può essere qualsiasi valore priva di significato (come md5(uniqid('', true));. Questo token può essere univoco nel DB e mappato all'ID di un utente.

Quando un utente visita il tuo sito Web, puoi controllare il valore di tale cookie e ottenere l'utente a questo punto, distruggi il vecchio token e creane uno nuovo. "Distruggi" può significare molte cose. Puoi eliminarlo completamente dal DB o avere un flag che disabiliti il ​​token. desidera consentire lo stesso token di essere utilizzato più volte nel caso in cui il cookie sia ricevuto ma l'autenticazione non viene eseguita per qualche motivo, ma penso che non sia sicuro. Puoi anche voler memorizzare il timestamp del token e accettare solo se è stato un periodo di tempo limitato (30 giorni per esempio)

A s indica il tuo amico, puoi memorizzare altre informazioni come user agent, indirizzo IP, ecc., ma queste potrebbero cambiare anche con lo stesso browser utilizzato (specialmente con i dispositivi mobili) e se il login persistente di un utente non viene accettato a causa di questo potrebbe essere scomodo e sconveniente per loro.

Se davvero non si desidera creare un'altra tabella, sarà necessario memorizzare un modo per acquisire l'ID dell'utente dal valore del cookie. Questo è meno sicuro.

+0

"Quando un utente visita il tuo sito web, puoi controllare il valore di quel cookie e ottenere l'utente a cui appartiene e registrarli in" Qual è il modo migliore per farlo? Basta reindirizzarli alla pagina protetta con il loro utente/passare dal db? – CodeCrack

+0

@CodeCrack Hai il controllo completo sull'autenticazione o meno di un utente, quindi non c'è davvero il modo migliore. Fai semplicemente la stessa cosa che faresti dopo aver inserito il nome utente/password. Probabilmente hai (o puoi creare) una funzione o qualcosa chiamato 'complete_login()' i dati necessari alla sessione. –

+0

Qual è il vantaggio di distruggere il vecchio token all'accesso? Presumo che una nuova sarà passata al cliente in quel momento, vero? – Uwe

-3

Il modo in cui l'ho fatto in precedenza è archiviare l'hash MD5 della password e non la password effettiva.

Sul lato server è necessario controllare se il login è venuta da un cookie e quindi verificare se l'hash è lo stesso che la password nel database dopo il suo stato hashing con MD5

In questo modo se qualcuno hack il computer degli utenti non può mai conoscere il valore della password, tuttavia può ancora usare quel cookie per autenticare solo il tuo server.

È possibile rendere questo più sicuro facendo scadere il cookie dopo x giorni, quindi se il cookie viene rubato il theif può accedere solo per quel periodo.

Alla fine della giornata il più e solo? metodo sicuro è rendere l'accesso utente ogni volta

+0

Le password devono essere già sottoposte a hash prima di essere archiviate così come sono. –

+0

Tandu è corretto –

+0

Sì, in più, è possibile utilizzare la tabella Arcobaleno per bloccare la password. – CodeCrack

4

Per la maggior parte degli accessi automatici, lo so, esiste una tabella separata per memorizzare le sessioni registrate. Ad ogni sessione di auto-login viene assegnata una chiave hash come identificatore, la chiave è considerevolmente lunga e praticamente impossibile da falsificare. Se non si desidera che gli utenti vengano registrati in cross-ip anche con un codice valido, provare questo.

function gen_uniqueIdent($length=32){ 
    $alphabet = str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'); 
    $key = ''; 
    for($loop=0;$loop<$length;$loop++){ 
     $i = mt_rand(0,count($alphabet)-1); 
     $key.= $alphabet[$i]; 
    } 
    return $key; 
} 

Assegnare questo valore al cookie utente al momento dell'accesso. Quindi memorizzarlo nel db:

function save_ident($identFromFunctionAbove,$authenticated_user_id){ 
    //hash this with something unique to the user's machine 
    $hashed = md5($identFromFunctionAbove . $_SERVER['REMOTE_ADDR']); 
    /** Some actions to remember this hash **/ 
} 

salvarlo in un database che corregge con un'identità utente come id_utente.

ora su di convalida del cookie dell'utente, si può semplicemente:

function validateCookie(){ 
    $ident = $_COOKIE['yourCookieName']; 
    $hashed = md5($ident . $_SERVER['REMOTE_ADDR']); 
    /** Check if this hashed value exists in db, if it does, authenticate user **/ 
} 

Avrete anche bisogno di rimuovere le sessioni dopo la scadenza o l'utente si disconnette esplicitamente.

Naturalmente questo è molto semplice e non tiene conto di collisioni md5 o ident. Tuttavia, ottenere due stringhe generate a caso da 32 caratteri per essere uguali a quelle generate in precedenza è una possibilità piuttosto sottile.

+0

Una volta che un utente accede con il cookie, devo impostare manualmente la variabile SESSION se lo sto usando per qualcosa o meglio ancora, come viene ripristinata la "sessione"? – CodeCrack

+0

@CodeCrack In realtà, il metodo sopra menzionato sta creando il proprio metodo di gestione delle sessioni in php. Quindi, in sostanza, sì, devi impostare manualmente la variabile SESSION per utilizzare le sessioni PHP con questo metodo. – Jabbany

Problemi correlati