Problème de session

Messages postés
3498
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
-
Bonjour,

Je reviens vers vous car j'ai de nouveau un souci... ça fait 2 semaines que je cherche (quand j'ai le temps) une solution et ce que j'ai vu m'amène toujours au php.ini avec les fonctions qui gère la fréquence de passage du garbage collector pour les sessions, etc...

J'explique le souci : un problème apparaît aléatoirement sur un intranet que j'ai fais et ça pose de réels problèmes de sécurité...

En gros ce qui se passe c'est que des fois j'essaie d'accéder à une de mes pages d'administration sans passer par le formulaire de connexion, en temps normal ça me jette et me demande de me loguer seulement des fois ça ne me jette pas et je me retrouve sur la session de quelqu'un d'autre -_-

J'aimerai savoir d'où vient le problème parce que ça me prend réellement la tête, je vais finir par me taper la tête contre un mur :(

Donc pour essayer de régler le problème, j'ai passé le session.gc_probability à 25 pour augmenter la fréquence de passage du garbage collector... ça n'a rien changé..

Du coup j'ai utilisé un session_save_path() pour voir si ça changeait quelque chose mais à priori ça n'a rien changé non plus..

Mon code de vérification qu'on est authentifié(sur chacune des pages protégés) :

<?php
 include_once("include/configs.inc.php");
 
 if(!isset($_SESSION['id'])) {
  header("Location: index.php?err=ContournementMesure");
 }
?>


Comme vous le voyez, le code est assez basique...

Mon code de connexion :

<?php
if((isset($_POST["pseudo"])) && (!empty($_POST["pseudo"])) && (isset($_POST["mdp"])) && (!empty($_POST["mdp"]))) {
 include_once("include/configs.inc.php");
 
 function ecrire_log($errtxt){
        $fp = fopen('logs/log.txt','a+'); // ouvrir le fichier ou le créer
        fseek($fp,SEEK_END); // poser le point de lecture à la fin du fichier
        $nouverr=$errtxt."\n"; // ajouter un retour à la ligne au fichier
        fputs($fp,$nouverr); // ecrire ce texte
        fclose($fp); //fermer le fichier
 }
 
 $user = $_POST["pseudo"];
 $mdp = $_POST["mdp"];
 
 $sql1 = "SELECT pseudo FROM MA_TABLE WHERE pseudo='".mysql_real_escape_string($user)."' AND mdp='".mysql_real_escape_string(sha1("intra".$mdp))."'";
 $query1 = mysql_query($sql1);
 $num_result1 = mysql_num_rows($query1);
 
 if($num_result1 == 1) {
  $_SESSION["pseudo"] = $_POST["pseudo"];
  
  $sql_role = "SELECT role FROM MA_TABLE WHERE pseudo='".mysql_real_escape_string($_SESSION['pseudo'])."'";
  $query_role = mysql_query($sql_role);
  $_SESSION['role'] = mysql_result($query_role, 0);
  
  $sql_id = "SELECT id FROM MA_TABLE WHERE pseudo='".mysql_real_escape_string($_SESSION['pseudo'])."'";
  $query_id = mysql_query($sql_id);
  $_SESSION['id'] = mysql_result($query_id, 0);
  
  $sql_alias = "SELECT role FROM MA_TABLE WHERE compte='".mysql_real_escape_string($_SESSION['id'])."'";
  $query_alias = mysql_query($sql_alias);
  $_SESSION['alias'] = mysql_result($query_alias, 0);
  
  $sql1 = "INSERT INTO MA_TABLE VALUES('', '".mysql_real_escape_string($_SESSION['id'])."', NOW(), '".$_SERVER['REMOTE_ADDR']."')";
  $query1 = mysql_query($sql1);
  
  $timestamp = date("Y-m-d H:i:s");
  
  ecrire_log($timestamp." - User: ".$user.", Pseudo_session: ".$_SESSION["pseudo"].", Role_session: ".$_SESSION["role"].", ID_session: ".$_SESSION["id"].", alias_session: ".$_SESSION["alias"].", IP: ".$_SERVER['REMOTE_ADDR']);
  
  header("Location: messagerie.php");
 } else {
  header("Location: index.php?err=NoAccount");
 }
} else {
 header("Location: index.php?err=ContournementMesure");
}


Merci d'avance pour le temps que vous allez m'accorder.

Bonne fin de week end, moi je vais faire un pause, j'en peux plus :(
Afficher la suite 

5 réponses

Messages postés
26747
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 novembre 2019
317
0
Merci
Bonjour,

Déjà..Au début de tes pages php tu dois mettre :
  session_start();


L'as tu fais ?

Deuxième point :
Plutôt que de lancer 50 requêtes tu ne pourrais en lancer qu'une :
 $sql = "SELECT * FROM MA_TABLE 
            WHERE   pseudo='".mysql_real_escape_string($user)."' 
       AND mdp='".mysql_real_escape_string(sha1("intra".$mdp))."'
       ";

 $result = mysql_query($sql);
 $num_result1 = mysql_num_rows($result);
 $row = mysql_fetch_array($result );

 // ensuite pour récupérer tes variables :
 if($num_result1 == 1) {
   $_SESSION['id'] = $row[0]['id'];
   $_SESSION['role'] = $row[0]['role'];
  
     //etc...

 } else {
  header("Location: index.php?err=NoAccount");
 }

Commenter la réponse de jordane45
Messages postés
3498
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
25
0
Merci
Bonsoir,

Tout d'abord, merci de t'être penché sur mon problème. Pour le session_start(), oui je suis bien au courant qu'il est nécessaire au début de chaque page et il y est bien (il est dans mon fichier configs.inc.php que j'inclus en haut de chaque page).

