Domanda

    

Questa domanda ha già una risposta qui:

         

Sto usando 2 variabili a Cookie (7 giorno di scadenza) che è user id e hash. Hash è codificare sha1 di user agent e user id. In questo caso, alcuni hacker può accedere chi è il know rubato il browser del cookie. Da che parte devo seguire o che la pratica è meglio per me ricordare i problemi di sicurezza?

È stato utile?

Soluzione

Mentre è possibile hashing un user_id e SECRET_KEY, chi intercetta questo cookie può accedere alla propria applicazione. In aggiunta a questo, è possibile fare in modo che i tuoi ricordi di me cookie andare stantio molto rapidamente. A nessuno piace un biscotto stantio.

È possibile memorizzare il timestamp dell'ultima visita di ciascun utente nel database e nel cookie. Ogni volta che si legge il cookie per registrare l'utente, si controlla per vedere che entrambi i timestamp corrispondono. Se non lo fanno, negare l'utente. Se lo fanno, aggiornare i timestamp.

Utilizzando questo metodo, ogni volta che i rendimenti degli utenti del tuo sito, tutti i vecchi cookie andare stantio. Un hacker che ha intercettato un cookie ora ha un biscotto stantio inutile perché non conosce l'esatta data e ora nel cookie corrente. Naturalmente, l'hacker può utilizzare un cookie fresca tanto quanto vuole fino a quando l'utente accede indietro a.

//check for cookie
if(isset($_COOKIE['remember_me'])) {
   // get hash and time stamp from cookie
   $hash = substr($_COOKIE['remember_me'],0,40);
   $last_visit = substr($_COOKIE['remember_me'],41);

   // query your db with $hash and $last_visit

   // if hash and time stamp match up
      // log in

      // store the current time stamp in a variable to use for both
      $time = date("Y-m-d H:i:s");
      // update the time stamp in your cookie
      $cookie = $pass . "-" . $time;
      setcookie('remember_me', $cookie, time()+60*60*24*100, '/');
      // update the time_stamp in your database
   else {
      // remove the remember me cookie
      setcookie('remember_me', '', time()-42000, '/')
   }

Questo metodo offre una piccola quantità di sicurezza, e dovrebbe certamente essere utilizzato insieme metodi collaterali proposti in altre risposte. Una chiave hash deve essere conservato nel cookie. Un ricordo mi cookie non può essere perfettamente sicuro, quindi la password di rientro deve essere richiesta per qualsiasi ulteriore accesso alle funzioni di dati o applicazioni altamente sensibili.

Ho anche consigliamo di chiamare il vostro cookie di qualcosa oltre 'remember_me' per renderlo un po 'più difficile da trovare. Anche se non aggiunge molto di sicurezza, se del caso, chiamare il vostro cookie 'ht33424' prende appena finchè chiamandolo 'remember_me' o 'hack_me'.

Altri suggerimenti

È possibile simlply impostare la data di scadenza come ora, più un anno sul biscotto, ma poi hanno un campo Password entra in tutte le aree sensibili, proprio come l'attuazione amazon usi. Un cookie dirottato concederà l'accesso, ma per l'acquisto o modificare qualcosa di personale richiede una password per essere rientrato.

Il problema con 'Ricordati di me' tabelle è che se un hacker può accedere a questa tabella si può creare e di accesso al maggior numero di account come vuole. Si può discutere rafforza la sicurezza di un ricordami caratteristica, ma ha bisogno di essere pesato con i rischi di rammollimento aree del ginocchio della sicurezza.

Personalmente, mi crea un hash casuale e conservarla in una tabella "ricordati di me". Il tavolo ha anche l'agente utente, ID utente e l'indirizzo IP. Posso controllare sia ogni volta che ho ri-effettuare il login l'utente dal ricordo-me funzione. E se l'utente esegue manualmente, semplicemente rimuovere tale riga della tabella. Se poi login di nuovo, si crea una nuova hash casuale. Non c'è davvero nessun modo per combattere qualcuno sniffing di pacchetti con un sistema ricordati di me (a meno che non si utilizza i cookie sicuri con l'HTTPS unico set bandiera). Così utilizzare una connessione sicura con i biscotti HTTPS-solo. Se non è possibile, allora almeno fare il l'hash in modo casuale se si scopre che si può almeno generare una nuova hash per uccidere che login ...

È possibile eventualmente utilizzare le sessioni per memorizzare lo stato di utente. Ma l'organizzazione di sessioni così a lungo causare lo stesso problema, quando ID di sessione viene rubato. Puoi unirti informazioni biscotto con qualche altro -. Come browser o indirizzo IP, ma sarebbe causare un problema, quando l'utente non hanno IP statico

In ogni caso, in possesso di un ID di sessione è più sicuro che SHA1 solo mettendo dell'utente endoded password per i cookie.

HMAC

Di solito lo faccio in questo modo così non ho niente da memorizzare sul lato server su database o simili.

È necessario generare stringa casuale che diventa la tua "chiave segreta" e che si deve memorizzare sul lato server (probabilmente in uno script di configurazione di PHP come una costante) e non avete mai dire a nessuno. Chiamerò questo SECRET_KEY chiave segreta.

Poi il cookie deve impostare due valori:

  • USER_ID: L'ID utente dell'utente che otterrà l'accesso automatico
  • HASH: un hash crittografico sicuro di USER_ID e SECRET_KEY. Così, per esempio, md5(USER_ID . "-" . SECRET_KEY). (Diverso Qualcosa di MD5, come sha1 o sha256 è preferito).

Quindi, il cookie finale potrebbe essere:. USER_ID:HASH

Poi, quando si controlla se un cookie è un vero e proprio ricordarsi di me Cookie, devi fare così:

function isCookieGenuine($cookie_value) {
  list($value, $hash) = explode(':', $cookie_value, 2);

  if (md5($value . "-" . SECRET_KEY) == $hash)
    return true;
  else
    return false;
}

Il punto è che solo è possibile generare un hash che passa questo controllo perché l'hash ha bisogno non solo il USER_ID ma anche la SECRET_KEY che è sconosciuto da chiunque non sia il server! :)

Come notato nei commenti che si possono fare questo usando la funzione hash_hmac in PHP> = 5.1.2: http://us.php.net/manual/en/function.hash-hmac.php

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top