Rechercher

Classe de connexion sécurisé PHP

1 2 3 4

Sky
sky
Date : 13/08/2003
Forum msgs : 4436
Rank : Admin
Localisation : toulouse

Classe de connexion sécurisé PHP

Lien directde sky le 14/07/2010 à 14:30
Auth(); est une classe de gestion de connexion sécurisé écrit en PHP reposant sur une base de donnée MySQL pour le stockage des utilisateurs.

On utilise ici les sessions PHP, les cookies, une base de donnée et un empreinte numérique qui permet de rajouter une couche de sécurité très importante.
La classe vous permettra aussi de resté connecter par cookie.

Nouveau
Depuis la version 0.3, la classe de connexion sécurisé utilise une classe de détection d'attaque par Brute Force.

Utilisation : test de connexion
<?php
session_start();

// Connexion MySQL

$Auth = new Auth();

if($Auth->is_connected() == true)
    echo 'Connecté.';
else
    echo 'Pas connecté.';
?>


Utilisation : connexion
<?php
session_start();

// Connexion MySQL

$Auth = new Auth();

if($_POST)
{
    if($Auth->connect($_POST['email'], $_POST['password']))
    {
        echo 'Connecté';
    }
    else
    {
        echo 'Login et/uo mot de passe incorrect.';
    }
}
?>


Utilisation : déconnexion
<?php
session_start();

// Connexion MySQL

$Auth = new Auth();

$Auth->disconnect();
?>


Pour créer la table MySQL :
CREATE TABLE IF NOT EXISTS `Users` (
  `id` int(10) NOT NULL auto_increment,
  `email` varchar(255) NOT NULL,
  `password` varchar(32) NOT NULL,
  `date_inscription` int(10) NOT NULL,
  `date_last_action` int(10) NOT NULL,
  `date_last_connexion` int(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


La class de connexion sécurisé :
<?php
/*
 * Class d'authentification
 * Version 0.3
 *
 * Date : 09/08/2010
 * Auteur : GUNNING Sky
 */


class Auth {

    private $user = array();
    private $connected;
    private $user_table_name = 'Users';
    private $login_name;
    private $salt;
    private $password_name;

    public function __construct($salt='M:kJ5!1|WQ', $login_name='auth_login', $password_name='auth_password')
    {
        $this->login_name = $login_name;
        $this->password_name = $password_name;
        $this->salt = $salt;

        if($this->testConnexion() == false)
        {
            $this->connected = false;
        }
    }


    /*
     * Renvoi si cette personne est connecté ou pas
     */

    public function is_connected()
    {
        return $this->connected;
    }

    /*
     * Connexion
     * $email : string (email)
     * $password : string non crypté (mot de passe)
     */

    public function connect($email, $password)
    {
        $deny_login = NoBF::bruteCheck($email);

        if($deny_login == true)
            exit('Trop de tentatives de connexion. Merci de recommencer dans quelques minutes.');
        else
        {
            $email = mysql_real_escape_string($email);

            $sql = "SELECT id,email,password FROM `".$this->user_table_name."` WHERE `email` = '$email' AND `password` = '".md5($this->salt.$password)."' ";
            if(!$res = mysql_query($sql))
                exit('Erreur MySQL : Connexion impossible.');

            if (mysql_num_rows($res) == 1)
            {
                $this->connected = true;
                $this->user = mysql_fetch_assoc($res);

                $this->setSecuredData();
                $this->updateUser($this->user['id'], 1);

                return true;
            }
            else
            {
                NoBF::addTentative($email);
                return false;
            }
        }
    }


    /*
     * Déconnexion
     */

    public function disconnect()
    {
        $this->resetSessionData();

        unset($_SESSION[ $this->password_name ]);
        unset($_SESSION[ $this->login_name ]);
        unset($_SESSION['token']);
    }


    // Fonctions privées

    /*
     * test la connexion en cours
     */

    private function testConnexion()
    {
        // def des vars à tester
        $toTestToken = '';
        $toTestPassword = '';
        $toTestLogin = '';

        // Conservation d'une connexion via cookie
        if (!empty($_COOKIE[ $this->login_name ]) && !empty($_COOKIE[ $this->password_name ]) && empty($_SESSION[ $this->password_name ])) {
            $toTestLogin = $_COOKIE[ $this->login_name ];
            $toTestPassword = $_COOKIE[ $this->password_name ];
            $toTestToken = $_COOKIE[ 'token' ];
        } elseif (!empty($_SESSION[ $this->password_name ]) && !empty($_SESSION[ $this->login_name ])) {
            $toTestLogin = $_SESSION[ $this->login_name ];
            $toTestPassword = $_SESSION[ $this->password_name ];
            $toTestToken = $_SESSION[ 'token' ];
        }

        // Si le token n'est pas identique au fingerprint du navigateur, on reset tout
        if($toTestToken != $this->fingerprint())
        {
            $this->resetSessionData();
            return false;
        }

        if (!empty($toTestLogin) && !empty($toTestPassword))
        {
            $email = mysql_real_escape_string($toTestLogin);
            $password = mysql_real_escape_string($toTestPassword);

            // test si l'utilisateur existe bien
            $sql = "SELECT id,email,password FROM `".$this->user_table_name."` WHERE `email`='$email' AND `password`='$password'";
            if(!$res = mysql_query($sql))
                exit('Erreur MySQL : Test de connexion impossible.');

            if (mysql_num_rows($res) == 1)
            {
                $this->connected = true;
                $this->user = mysql_fetch_assoc($res);

                // Si connexion depuis cookie :: on remet en place les sessions + cookies
                if (empty($_SESSION[ $this->password_name ]) || !empty($_SESSION[ $this->login_name ]))
                    $this->setSecuredData();

                $this->updateUser($this->user['id']);

                return true;
            }
            else
            {
                $this->resetSessionData();
                return false;
            }
        }
        else
            return false;
    }

    /*
     * Génère le token du navigateur en cours
     */

    private function fingerprint()
    {
        $fingerprint = $this->salt . $_SERVER['HTTP_USER_AGENT'];
        $token = md5($fingerprint . session_id());

        return $token;
    }

    /*
     * On défini les variables d'identifications
     * token, login et mot de passe
     * !! obligation d'avoir défini $this->user avant de l'utiliser !!
     */

    private function setSecuredData()
    {
        // declaration des sessions
        $_SESSION[ $this->password_name ] = $this->user['password'];
        $_SESSION[ $this->login_name ] = $this->user['email'];
        $_SESSION['token'] = $this->fingerprint();

        // déclaration des cookies
        $peremptionCookies = time() + (3600 * 24 * 31); // 31 J
        setcookie( $this->login_name , $this->user['email'], $peremptionCookies, "/");
        setcookie( $this->password_name , $this->user['password'], $peremptionCookies, "/");
        setcookie( 'token' , $_SESSION['token'], $peremptionCookies, "/");
    }

    /*
     * Reset complet des variables d'identification
     * C'est une déconnexion
     */

    private function resetSessionData()
    {
        // declaration des sessions
        $_SESSION[ $this->password_name ] = '';
        $_SESSION[ $this->login_name ] = '';
        $_SESSION['token'] = '';

        // déclaration des cookies
        $peremptionCookies = time() - (3600 * 24 * 31 * 365); // - 1 an
        setcookie( $this->login_name , '', $peremptionCookies, "/");
        setcookie( $this->password_name , '', $peremptionCookies, "/");
        setcookie( 'token' , '', $peremptionCookies, "/");

        $this->connected = false;
        $this->user = array();
    }

    /*
     * Mise à jours de divers infos de connexion dans la BDD
     * $id : int du user
     * $connexion : 0 ou 1
     *     => 0 : test de connexion
     *     => 1 : connexion
     */

    private function updateUser($id, $connexion=0)
    {
        $date = mktime();

        $addreq = ($connexion == 1) ? ", date_last_connexion='$date'" : "";

        $sql = "UPDATE ".$this->user_table_name." SET date_last_action='$date'$addedReq WHERE id='$id'";
        if(!mysql_query($sql))
            exit('Erreur MySQL : Impossible de mettre les informations de l\'utilisateur à jours.');
    }

}
?>


Des idées ?
Améliorations ?

Cette classe "aide" contre le vol de session PHP.
le méthode n'est pas parfaite mais offre une petite sécurité en plus.

Important : pour ajouter un enregistrement dans la base de donnée n'oubliez pas d'encoder votre mot de passe avec le grain de sel que vous avez défini. Ex. :
$salt = 'VotreGrainDeSel';
echo md5($salt.'Mot de passe');
CedricG
Date : 23/07/2010
Forum msgs : 3
Rank : Utilisateur

Re : Classe de connexion sécurisé PHP

Lien directde CedricG le 23/07/2010 à 23:25
Bonjour,

Je passais par là en recherchant des solutions pour renforcer la sécurité de mon site. Et j'ai remarqué cette classe... car elle comporte deux problèmes majeurs.

1) Erreur de principe fondamental
Eh bien, on fait cette erreur à tous les coups quand on est pas habitué à la POO. C'est néanmoins une erreur très importante. Voici l'énonce du principe :
TOUS LES ATTRIBUTS DOIVENT ETRE PRIVES !!!
D'ailleurs, voilà un commentaire de M@teo21 à ce sujet :
Ca a l'air bête, stupide, irréfléchi, et pourtant tout ce qui fait que la POO est un principe puissant vient de là.
En clair, si j'en vois un à partir de maintenant qui me met ne serait-ce qu'un seul attribut en public, je le brûle, je le torture, je l'écorche vif sur la place publique, compris ?
Et vous, si vous voyez quelqu'un d'autre faire ça un jour, écorchez-le vif en pensant à moi, vous serez sympa.

Bon, avec ça, les attributs ne peuvent pas être modifiables directement.
Ici, tes attributs $user et $connected sont publics.
La solution :
Tout d'abord, mets tes attributs en privé.
Ensuite, crée des méthodes (appelées accesseurs) pour renvoyer les attributs (un simple return suffit).
Enfin, si tu dois absolument modifier de l'exterieur ces attributs, crée des méthodes permettant de modifier l'attribut en y incluant si nécessaire des vérifications. Une image... de M@teo21 :
Imaginez par exemple que l'utilisateur puisse modifier la vie... qu'est-ce qui l'empêcherait de mettre 150 de vie alors que la limite maximale est 100 ? C'est pour ça qu'il faut toujours passer par des méthodes (des fonctions) qui vont d'abord vérifier qu'on fait les choses correctement avant de modifier les attributs.

Voilà pour ça... mais c'est pas fini !

2) Erreur d'obsolescence
Hé oui ! Il y a une énorme obsolescence dans ta classe... les fonctions mysql_.
La raison : les fonctions mysql_ ont été à l'origine créées pour être utilisées avec MySQL 4.0 ou version précédente (je sais plus). Depuis la version 4.1, pas mal de choses ont été ajoutées à MySQL... et PHP n'en a pas pris compte dans les fonctions mysql_, surement pour éviter des ruptures de compatibilité. A la place, MySQLi a été créé. MySQLi est compatible avec ces nouvelles fonctionnalités et est désormais très fortement recommandé pour un développement avec MySQL. Les fonctions mysql_ seront très probablement retirées de PHP 6.
La solution :
Il y en a en fait quatre :
1) Les fonctions mysqli_ : les noms changent et de nouvelles fonctionnalités arrivent. Je n'utilise pas ces fonctions.
2) Les classes MySQLi : mêmes fonctionnalités, mais sous forme de classes. Je n'utilise pas ces classes.
3) Les classes PDO (PHP Data Objects) : classes d'abstraction de la base de données. En clair : une classe peut servir à plusieurs types de serveur de base de données. PDO est donc utilisable avec MySQL, PostgreSQL, SQL Server, Oracle, ODBC... Mais à chaque changement de type de serveur, il faut réadapter les requêtes au serveur. J'utilisais ces classes, mais plus maintenant.
4) Car j'utilise les classes Zend_Db : ce sont des classes inclues dans le Framework Zend créé par l'entreprise Zend... disponible gratuitement. Pour info, ce sont les fondateurs de Zend qui ont créé le noyau de PHP à partir de la version 4.0... ce noyau est d'ailleurs appelé le Zend Engine.
Les classes Zend_Db peuvent utiliser n'importe quelle extension de PHP (MySQLi, PDO, etc...). Pourquoi je l'utilise ? Car il n'y a pas besoin de réécrire les requêtes à chaque changement de type de serveur. Comment ? En utilisant ça par exemple :
$selection = $bddp->select()
->from(array('a' => PREFBDDP."_actualites_articles"), array("id", "idforum", "titre", 'date' => "UNIX_TIMESTAMP(date)", 'datecomp' => "UNIX_TIMESTAMP(DATE(date))", "texte", "suitetexte"))
->joinLeft(array('c' => PREFBDDP."_actualites_categories"), "a.idcat = c.id", array('categorie' => "nom"))
->joinLeft(array('m' => PREFBDDP."_membres"), "a.idaut = m.id", array('auteur' => "pseudo"))
->order("a.id DESC")
->limit($configuration['actualites_nbarticles']);
$tableau = $bddp->fetchAll($selection);
 

C'est la requete la plus compliquée que j'ai dû écrire jusque là à priori. Toutes les commandes SQL que l'on mets habituellement dans une chaîne de caractères... sont remplacées par des méthodes (ici : de la classes Zend_Db_Adapter_Abstract pour select() et fetchAll() et Zend_Db_Select pour les autres). Lors de l'envoi de la requête au serveur, la classe recrée la requête à partir des paramètres rentrés et en fonction de la syntaxe SQL adoptée par le serveur.
Remarque : Je n'ai pas besoin d'utiliser mysql_real_escape_string() car, si j'utilise la syntaxe suivante, la sécurisation des paramètres rentrés est automatique. Pour le WHERE notamment :
$selection = $bddp->select()
[...]
->where("a.id = ?", $_GET['id']);
$tableau = $bddp->fetchRow($selection);

Ici, la sécurisation de $_GET['id'] est réalisée.

Voilà, voilà !
En espérant que ces recommandations t'auront aidé !

Edit : J'ai trouvé une autre erreur : une injection SQL est possible !
$sql = "SELECT * FROM `Users` WHERE `email` = '$login' AND `password`= '".md5($this->salt.$password)."' ";
Bon... le gars peut faire ce qu'il veut avec le login et récupérer tous les comptes. Il repère l'admin, un petit coup de "force brute" pour retrouver le mot de passe et voilà il pourra faire ce qu'il veut !
$sql = "UPDATE Users SET date_last_action='$lastactionTime'$addedReq WHERE id='$id'";
Ici, qu'est-ce qui te dit que $id est un entier ? On peut faire le OR 1=1. Bon, ici on peut rien modifier d'important... mais si c'était une autre requête, tu pourras pleurer quand toutes tes données auront été altérées et seront devenues inutilisables. Toutes données fournies doivent être échappées ! Moi, je ne m'en soucie guère car Zend_Db s'en occupe.