Pour les requêtes, c'est pas faux mais ça relève de l'optimisation ça, non ? Donc pour coup je ne suis pas sûr que cela ait quelque chose à voir avec le souci de sessions, le cas échéant je suis curieux de savoir ce qui pourrait en être la cause dans mes requêtes.

Je te remercie encore une fois pour ta réponse même si je reste bloqué ^^

Bonne nuit
jordane45
Messages postés
26747
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 novembre 2019
317 -
As tu testé tes requêtes directement dans ta BDD pour être sûr qu'elles fonctionne correctement ?

Eventuellement, le temps des tests, tu peux ajouter un Echo $sql puis tester tes requêtes directement dans ta bdd.
$sql = "SELECT * FROM MA_TABLE 
            WHERE   pseudo='".mysql_real_escape_string($user)."' 
       AND mdp='".mysql_real_escape_string(sha1("intra".$mdp))."'
       ";

// Affichage de la requête :
Echo "<br><b>Requete :</b> <br>".$sql;

 $result = mysql_query($sql);

 $num_result1 = mysql_num_rows($result);
 $row = mysql_fetch_array($result );

// Pour voir ce que ta requête te retourne :
echo "<br> <b>resultat => </b> <br>";
print_r($row);


Et pour tester tes requêtes directement dans ta BDD.. tu peux utiliser PHPMyAdmin ou un logiciel comme HeidiSql
Commenter la réponse de nicomilville
Messages postés
3498
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
25
0
Merci
Re,

Les requêtes marchent bien (je peux le garantir car j'ai mis un place un fichier de log dans lequel il y a toutes les informations récupérés par les même requêtes).

Il y a quelque chose qui se passe mais je ne sais pas où, comment ni pourquoi..

Il se peut qu'on se connecte sous un pseudo (ça marche) et au passage sur une autre page, on se retrouve sur la session de quelqu'un d'autre -__- c'est franchement hyper bizarre comme problème...

C'est possible que ça vienne du serveur ?

Pareil, un problème du même style et toujours avec les sessions : dans mon code, je test l'existence d'une variable (si elle existe, elle est forcement rempli) de session et seulement si elle existe, j'exécute une requête pour en enregistrer la valeur... Le truc c'est que des fois j'ai des enregistrements vides en base de donnée, comment est-ce possible alors que ma variable de session (id par exemple) existe ?

Comme je l'ai dis, dans le traitement, cette variable n'existe que si on est connecté et si on est connecté, il est impossible qu'elle soit vide...

Bonne nuit
Commenter la réponse de nicomilville
Messages postés
1313
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
20 juin 2014
6
0
Merci
Hello,

Il faudrait essayer de "nettoyer" un peu ton code, pour le coup c'est un peu en vrac actuellement.

"Pour les requêtes, c'est pas faux mais ça relève de l'optimisation ça, non ? "

Autant optimiser directement :).

- A ta place par exemple, je stockerai mes fonctions dans un fichier distinct, "functions.php" par exemple.

- Jordane45 t'as déjà fait la remarque : optimise tes requêtes SQL, plus elles seront propres, moins tu surchargeras tes scripts de requêtes,plus ça va fuser.

- J'ajouterai à cela que passer par PDO ne serait pas du luxe.

- Suivant la manière dont tu génères tes pages, l'endroit où tu poses ton session_start(); a une importance capitale, par exemple si tu passes par un ob_start(); pose-le juste après :

ob_start();
session_start();


Dans le cas contraire ça peut être une source de problème(s).

- Tu as trop de redirections dans ton script : ça ne peut te générer que des "pépins" de cribler ton code de header('Location: ...');

Procède plutôt en utilisant une variable à laquelle tu attribues, suivant les cas, la redirection à effectuer :

if(blablabla){

$direction = "toto";

}else if(blablabal){

$direction = "tutu";

}else{

$direction = "titi";

}

header('Location: '.$direction.'.php');



Pour conclure : si tu parviens à te connecter à l'interface privée sans avoir procédé à l'identification c'est qu'il y a inévitablement une couille dans le potage, et je ne pense pas que le serveur ait avoir quoi que ce soit là dedans, à mon avis si tu clarifies ton code en l'épurant et que tu revoies ta méthodologie (entre autres : fonctions dans un script à part, chargé en amont du code), et bien déjà tu y verras plus clair, donc tu pourras identifier plus rapidement, quand ça chie dans la colle, où est-ce que ça coince, et ça glissera tout seul ;).

Si tu peux nous montrer à quoi ressemble ton fichier configs.inc.php ça peut probablement nous mettre sur la voie.

A+
Commenter la réponse de BBFUNK01
Messages postés
3498
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
25
0
Merci
Bonsoir,

Merci d'avoir pris le temps de me répondre.

Voici le contenu de mon fichier configs.inc.php :

<?php
	ini_set('session.gc_probability', 25);
	session_save_path('MON_CHEMIN');
	session_start();
	
	include("configsBDD.inc.php");
?>


Et le contenu du fichier configsBDD.inc.php :

<?php
	$user = "pseudo";
	$password = "mdp";
	$host = "localhost";
	
	$BDD = "nom_bdd";
	
	$connect = mysql_connect($host, $user, $password);
	mysql_select_db($BDD);
?>


Cordialement et encore merci (je vais tout refaire en objet et avec symfony2 dans pas longtemps mais pour le moment il faut quand même que je sécurise la version actuelle)
Commenter la réponse de nicomilville