pb de session

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : pb de session

par Cyrano » 10 sept. 2005, 19:58

Tu n'as pas tort sur ce point et il faudrait que le champ mot-de-passe soit indexé UNIQUE : il faudrait aussi que cette donnée soit cryptée dans la base ou à tout le moins hachée avec md5() ou sha1()

D'autre part, en faisant la requête comme ceci, on limite encore un tout petit peu les tentatives d'injection SQL.

Si je teste seulement sur une seule ligne, c'est également parce que sa table ne fait pas mention d'un niveau d'accès, ce qui sous-entend à priori que son système ne concerne QUE l'administrateur du site : sinon, n'importe qui s'identifiant normalement se retrouverait avc les accès admin. Partant de ce principe, je ne peux avoir qu'une seule ligne dans la table par admin et il est hautement improbable s'ils sont plusieurs que deux utilisent le même mot de passe.

par Truc » 10 sept. 2005, 17:37

 $sql = "SELECT * FROM admin WHERE passwd = '". $passwd ."'";
    $result = mysql_query($sql,$connection) or die(mysql_error());
    //get the number of rows in the result set
    $num = mysql_num_rows($result);
    //print a message or redirect elsewhere, based on result
    if ($num == 1 )
    {
        while($ligne = mysql_fetch_assoc($result))
        {
            if($login == $ligne['login'])
            {
                $_SESSION['login'] = $login;
                $_SESSION['admin'] = "autorise";
?>
<p>Welcome <?php echo($login); ?></p>
<a href="index.php?menu=logout" name="logout">LogOut</a><br>
<a href="index.php?menu=MyAdmin&page=page1">Next</a>
<?php
            }
        }
    }
    else
    {
?>
<p>You're not granted to acceed here : Go out</p>
<a href="index.php" name="retour_accueil" title="Retour à la page d'accueil">Page d'accueil</a>
<?php
    }
Je suis d'accord avec toi de lui fournir un nouveau code mais il me semble un peu bizarre quant meme, je m'explique (tu me dira si je me trompe ou pas :wink:):

1. la requete tu la fait que sur le mot de "passe", ensuite tu fait un
$num = mysql_num_rows($result) et tu teste le nombre de ligne pour continuer il faut que le nombre de ligne soit égal a 1 MAIS si, par le plus grand des hasard, plusieurs personne ont le MEME mot de passe $num sera égal a 2 dc tous les deux ne pourront plus se connecter !!

2.Ensuite tu fait une boucle "while($ligne = mysql_fetch_assoc($result))" qui est inutile puisqu'a ce stade on sait qu'il n'y a qu'une ligne dans le résultat de la requete (grace au if précédent), dc il suffirait de faire,
"$ligne = mysql_fetch_assoc($result);"

Je sais que c'est pas mon post à la base mais merci de m'éclairer sur ces point :D

par Cyrano » 10 sept. 2005, 13:48

Ben c'est très suffisant : la valeur de la variable de session $_SESSION['admin'] est ré-initialisée avec une valeur autre que "Autorise" et donc lors de la tentative d'accès, ce sera l'indication vers la porte de sortie automatique et c'est tout ce que tu cherches à obtenir. Et tu n'as pas besoin de détruire quoique ce soit.

Attention cependant à ne jamais oublier le session_start() en début de fichier si ce n'est pas un fichier inclus, sinon tu perds toutes les valeurs de la session en cours.

par isitien » 10 sept. 2005, 13:11

c'est juste une remark ke j'ai fait apres avoir changé de procedure c tt

voila le fichier logout
<?
$_SESSION['acces_admin'] = "oui"; 
echo 'hello';
//header("location: index.php")
?>

par Cyrano » 10 sept. 2005, 13:06

Ou est le problème ? Tu t'en fous puisque ce qui est important, ce n'est pas la valeur de l'id de session mais la valeur de la variable $_SESSION['admin'] qui t'ouvre ou non l'accès à la partie réservée du site. Et je dirais que c'est même un avantage parce que tu peux avoir des valeurs qui se transportent tout au long de ta navigation que tu peux récupérer n'importe quand si tu en as besoin sans devoir recommencer une procédure qui aurait été supprimée par la desctruction de la session.

par isitien » 10 sept. 2005, 13:03

ca me parai un peu bizar d'obtenir le meme id de session a chak connexion:

votre session id est: 36972679e1ad407bd39c452eb46dbed0

par Cyrano » 10 sept. 2005, 12:41

