Bonjour, j'essaye actuellement de réaliser le Tutorial suivant : http://www.grafikart.fr/tutoriels/php/securiser-sessions-php-58 mais j'ai un petit problème des le départ car lorsque que j'utilise mysql_num_rows je n'ai aucun retour alors que ma table contient des membres. J'ai ce problème en localhost et sur mon hebergeur.
voilà mon code source :
Pour le PHP

<?php 
session_start();
if(isset($_POST) && !empty($POST'login']) && !empty($POST'pass'])){
extract($_POST);
$pass = sha1($pass);
        mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
      mysql_select_db(DB_BDD);
$sql = " SELECT id FROM users WHERE login='$login' AND pass='$pass'";
$req = mysql_query($sql) or die(mysql_error());
echo mysql_num_rows($req);
}
?>

Le forumlaire :

<form action="login.php" method="post">
                                 <div id="content_admin">
                                            <div id="content_1"></div>
                                            <p id="content_2">

                                                   <label for="login">Identifiant:</label>
                                                   <input type="text" name="login" />

                                                   <br />
                                                   <label for="pass">Mot de passe:</label>
                                                   <input type="password" name="pass" />

                                             </p>

                                            <p id="content_3"><button type="submit" name="login">Connexion</button></p>

                                 </div>
                                    </form>

Merci d'avance.

19 réponses


vash60700
Réponse acceptée

J'ai trouvé :)

Voilà le code qui va fonctionner (il y avait 2x le nom login dans la page de formulaire et ton test du post était pas bon, tu tapais $POST au lieu de $_POST).

La page de formulaire :

<form action="login.php" method="post">
     <div id="content_admin">
                <div id="content_1"></div>
                <p id="content_2">

                       <label for="user">Identifiant:</label>
                       <input type="text" name="user" />

                       <br />
                       <label for="pass">Mot de passe:</label>
                       <input type="password" name="pass" />

                 </p>

                <p id="content_3"><button type="submit" name="connexion">Connexion</button></p>

     </div>
</form>

et le PHP :

<?php 
 session_start();
if(isset($_POST) && !empty($_POST'user']) && !empty($_POST'pass'])){
extract($_POST);
$pass = sha1($pass);

include("inclusions/config.php");
$conn=mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
mysql_select_db(DB_BDD,$conn);

$sql = " SELECT id FROM users WHERE login='".$_POST'user']."' AND pass='".$_POST'pass']."'";
$req = mysql_query($sql,$conn) or die(mysql_error());
echo mysql_num_rows($req);
}
?>

@ pluche :p

vash60700
Réponse acceptée

Ah bah oui, je comprends mieux :)

Bon... bah j'ai un poil merdé quand j'ai fais mon copier/coller :)

Remplace cette ligne :

$sql = " SELECT id FROM users WHERE login='".$_POST'user']."' AND pass='".$_POST'pass']."'";

par celle là :

$sql = " SELECT id FROM users WHERE login='".$_POST'user']."' AND pass='".sha1($_POST'pass'])."'";

Maintenant, ça devrait fonctionner pour les deux premieres lignes et plus pour la dernière :)

Tu pourras virer ces deux lignes aussi :

extract($_POST);
$pass = sha1($pass);

Hello,

Essaye ça :

$sql = " SELECT id FROM users WHERE login='".$_POST'login']."' AND pass='".$_POST'pass']."'";
$req = mysql_query($sql) or die(mysql_error());
echo mysql_num_rows($req);
yosaku
Auteur

Salut et merci de ta réponse j'ai mis à jour le code par contre ca change toujours rien quand je valide le formulaire rien ne se passe et toujours pas d'affichage :

<?php 
session_start();
if(isset($_POST) && !empty($POST'login']) && !empty($POST'pass'])){
extract($_POST);
$pass = sha1($pass);
include("inclusions/config.php");
mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
mysql_select_db(DB_BDD);
$sql = " SELECT id FROM users WHERE login='".$_POST'login']."' AND pass='".$_POST'pass']."'";
$req = mysql_query($sql) or die(mysql_error());
echo mysql_num_rows($req);
}
?>

Je sais plus quoi faire je me demande si ca viens pas d'une option à activer dans le localhost car ça ne marche pas dutout =(

Aie ... bon, avant que je teste sur ma machine, on peut essayer ça :

<?php 
session_start();
if(isset($_POST) && !empty($POST'login']) && !empty($POST'pass'])){
extract($_POST);
$pass = sha1($pass);

include("inclusions/config.php");
$conn=mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
mysql_select_db(DB_BDD,$conn);

$sql = " SELECT id FROM users WHERE login='".$_POST'login']."' AND pass='".$_POST'pass']."'";
$req = mysql_query($sql,$conn) or die(mysql_error());
echo mysql_num_rows($req);
}
?>

Mais parallèlement, je vais regarder sur ma machine :)

yosaku
Auteur

Merci de ton aide ! Malheureusement j'ai tester et ça ne marche toujours pas =(

yosaku
Auteur

Ca marche niquel ! Je te remercie juste un petit problème avec le sha1 car quand je fais un test avec un compte dont le mot de passe est pas en sha1 la requete me retourne (1) alors que avec un mot de passe en sha1 ca me retourne 0. =s

Mais de rien :)

La question, c'est est ce que les MDP sont stockées en SHA1 ? :p

yosaku
Auteur

Oui bien sur j'ai fait comme dans le tuto j'ai utiliser :

<?php
echo sha1('');
?>

j'ai ensuite mit le résultat dans "pass" du coup je comprend pas quand je met juste 12 dans "pass" que cela marche apres sur la page login car il y a :

$pass = sha1($pass);

Mais bien sur quand c'est bien crypter en sha1 sur la page login ca me retourne 0

tu peux mettre une ligne de ta table user stp (le champs Pass) ? car s'il ne te retourne pas de résultat ça doit venir du stockage... je ne vois pas d'autres explications :)

yosaku
Auteur

Bien sur voilà :
Donc la y'a que la dernière entrée qui affiche bien (1).
Je viens de faire un test quand je met le mdp en sha1 f7b83cf326.... dans le formulaire ca marche =s

yosaku
Auteur

Merci !! Ca marche tu m'enleve un poid la =D merci !

@ ton service ;)

yosaku
Auteur

Désolé de te re dérranger avec ça je voulais juste savoir car comme tu m'as dis de ne pas utiliser extract je voulais savoir comment faire dans ce script pour récuperé la session :

<?php 
class Auth
{
    static function isLogged()
    {
        if(isset($_SESSION'Auth']) && isset($_SESSION'Auth']'user']) && isset($_SESSION'Auth']'pass']) )
        {
                extract($_SESSION'Auth']);

                include("inclusions/config.php");
                $conn=mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
                mysql_select_db(DB_BDD,$conn);

                $sql = " SELECT id FROM users WHERE login='".$_POST'user']."' AND pass='".sha1($_POST'pass'])."'";
                $req = mysql_query($sql,$conn) or die(mysql_error());

                if (mysql_num_rows($req))
                    {
                            return true;
                    }
                else 
                    {
                            return false;
                    }
        }
        else
        { return false;

        }

    }

}
?>

Car ca marché bien avant que je rajoute cette sécurité je pense que c'est parce que je n'utilise pas l'extract mais du coup je vois pas comment récuperé les infos sans. Merci d'avance ^^

Peux tu me donner le but de ta fonction ?

D'après ce que je lis, tu testes l'existence de ta session... ok.

Sachant que ta session est un tableau associatif, tu peux accéder aux membres en faisant (comme tu l'as fais dans le test) :

$_SESSION'Auth']'user'];
$_SESSION'Auth']'pass'];
$_SESSION'Auth']'id'];

Quand tu utilises Extract, tu créés des variables et j'ai peur que si une d'entre elles existe, elle soit écrasée ex :

$user="test";
extract($_SESSION"Auth"]);
// ça va te créer les variables $user,$pass,$id et donc potentiellement changer la variable $user que tu as défini au dessus.

Petite question, quel est l'interet de garder le mdp dans la session ?

yosaku
Auteur

Euh bah en faite je te l'ai dis je suis le tuto grafikart donc dans le tuto il utilise çà pour voir si personne crée une session avec ces faux identifiants. Je peux me passer de ce test ?

Tu as fais un gros copier/coller de la page de connexion là :)

if(isset($_SESSION'Auth']) && isset($_SESSION'Auth']'user']) && isset($_SESSION'Auth']'pass']) )
        {
            return true;
        }
        else
        { 
            return false;
        }

ça suffit, ça évite de refaire une requête SQL (ou à chaque fois que tu vas sur la page), mais pas parfait :)

Concernant l'utilisation de variables pour authentifier un utilisateur, il est très simple d'ajouter une fonction qui intègre une clé dans la session à l'authentification.

Actuellement, tu mets en session l'id, le login et le pass.

Rien ne t’empêche de rajouter une clé dans la session (par exemple "SecureKey") qui est une concaténation du login/password hashé en MD5 lors de l'authentification :

$_SESSION"SecureKey"]= md5($_SESSION"login"].$_SESSION"pass"];

Quand tu arrives sur la page privée, tu testes comme ça :

<?php
if ($_SESSION"SecureKey"]==md5($_SESSION"login"].$_SESSION"pass"])
{
    return true;
}
else
{
    return false;
}
?>

Rien n'empèche de remplacer le MD5 par une fonction de cryptage perso avec une clé que tu définies toi même (parce que le MD5, c'est classique :) :))

yosaku
Auteur

Ah ok merci mais sinon juste en utilisant dans Auth :

if(isset($_SESSION'Auth']) && isset($_SESSION'Auth']'user']) && isset($_SESSION'Auth']'pass']) )

Ca fait déjà une bonne sécurité ou s'est trop faible ?

Disons qu'avec cette solution, il y a des risques d'un bon puisse bypasser la protection :)