PHP - utiliser Cookies

Bonjour,
Je me permet de vous demander un renseignement SVP,

car j'ai lu pas mal de tutos sur les cookies, mais je comprend toujours pas trop comment bien y sécuriser.

Pour le moment j'ai ces codes :

Dans la page login.php :
<?php
if(isset($_POST['remember'])) { 	// si l'utilisateur coche la case à cocher
	setcookie("cookname", sha1($_SESSION['Auth']['pseudo'] . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 3, "/", '', false, true);
}


Dans la page logout.php :
<?php
setcookie("cookname", sha1($_SESSION['Auth']['pseudo'] . $_SERVER['REMOTE_ADDR']), time() - 3600 * 24 * 3, "/", '', false, true);
unset($_COOKIE['cookname']);


ça fonctionne, mais on m'a dit que ça pouvais être mal sécurisé (sans trop m'expliquer le pourquoi).

Dois-je ajouter dans le header de mon Admin une vérification en plus?
par exemple:
<?php
if(isset($_COOKIE['cookname']) && !isset($_SESSION['Auth'])) {
...


Merci beaucoup

4 réponses

  1. Ce que tu fais n'est pas très sécurisé car en connaissant comment tu crées ton cookie, on peut le modifier pour avoir accès au compte d'une autre personne. En effet il suffit que je fasse depuis mon site un sha1 du pseudo d'une personne cible avec son IP et je peux me connecter sur son compte. Le mieux est de générer un cookie avec en valeur une clé unique (unique_id) par exemple, et de stocker en base de donnée le pseudo auquel il correspond comme ça on ne peut pas trouver les cookies des autres utilisateurs (sauf avec beaucoup de chance)
    1. Modérateur
      L'idéal reste quand même d'utiliser les Sessions, car les données sont stockées coté serveur et non client.
      1. Contributeur
        Son cookie peut n'être qu'un ID (certes pas sécurisé), et hypothétiquement il stockerait les infos sur son serveur, imitant donc le comportement des sessions.
        Mais bon tant qu'à avoir un système qui gère ça à ta place, inclus dans PHP qui plus est...
      2. Sauf que les sessions expirent au bout de 5 minutes d'inactivité donc on ne peut pas utiliser les cookies pour les "rester connecté"
      3. Contributeur
        @Utilisateur anonymeD'où tu sors ça? Dans les deux cas ($_SESSION ou système fait main) tu n'es pas limité à 5 minutes à moins que tu ne configures le système comme ça.
      4. @ElementWpar défaut une session ne reste que durant la visite de l'utilisateur
    2. Bonsoir.
      Merci pour vos réponses.
      En faite, mon but est que l'utilisateur puisse cocher une case à cocher "rester connecter" lors du login.

      Et j'ai fait plein de recherches, et je n'ai pas trouvé grand chose.
      On peut y faire avec les session? comment on fait? merci
      1. Modérateur
        Ah, d'accord, dans ce cas, 2 cookies a longue durée de vie, avec l'un le pseudo (pour retrouver l'utilisateur) et l'autre, avec un hash (MD5 ou SHA, par exemple) du navigateur utilisé (user-agent) et quelques autres informations, histoire de rendre le tout difficilement copiable/usurpable, serait envisageable.
      2. Contributeur
        @NHenryAttention toutefois, on ne fait le hash qu'une fois et on ne revérifie pas derrière: je peux changer d'IP toutes les minutes par rotation de proxy, et faire changer (voire retirer) mon user-agent (automatiquement ou pas) via une extension anti-tracking. Pourtant je reste la même personne avec le même compte.
      3. Modérateur
        Le contrôle par User-agent permet d'éviter de se faire "voler" le cookie d'identification.
        Je n'ai pas mis l'IP dans la liste des données, car je sais qu'elle peut changer entre 2 passage.
    3. Bonsoir.
      Ok merci.
      Dans la page Login je fait ceci dans le traitement :

      <?php
      if(isset($_POST['remember'])) {
      setcookie("cookname", sha1($_SESSION['Auth']['pseudo'] . uniqid() . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 3, "/", '', false, true);
      setcookie("cookmail", sha1($_SESSION['Auth']['mail'] . uniqid() . $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 3, "/", '', false, true);
      }


      Et dans le header de l'admin je rajoute ceci :
      <?php
      // Sécurité - Cookies. Si un des deux cookie est absent -> Déconnecté !
      if(isset($_COOKIE['cookname'])) {
      	if(!isset($_COOKIE['cookmail'])) {
      		header('Location: logout.php');
      		exit();
      	}
      }
      elseif(isset($_COOKIE['cookmail'])) {
      	if(!isset($_COOKIE['cookname'])) {
      		header('Location: logout.php');
      		exit();
      	}
      }
      

      C'est bien comme ceci qu'il faut faire? (notamment avec le user_agent)?
      Merci