Autre conseil, pour éviter les découvertes de mot de passe par force brute... inclus un système de bannissement automatique. Les pirates n'aiment pas perdre leur temps ! wink Un petit lien où on se rend compte de l'enjeu :
http://www.siteduzero.com/tutoriel-3-34510-eviter-les-attaques-par-force-brute.html

Edit 2 : Eh beh ! Tu te simplifies pas la vie... Voici une petite simplification :
        $lastactionTime = mktime();

        $addedReq = '';
        if($connexion == 1)
            $addedReq = ", date_last_connexion='$lastactionTime'";
 
$addedReq = ($connexion ? ", date_last_connexion='".mktime()."'" : "");
Et hop ! Une économie de lignes et de fonctions !

Edit 3 : Ta protection contre les vols de session, c'est le fingerprint avec le User Agent ? Dommage ! wink Le User Agent est falsifiable. Les navigateurs, les gestionnaires de téléchargement et, surtout, les automates de spam peuvent le falsifier pour tromper le script ! De plus, l'identifiant de session doit être diffusé par le protocole HTTP que ce soit par GET ou POST pour que la session soit récupérée d'une page à l'autre. Un petit sniffage (ou autre méthode de récupération) et le méchant pas beau va récupérer l'ID de session. Avec ça, y'a plus de difficultés pour générer le token. Pour contrer cette faille, il faut utiliser des ID uniques limités dans le temps. Voici un petit lien qui résoudra ton problème :
http://www.siteduzero.com/tutoriel-3-157576-securisation-des-failles-csrf.html
Sky
sky
Date : 13/08/2003
Forum msgs : 4436
Rank : Admin
Localisation : toulouse

Re : Classe de connexion sécurisé PHP

Lien directde sky le 26/07/2010 à 00:18
Bonjour Cédric.

Merci pour ton retour. (enfin, t'es retours)

C'est sur que je ne suis pas un pro de la programmation OO, c'est pas dur de le voir smile

Pour les variables privées, tu as 100% raison, même si ça serai plutôt protected et non private, mais peux importe.

Par contre, les fonction mysql_, je ne suis pas du tout d'accord.
certe, ils vont disparraitre (et encore ça reste à être confirmerje crois), mais je n'adhère pas du tout au système de Zend qui re écrit nos requête à la volée et entraine des perfs plus que limite. Parle à des admin système... ils ont une autre vision de la programmation et permet au développeur de sortir de leurs cocon de code qui n'est pas toujours en adéquation avec le hardware.

Est ce que tu change la BDD de ton application ? Je ne me rappel d'une fois sur mes quasi 7 ans d'expérience en tant que développeur et admin système. PDO n'est pas toujours une bonne solution.

Pour l'injection sql... j'avoue que je parté du principe que le type vérifie les donnée avant de l'envoyer à la classe. Alors injection poossible dans l'absolu oui, mais pas avec une utilisation corrrect.

Le brute force sur le mot de passe ... avec un bon grain de sel, c'est assez dur quand même! pas comme si la signature md5 existerai dans une BDD.

Le système pour bannir est simple et pas mal du tout. Bonne idée.

Le fingerprint est juste une couche supplémentaire... La sécurité est une histoire de couche, pas d'une porte blindé avec des murs en carton. Ceci rajoute une protection en plus qui rend les choses plus complexe pour un hacker.

Un token complètement aléatoire est bien, mais présente lui aussi des défauts.

Pour faire simple, merci d'avoir pris le temps de répondre, mais j'avoue avoir plus l'impression que tu démonte ceci sans vraiment y trouver quoi que ce soit de bien et faire plein de liens vers le site du zero smile

Sky
Sky
sky
Date : 13/08/2003
Forum msgs : 4436
Rank : Admin
Localisation : toulouse

Re : Classe de connexion sécurisé PHP

Lien directde sky le 27/07/2010 à 18:22
Mise à jours de la classe.
Version 0.2

Plus aucune variable public.
Amélioration et simplification du processus de connexion.
Ajout d'une variable pour le nom de la table des utilisateurs.

je vais bientôt faire une version qui utiliserai PDO.
CedricG
Date : 23/07/2010
Forum msgs : 3
Rank : Utilisateur

Re : Classe de connexion sécurisé PHP

Lien directde CedricG le 08/08/2010 à 15:45
Certes, tu peux ne pas utiliser Zend. Perso, je n'utilise que quelques classes de Zend (Zend_Db uniquement en fait) et je ne surcharge pas le serveur de classes inutiles car j'utilise l'auto-chargement des classes. Donc ça tourne tout de même très rapidement sur mon site.
Par contre, il faudrait tout de même utiliser au moins MySQLi car les fonctions mysql_ ne sont plus supportées lors de l'utilisation avec MySQL 5. D'ailleurs :
http://www.php.net/manual/fr/mysqli.overview.php
Note: Si vous utilisez MySQL versions 4.1.3 ou plus récent, il est fortement recommandé d'utiliser l'extension mysqli.

Oui, je dois prévoir l'utilisation de SGBD différents. Je travaille sur un projet de CMS.

Brute force = essayer toutes les combinaisons possibles... via ton formulaire de connexion. Donc, que tu aie salé tes mots de passe ou non... ça ne change rien. Par contre, les mots de passe salés empêchent les attaques par Rainbow Tables si le hacker a accès à la base de données. Mais bon, je préfère utiliser un hachage SHA-256 qui ne dispose pas de Rainbow Tables pour le moment et qui ralentit le programme lors des connexions ce qui limite le nombre d'essais possibles lors d'attaque à force brute. Bon, bien sûr, avec le système de bannissement temporaire, il n'y a pas à trop se soucier de ça.

Pour finir : bah, si un script n'est pas estimé (quasiment) parfait, pourquoi se taire et laisser un script que l'on pense insuffisant... insuffisant ? wink
D'ailleurs, les liens vers le SdZ sont là car je trouve que ces tutoriels sont à voir. Si ça venait d'un autre site, je l'aurai cité tout de même. wink

PS : Petit remarque :
return ($this->connected) ? true : false;
Mais $this->connected est un booléen... à quoi ça sert de vérifier que ce booléen est vrai pour renvoyer... vrai !
Sky
sky
Date : 13/08/2003
Forum msgs : 4436
Rank : Admin
Localisation : toulouse

Re : Classe de connexion sécurisé PHP

Lien directde sky le 09/08/2010 à 09:18
Salut Cédric.

Après lecture, MySQLi est ce qu'il faut désormais utilisé pour les nouveaux projets. (bien que j'utilise de plus en plus PDO)

Pour le brute force, en effet, je ne m'en préoccupe pas assez.

Pour le booléen... comme tu veux faire autrement ?
Renvoyer directement $this->connected ?

Sky
CedricG
Date : 23/07/2010
Forum msgs : 3
Rank : Utilisateur

Re : Classe de connexion sécurisé PHP

Lien directde CedricG le 01/09/2010 à 13:18
Salut,

Je viens de regarder la nouvelle version. C'est bon, on se rapproche de quelque chose de bon. Je vais seulement m'attarder sur des simplifications réalisables et de quoi... nettoyer le code. wink

Tu écris dans le constructeur de la classe :
if($this->testConnexion() == false)
{
    $this->connected = false;
}

Euh... testConnexion() renvoie vrai quand la connexion est réussie et faux quand elle ne l'est pas... Pourquoi ne pas écrire :
$this->connected = $this->testConnexion();

Avec ça, tu pourras virer $this->connected = true; dans testConnexion().
Faut éviter les conditions inutiles quand on le peut, le code en sera plus léger.

Ensuite, j'ai vu que tu as repris ce bout ci que je t'avais conseillé.
$addreq = ($connexion == 1) ? ", date_last_connexion='$date'" : "";

Pourquoi as-tu rajouté == 1 ? Dans PHP :
true == 1
. Donc ce que j'avais mis était correct : quand tu fais "SI variable EGALE A 1", c'est la même chose que si tu faisais "SI variable" tout court. D'ailleurs, pourquoi tu utilises true/false à certains moments puis 1/0 ?

Aussi, quand il y a une erreur, tu utilises exit. Je te conseille d'utiliser les exceptions. Elles permettent d'avoir une meilleure gestion des erreurs.
Par exemple, si une exception est lancée, tu peux faire continuer la partie graphique du site et afficher le message d'erreur dans le site en lui-même et non pas sur une page blanche, ou incomplète.
Voici le lien dans la doc PHP : http://php.net/manual/fr/language.exceptions.php.

Enfin, connexion en anglais c'est connection... à corriger un peu partout. Les commentaires sont en français... mais à quoi sert de mettre les noms de variables, etc... en anglais si les commentaires sont en français ?

Voilà, je crois qu'avec ça, la classe sera toute belle, toute propre !... enfin je crois. smile Y'a toujours l'utilisation de MySQLi (ou PDO) qui n'est pas réalisée, mais je crois que tu le feras plus tard, n'est-ce pas ?

@+
Sky
sky
Date : 13/08/2003
Forum msgs : 4436
Rank : Admin
Localisation : toulouse

Re : Classe de connexion sécurisé PHP

Lien directde sky le 01/09/2010 à 13:24
Salut Cédric

Je fairai une maj, mais pour ce qui est du langage ... je passerai tout en anglais smile Etant anglais, parlant aussi français, je mélange les deux très souvent.

Ps : les mots anglais sont plus explicite aussi smile

Sky
Julien01
Date : 12/01/2011
Forum msgs : 5
Rank : Utilisateur

Re : Classe de connexion sécurisé PHP

Lien directde julien01 le 12/01/2011 à 22:52
Sympa cette classe... quelques remarques wink

Pourquoi ne pas faire un session_destroy(); dans resetSessionData() à la place de tes lignes de code ci-dessous :
// declaration des sessions
$_SESSION[ $this->password_name ] = '';
$_SESSION[ $this->login_name ] = '';
$_SESSION['token'] = '';

Les unset($_SESSION[...]) de ta function disconnect() seront ainsi superflux puisque tu les supprime dans resetSessionData

Pour le hashage, il est préférable d'utiliser sha1() en lieux et place de ton md5()
Sky
sky
Date : 13/08/2003
Forum msgs : 4436
Rank : Admin
Localisation : toulouse

Re : Classe de connexion sécurisé PHP

Lien directde sky le 13/01/2011 à 09:28
Salut Julien,

En effet, on pourrais juste utiliser session_destroy();
Mais ... ceci détruit littéralement toutes les sessions de cet utilisateur.

Je ne veux pas faire ce choix pour la personne qui utilise cette classe.

Prend l'exemple d'une boutique avec un panier ... faut bien conserver le panier dans une session ... smile

Pour le hash, as-tu des sources qui me confirme ce que tu dit ?

Merci pour tes retours,
Sky

1 2 3 4

You need a account to use the forum.

Inscription

Connexion