Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2832 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Collision de sessions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Collision de sessions

n°1258394
fluminis
Posté le 04-12-2005 à 13:26:29  profilanswer
 

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
mood
Publicité
Posté le 04-12-2005 à 13:26:29  profilanswer
 

n°1258434
sielfried
Posté le 04-12-2005 à 14:55:03  profilanswer
 

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


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1258576
cvb
Posté le 04-12-2005 à 18:38:04  profilanswer
 

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 ?
 
@+

n°1258588
fluminis
Posté le 04-12-2005 à 18:54:37  profilanswer
 

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
n°1259426
omega2
Posté le 05-12-2005 à 18:53:45  profilanswer
 

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
n°1259429
fluminis
Posté le 05-12-2005 à 19:02:07  profilanswer
 

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
n°1259753
leflos5
On est ou on est pas :)
Posté le 06-12-2005 à 01:43:33  profilanswer
 

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 :??:

n°1260062
omega2
Posté le 06-12-2005 à 14:39:59  profilanswer
 

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.

n°1260406
rufo
Pas me confondre avec Lycos!
Posté le 06-12-2005 à 18:33:45  profilanswer
 

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.

n°1260415
omega2
Posté le 06-12-2005 à 18:37:52  profilanswer
 

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)

mood
Publicité
Posté le 06-12-2005 à 18:37:52  profilanswer
 

n°1262847
lordashram
Pour Marmot !!!
Posté le 09-12-2005 à 16:38:52  profilanswer
 

à 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.

n°1262911
omega2
Posté le 09-12-2005 à 18:00:12  profilanswer
 

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.

n°1262947
fluminis
Posté le 09-12-2005 à 18:31:53  profilanswer
 

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
n°1263038
Berceker U​nited
PSN : berceker_united
Posté le 09-12-2005 à 19:32:23  profilanswer
 

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

n°1263624
omega2
Posté le 10-12-2005 à 15:14:52  profilanswer
 

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.

n°1265466
lordashram
Pour Marmot !!!
Posté le 13-12-2005 à 13:52:42  profilanswer
 

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...

n°1265594
fluminis
Posté le 13-12-2005 à 15:16:19  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Collision de sessions

 

Sujets relatifs
[PHP] Apache se plante lors de l'utilisation d'une classeXmlHttpRequest et PHP
[PHP] fonction mkdirpeut-on mettre un "onclick=...." dans PHP ?
formulaires en PHP =>> Help plizzzzXSLT PHP et Do;document
[PHP] Empecher l'accès direct à un sous répertoire d'un site[HELP] Flux RSS généré par PHP !
Stage / CDD Paris Dev Web PHPpseudo frames et sessions
Plus de sujets relatifs à : [PHP] Collision de sessions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR