[PHP] Collision de sessions

Collision de sessions [PHP] - PHP - Programmation

Marsh Posté le 04-12-2005 à 13:26:29    

Bonjour,
 
Je developpe un site en php qui devient assez frequenté.
 
Et j'ai eu la mauvaise surpprise d'apprendre que des utilisateurs se retrouvaient logués à la place d'autre utilisateur.
 
Par exemple l'utilisateur Toto arrive sur le site, et pouf par magie il se retrouve logué comme Dupont.
Ca ne m'est pas arrivé à moi, mais j'ai discuté avec l'utilisateur Toto qui me dit qu'elle n'a pas connaissance du password de Dupont et qu'elle n'a pas chercher à usurper l'identité de quelqu'un d'autre...
 
Est-ce que vous avez deja eu des problèmes avec des sessions en php4 ?
Comment éviter des collisions de sessions ?
 
merci d'avance
 
Fluminis


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 04-12-2005 à 13:26:29   

Reply

Marsh Posté le 04-12-2005 à 14:55:03    

Ca pourrait pas être un bug dans ton code d'identification ?


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-12-2005 à 18:38:04    

Curieux ! Comme sielfried, je pense au code d'identification ! Est-ce que le code est unique pour chaque utilisateurs ? est-ce qu'il sont générés manuellement ou automatiquement ?
 
@+

Reply

Marsh Posté le 04-12-2005 à 18:54:37    

Je ne vois pas ce qui cloche dans mon script de login, mais si vous voyer une faille je suis preneur :)
 

Code :
  1. <?
  2. /***************************************************************************
  3. *                              entrer.php
  4. *                            -------------------
  5. *   Check si le login et le password sont exacts et met a jour le cookie
  6. *
  7. ***************************************************************************/
  8. //reccupere les identifiants de connexion
  9. include_once("config.php" );
  10. if(!empty($_COOKIE['cookie_login']) && !empty($_COOKIE['cookie_pass'])) {
  11. $_POST['login']=$_COOKIE['cookie_login'];
  12. $_POST['pass']=$_COOKIE['cookie_pass'];
  13. }else if(empty($_POST['login']) xor empty($_POST['pass'])) {
  14. ?>
  15. <script language="javascript">
  16. alert("Erreur !! Mettez un login et un mot de passe" );
  17. </script>
  18. <?
  19. return;
  20. }
  21. if(!empty($_POST['login']) && !empty($_POST['pass'])) {
  22. myAddSlashes($_POST['login'],false);
  23. myAddSlashes($_POST['pass'],false);
  24. $login = $_POST['login'];
  25. $pass = $_POST['pass'];
  26. // on recupère le password de la table qui correspond au login du visiteur
  27. $sql = "SELECT motpasse,statut,id,visite FROM tbl_user WHERE login='$login'";
  28. $req = db_query($sql);
  29. if($data = @mysql_fetch_array($req)){
  30.  if($data['motpasse'] != $pass) {
  31.   if(session_is_registered('bad_login')){
  32.    include("delog.php" );
  33.   }else{
  34.    $_SESSION['bad_login']=true;
  35.   }
  36.   ?>
  37.   <script language="javascript">
  38.   alert("Mauvais Login / Password. Veuillez recommencer. (2)" );
  39.   self.location="index.php";
  40.   </script>
  41.   <?
  42.   exit;
  43.  }else{
  44.   $_SESSION['login'] = $login;
  45.   $_SESSION['userid'] = $data['id'];
  46.   $_SESSION['statut'] = $data['statut'];
  47.   $_SESSION['last_visite'] = $data['visite'];
  48.   $query="UPDATE tbl_user SET dernierevisite=visite, visite=NOW()+0 WHERE id='".$data['id']."' LIMIT 1";
  49.   $result = db_query($query);
  50.   setcookie("cookie_login",$login,time()+3600*24*10, '/',$CONF['cookie_domain']);
  51.   setcookie("cookie_pass",$pass,time()+3600*24*10, '/',$CONF['cookie_domain']);
  52.   $query = "DELETE FROM alerte WHERE iduser='".$_SESSION['userid']."' AND date<'".$_SESSION['last_visite']."'";
  53.   db_query($query);
  54.   if($_SESSION['last_visite'] < '20050818000000' || $_SESSION['last_visite'] =="" ){
  55.    header("location: disclamer.php" );
  56.    exit;
  57.   }
  58.  }
  59. }else{
  60.  if(session_is_registered('bad_login')){
  61.   include("delog.php" );
  62.  }else{
  63.   $_SESSION['bad_login']=true;
  64.  }
  65.  ?>
  66.  <script language="javascript">
  67.  alert("Mauvais Login / Password. Veuillez recommencer. (3)" );
  68.  </script>
  69.  <?
  70. }
  71. }
  72. ?>


 
