Question

    

Cette question a déjà une réponse ici:

         

J'utilise 2 variables de cookie (7 jours d'expiration) qui est nom d'utilisateur et de hachage. Hash est encode SHA1 d'agent utilisateur et l'ID utilisateur. Dans ce cas, un pirate peut se connecter qui est connu volé le navigateur de cookie. Par quel chemin dois-je suivre ou pratique qui est le mieux pour se souvenir de moi des problèmes de sécurité?

Était-ce utile?

La solution

Alors que vous pouvez hacher un user_id et secret_key, toute personne qui intercepte ce cookie peut se connecter à votre application. En plus de cela, vous pouvez le faire afin que vos me rappeler les cookies vont rassis très rapidement. Personne n'aime un cookie rassis.

Vous pouvez stocker l'horodatage de la dernière visite de chaque utilisateur dans votre base de données et dans le cookie. Chaque fois que vous lisez le cookie pour connecter l'utilisateur, vous vérifiez que les deux horodatages correspondent. Dans le cas contraire, refuser l'utilisateur. Si elles le font, mettez à jour les horodatages.

En utilisant cette méthode, toute fois que votre utilisateur retourne à votre site, tous les anciens cookies rassis. Un pirate qui a intercepté un cookie a maintenant un cookie rassis sans valeur parce qu'il ne sait pas le timbre heure exacte dans le cookie en cours. Bien sûr, le pirate peut utiliser un cookie frais autant qu'il veut jusqu'à ce que l'utilisateur se connecte avant.

//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, '/')
   }

Cette méthode offre une petite quantité de sécurité, et devrait certainement être utilisé le long des méthodes secondaires proposées dans d'autres réponses. Une clé hachée doit être stockée dans le cookie. Un souvenir de moi cookie ne peut pas être sûr parfaitement, si le mot de passe de rentrée devrait être nécessaire pour tout accès supplémentaire aux données sensibles ou caractéristiques application.

Je recommande également de nommer quelque chose de votre cookie en plus « remember_me » pour le rendre un peu plus difficile à trouver. Bien qu'il n'ajoute pas beaucoup de sécurité, le cas échéant, nommer votre cookie « ht33424 » prend aussi longtemps que le nommant « remember_me » ou « hack_me ».

Autres conseils

Vous pouvez simlply définir la date d'expiration comme maintenant plus d'une année sur le cookie, mais alors un champ Mot de passe dans tous les domaines sensibles, tout comme la mise en œuvre amazon utilisations. Un cookie piraté accordera un accès, mais à l'achat ou quoi que ce soit de modifier le mot de passe personnel nécessite d'être entré nouveau.

Le problème avec les tables « me souvenir » est que si un pirate peut accéder à cette table, il peut créer et connectez-vous pour autant de comptes qu'il veut. Vous pouvez faire valoir qu'il renforce la sécurité d'un me souviens d'avoir fonction, mais il doit être mis en balance avec les risques d'adoucir les zones du genou de la sécurité.

Personnellement, je crée un hachage aléatoire et la stocker dans une table « souvenir de moi ». Le tableau a également l'agent utilisateur, ID utilisateur et l'adresse IP. Je vérifie aussi chaque fois que je vous reconnectez l'utilisateur de la remember-me fonction. Et si l'utilisateur se connecte manuellement, je supprimer simplement cette ligne de la table. Ensuite, si elles se connecter à nouveau, il crée un nouveau hachage aléatoire. Il n'y a vraiment aucun moyen de quelqu'un de combat renifler les paquets avec un système me souvenir (sauf si vous utilisez des cookies sécurisés avec le HTTPS uniquement drapeau ensemble). Il faut donc utiliser une connexion sécurisée avec les cookies HTTPS uniquement. Si vous ne pouvez pas, alors au moins faire le si l'on découvre au hasard le hachage de sorte que vous pouvez générer au moins un nouveau hachage pour tuer cette connexion ...

Vous pouvez éventuellement utiliser des sessions pour stocker le statut de l'utilisateur. Mais la tenue séance si longtemps provoque même problème, lorsque l'identifiant de session sera volé. Vous pouvez joindre des informations cookie avec un autre -. Comme navigateur ou l'adresse IP, mais il poserait un problème, lorsque l'utilisateur ne pas IP statique

Quoi qu'il en soit, la tenue d'une session id est plus sûr que le SHA1 de l'utilisateur vient de mettre endoded mot de passe pour les cookies.

HMAC

je le fais habituellement de cette façon, donc je n'ai rien à stocker sur le côté serveur sur des bases de données ou similaire.

Vous devez générer chaîne aléatoire qui devient votre « clé secrète » et que vous avez à stocker sur le côté serveur (probablement dans un script php config comme une constante) et que vous avez jamais dire à tout le monde. Je vais appeler cette clé secrète SECRET_KEY.

Ensuite, votre cookie doit définir deux valeurs:

  • USER_ID: l'ID utilisateur de l'utilisateur qui va obtenir le connexion automatique
  • HASH: Un hachage cryptographique sécurisé de USER_ID et SECRET_KEY. Ainsi, par exemple, md5(USER_ID . "-" . SECRET_KEY). (Autre chose que md5, comme SHA1 ou SHA256 est préféré).

Alors votre cookie final pourrait être:. USER_ID:HASH

Ensuite, lorsque vous devez vérifier si un cookie est un véritable souvenir de moi cookie, vous devez le faire:

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

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

Le point est que vous seul pouvez générer un hachage qui passe cette vérification parce que le hachage a besoin non seulement la USER_ID mais aussi la SECRET_KEY qui est inconnu par une personne autre que le serveur! :)

Comme indiqué dans les commentaires que vous pouvez le faire en utilisant la fonction hash_hmac en PHP> = 5.1.2: http://us.php.net/manual/en/function.hash-hmac.php

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top