BOn, voilà une proposition de correction, j'ai ajouté quelques commentaires, optimisé quelques lignes et supprimé des lignes inutiles :
<?
/* Démarrage de la session */
session_start();
/* Récupération des données du formulaire s'il y en a */
$date   = isset($_POST['date'])   ? $_POST['date']   : "";
$hour   = isset($_POST['hour'])   ? $_POST['hour']   : "";
$login  = isset($_POST['login'])  ? $_POST['login']  : "";
$passwd = isset($_POST['passwd']) ? $_POST['passwd'] : "";
/* Traitement des données login et passwd */
$login = strtolower(trim(htmlentities($login, ENT_QUOTES)));
$passwd = strtolower(trim(htmlentities($passwd, ENT_QUOTES)));

/* Initialisation par défaut de la variable de session $_SESSION['acces_admin'] */
$_SESSION['acces_admin'] = 'non';
/* Paramètres de connexion */
$host = 'localhost';
$user = 'root';
$pass = '';
$db_name = 'test';
$table_name = 'admin';


if ($login == '')
{
    //nom du champ1
    echo("<font face=verdana size=2>Username field is empty</font>&nbsp;&nbsp;"); //message qui s'affiche si le visiteur n'a pas rempli ce champ
    echo("<a href=\"javascript:history.back()\"> Return </a>");
}
elseif ($passwd == '')
{
    //nom du champ1
    echo("<font face=verdana size=2>Password field is empty</font>&nbsp;&nbsp;"); //message qui s'affiche si le visiteur n'a pas rempli ce champ
    echo("<a href=\"javascript:history.back()\"> Return </a>");
}
elseif (strlen($login) < 4)
{
    //nom du champ1
    echo("<font face=verdana size=2>Username field is less than 4 characters</font>&nbsp;&nbsp;"); //message qui s'affiche si le visiteur n'a pas rempli ce champ
    echo("<a href=\"javascript:history.back()\"> Return </a> <br>");
}
else
{
    $connection = mysql_connect($host, $user, $pass) or die(mysql_error());
    $db = mysql_select_db($db_name, $connection) or die(mysql_error());
    $sql = "SELECT * FROM admin WHERE passwd = '". $passwd ."'";
    $result = mysql_query($sql,$connection) or die(mysql_error());
    //get the number of rows in the result set
    $num = mysql_num_rows($result);
    //print a message or redirect elsewhere, based on result
    if ($num == 1 )
    {
        while($ligne = mysql_fetch_assoc($result))
        {
            if($login == $ligne['login'])
            {
                $_SESSION['login'] = $login;
                $_SESSION['admin'] = "autorise";
?>
<p>Welcome <?php echo($login); ?></p>
<a href="index.php?menu=logout" name="logout">LogOut</a><br>
<a href="index.php?menu=MyAdmin&page=page1">Next</a>
<?php
            }
        }
    }
    else
    {
?>
<p>You're not granted to acceed here : Go out</p>
<a href="index.php" name="retour_accueil" title="Retour à la page d'accueil">Page d'accueil</a>
<?php
    }
    mysql_close();
}
?>
Pose des questions si quelque point te parait obscur.

par isitien » 10 sept. 2005, 12:15

if ($num != 0) 
{ 
    $_SESSION['login'] = $login; 
    $_SESSION['passwd'] = $passwd; 
	$_SESSION['acces_admin']=$ligne['oui'];
} 
voila le resultat:

Code : Tout sélectionner

Notice: Uninitialized string offset: 0 in c:\program files\easyphp1-7\www\dubaiboy\my_admin\login_verify.php on line 70

par Truc » 09 sept. 2005, 13:39

Mauvaise place pour mettre " $_SESSION['acces_admin']='non'; " met le plustot la, et lis les données de ta base (pour savoir si la personne qui a saisie son login et passe est admin ou pas (dc faut ajouter un champ a ta base))

$sql = "SELECT * FROM admin WHERE login = '$login' AND passwd = '$passwd'";
$result = mysql_query($sql,$connection) or die(mysql_error());
$ligne = mysql_fetch_array($result);
$num = mysql_num_rows($result); 
if ($num != 0)
{
    $_SESSION['login'] = $login;
    $_SESSION['passwd'] = $passwd;
    $_SESSION['acces_admin']=$ligne['droits']; // soit égal a oui pour un admin soit égal a non pour un membre
} 
et je suppose que tu remplis bien ton formulaire de saisie de login et mot de passe (avec comme name="login")!!

par isitien » 09 sept. 2005, 13:25

voila tt le code de admin.php

<?
if(isset($_POST['date'])) $date = $_POST['date'];
else $date = '';
if(isset($_POST['hour'])) $hour = $_POST['hour'];
else $hour = '';
if(isset($_POST['login'])) $login = $_POST['login'];
else $login = '';
if(isset($_POST['passwd'])) $passwd = $_POST['passwd'];
else $passwd = '';


$_SESSION['acces_admin']='non';

$host = 'localhost';
$user = 'root';
$pass = '';
$db_name = 'test';
$table_name = 'admin';

if(isset($_POST['date'])) $date = $_POST['date'];
else $date = '';
if(isset($_POST['hour'])) $hour = $_POST['hour'];
else $hour = '';
if(isset($_POST['login'])) $login = $_POST['login'];
else $login = '';
if(isset($_POST['passwd'])) $passwd = $_POST['passwd'];
else $passwd = '';

//$login = strtolower(trim(htmlentities($_POST['login'], ENT_QUOTES))); 
//$passwd = strtolower(trim(htmlentities($_POST['passwd'], ENT_QUOTES))); 

if ($login == ''){ //nom du champ1
echo("<font face=verdana size=2>Username field is empty</font>&nbsp;&nbsp;"); //message qui s'affiche si le visiteur n'a pas rempli ce champ
echo("<a href=\"javascript:history.back()\"> Return </a>");
}

elseif ($passwd == ''){ //nom du champ1
echo("<font face=verdana size=2>Password field is empty</font>&nbsp;&nbsp;"); //message qui s'affiche si le visiteur n'a pas rempli ce champ
echo("<a href=\"javascript:history.back()\"> Return </a>");
}

elseif (strlen($login)<4){ //nom du champ1
echo("<font face=verdana size=2>Username field is less than 4 carachters</font>&nbsp;&nbsp;"); //message qui s'affiche si le visiteur n'a pas rempli ce champ
echo("<a href=\"javascript:history.back()\"> Return </a> <br>");
}

else
{
$connection = mysql_connect($host, $user, $pass) or die(mysql_error());
$db = mysql_select_db($db_name, $connection) or die(mysql_error());
$sql = "SELECT * FROM admin WHERE login = '$login' AND passwd = '$passwd'";
$result = mysql_query($sql,$connection) or die(mysql_error());
//get the number of rows in the result set
$num = mysql_num_rows($result);
//print a message or redirect elsewhere, based on result
if ($num != 0) 
{ 
    $_SESSION['login'] = $login; 
    $_SESSION['passwd'] = $passwd; 
} 

echo $login.'<br>'; 
echo $passwd.'<br>'; 
//echo $_SESSION['login'].'<br>'; 
//echo $_SESSION['passwd'].'<br>'; 

if (isset($_SESSION['passwd']) && isset($_SESSION['login']))
{ 
      echo 'Welcome &nbsp;' .$login; 
	  ?>
	  
<a href="index.php?menu=logout" name="logout">LogOut</a><br>
<a href="index.php?menu=MyAdmin&page=page1">Next</a>
	  <?php
} 
else 
{ 
echo 'Go Out'; 
session_unset();
session_destroy();
} 
mysql_close();
} 
?>

par isitien » 09 sept. 2005, 13:18

ca marche pa, meme erreur

par Truc » 09 sept. 2005, 13:10

avant de pouvoir faire des tests dessus faut la crée la variable de session:
$_SESSION['acces_admin']='non';
ou "oui" selon les droits de la personne qui se connecte

par isitien » 09 sept. 2005, 13:06

ca me donne cette erreur

Code : Tout sélectionner

Notice: Undefined index: acces_admin in c:\program files\easyphp1-7\www\dubaiboy\my_admin\login_verify.php on line 11 quest ce ke tu fais la?

par Truc » 09 sept. 2005, 13:03

Pour ma part je dirai que oui, maintenant jsuis pas un pro comme certains (Cyrano et Cie)

Mais il te mnque un " = ":
if ($_SESSION['acces_admin'] == "autorise")

par isitien » 09 sept. 2005, 12:15

voila ce que j'ai fais dans la partie admin.php, je sais pas si c'est correct ou non
if ($_SESSION['acces_admin'] = "autorise")
echo 'bienvenu &nbsp;' .$login. '<br>';
else
{
echo 'quest ce ke tu fais la?';
}