la page delog.php

Code :
  1. <?
  2. session_start();// on démarre la session
  3. session_unset(); // on efface toutes les variables de session
  4. session_destroy(); // on detruit la session en cours.
  5. include("config.php" );
  6. setcookie("cookie_login", "", time() - 3600, '/',$CONF['cookie_domain']);
  7. setcookie("cookie_pass", "", time() - 3600, '/',$CONF['cookie_domain']);
  8. header('location: index.php') ;
  9. ?>


 
et sur mes pages protégées :

Code :
  1. if(!session_is_registered('login') || !session_is_registered('statut') || $_SESSION['statut']<>"admin" ){
  2. print_error("Seul un administrateur est authorisé à voir cette page" );
  3. exit;
  4. }



---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 05-12-2005 à 18:53:45    

Code :
  1. if(!empty($_COOKIE['cookie_login']) && !empty($_COOKIE['cookie_pass'])) {
  2.     $_POST['login']=$_COOKIE['cookie_login'];
  3.     $_POST['pass']=$_COOKIE['cookie_pass'];

Chouet, moi, "bizouille", je vais rendre visite à "tata" et je me conecte sur ton site. Tata qu'est passé dessus avant moi a gentiment remplis le cookie de son navigateur.
D'aprés toi, lequel des deux comptes tombe à l'eau?
 
Franchement, faire primer l'id et le mot de passe stocké dans le cookie par rapport à celui qu'on vient de saisir, ca me semble être une sécurité zéro vu que n'importe qui sera logué sous le compte du premier passé. Et sotcker le mot de passe en clair dans le cookie, ca me semble une sécurité triple zéro. (c'est si simple de copier un fichier d'un ordi à un autre ou de lire le contenu du fichier pour récupérer les valeurs qui sont dedans, et pire, avec firefox, le navigateur va gentiment nous donner les infos de lui même comme un grand)
 
Et

Code :
  1. }else if(empty($_POST['login']) xor empty($_POST['pass'])) {

signifie : si un des deux est pas remplis alors on affiche le message d'erreur, mais si aucun des deux n'est remplis, on continu (xor <> or : xor = ou exclusif = "l'un ou l'autre mais pas les deux" or = "un ou l'autre ou les deux"
 
EDIT : Tu veux que je continus plus loin pour trouver d'autres gros bugs ou tu reprends ton code pour le corriger comme un grand? ;)


Message édité par omega2 le 05-12-2005 à 18:56:05
Reply

Marsh Posté le 05-12-2005 à 19:02:07    

Hum...
 
Pour ce qui du password en clair dans le cookie, je te l'accorde c'est une sécurité zéro, mais si tu veux que le l'utilisateur quand il revient sur ton site soit reconnu, tu veux stocker quoi ?
De toute facon quoi que tu stockes, il suffit de voler les cookies et hop tu es logué à la place de l'autre.
 
Pour le xor, c'est juste pour faire un message dans le cas ou l'un des deux est nul. Dans le cas ou les deux sont vides, c'est qu'il ne tente pas de se loguer, donc c'est un visiteur lambda et je n'ai pas a faire de traitement particulié.
 
Veux bien que tu continues à regarder mon code :)


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 06-12-2005 à 01:43:33    

Pour le password, tu stockes une valeur unique permettant d'identifier un utilisateur unique mais qui est pas son password!
 
T'as pas besoin de son password pour qu'il fasse une action :??:

Reply

Marsh Posté le 06-12-2005 à 14:39:59    

fluminis a écrit :

Hum...
 
Pour ce qui du password en clair dans le cookie, je te l'accorde c'est une sécurité zéro, mais si tu veux que le l'utilisateur quand il revient sur ton site soit reconnu, tu veux stocker quoi ?

Un id quelconque à durée de validité déterminé. Ainsi, même si le cookie est volé, il ne poura pas servir éternellement. En, plus, en cas de vol de cookie, c'est moins génant de dévalider cet id que le compte complet.
 
En fait, le mieux que j'ai vu sur un site, c'est une possibilité de "ralonger" la durée de vie de la session pour pas avoir à se reconecter trop souvent sans que la conection ne reste éternelle.

Reply

Marsh Posté le 06-12-2005 à 18:33:45    

il peut déjà commencer par crypter le password dans le cookie ou le stocker sous sa forme md5 (par ex). Bien entendu, il faut que le password soit stocké en md5 dans la bd... Au moins, comem ça, le password n'est pas connu de celui qui lira le cookie.

Reply

Marsh Posté le 06-12-2005 à 18:37:52    

Certe, mais quelque soit l'élément inscrit dans le cookie, il faut aussi que la fin de validité de cet élément soit géré du côté du serveur et pas simplement par date de fin de validité du cookie. (date facilement falsifiable)

Reply

Marsh Posté le 06-12-2005 à 18:37:52   

Reply

Marsh Posté le 09-12-2005 à 16:38:52    

à mon avis c'est les noms des variables tu dois avoir le même nom de variable qq part et comme sur le serveur il doit y avoir register_global() activé eh bien quand t'utilises une variable qui a le mêem nom qu'une autre dans la session pouf! par magie ta variable session est changée, ton utilisatuer n'est donc plus toto mais tutu magique mais efficace ce qui perd l'utilisateur.

Reply

Marsh Posté le 09-12-2005 à 18:00:12    

lordashram > Relis son code, il demandait simple à l'utilisateur de se loguer mais prenait en priorité ce qu'est contenu par le cookie et tant pis si c'était "toto" devant l'écran et pas son ami "tutu" qu'était passé la veille.

Reply

Marsh Posté le 09-12-2005 à 18:31:53    

lordashram > ton idée est loin d'etre bete, j'ai en effet ce satanné register global à on sur le serveur, et je ne peux pas le changer.
ça pourrait venir de là !
Je vais chercher et je vous tiens au courant si je trouve quelque chose
 
omega2 > ça peut posé des problèmes dans certains cas je suis d'accord mais à mon avis, mon problème de collisions de sessions ne vient pas de là.


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 09-12-2005 à 19:32:23    

Tu peux modifier cette option en live sur ton script via la fonction  ini_set()

Reply

Marsh Posté le 10-12-2005 à 15:14:52    

fluminis a écrit :

omega2 > ça peut posé des problèmes dans certains cas je suis d'accord mais à mon avis, mon problème de collisions de sessions ne vient pas de là.

Si tu le dis, moi, j'ai jsute lu ton code et traduit en francais ce qu'il faisait.
Si maintenant tu dis que c'est pas ça, alors je te laisse chercher d'où ca vient mais n'empéche que t'as là un énorme trous de sécurité même s'il est pas à l'origine de certains cas.

Reply

Marsh Posté le 13-12-2005 à 13:52:42    

on conseil, appelle toutes tes variables qui viennent sur la session avec le nom suivit de _s et pour le cookie pareil mais suivit de _c comme ça plus de collision tranquile.
Pour ce qui est de la reprise de ton code, rechercher remplacer $_SESSION[" et tu remplaces par $_SESSION["s_ et voilà toutes tes variables qui parleront à la session ne se collisioneront pas, et ça t'évitera de te retaper toutes tes pages unes par unes ( oui je sais là ça inverse ce que j'ai dit, mais pour de la reprise c'est plus simple à ce moment là...).
De plus pour le cookie avec login et mot de passe en clair, humm à mon avis le login tu peux le laisser, mais le password tu crées ton propre algorythme de codage, ça dissuadera le gars d'aller trop fouiller dedans. Le tout dans un p'tit tableau ça mettra du code de merde partout dans le cookie. Sinon si tes pass sont stokés avec une md5 tu mes le pass directos en md5 avec tout le bordel à côté ça devrait passer correctement...

Reply

Marsh Posté le 13-12-2005 à 15:16:19    

lordashram > merci pour le conseil, je vais faire ça, ça sera en effet plus simple que de me retapper toutes mes pages une à une...


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed