pb de session

Eléphanteau du PHP | 45 Messages

09 sept. 2005, 13:18

ca marche pa, meme erreur

Eléphanteau du PHP | 45 Messages

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();
} 
?>


Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

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")!!

Eléphanteau du PHP | 45 Messages

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

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 45 Messages

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

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 45 Messages

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")
?>


Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

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

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: