IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Cookies] Sessions & cookies (toujours connecté)


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juin 2004
    Messages : 88
    Par défaut [Cookies] Sessions & cookies (toujours connecté)
    Bonjour.
    Je viens faire appel a vous pour un problème de session.
    Mon but est, comme souvent, d'avoir une coche "Toujours connecter" qui alors permet un auto login meme quand l'utilisateur a fermer son navigateur.
    Le seul moyen est donc les cookies? Enfin je suis parti dans cet optique et j'ai fais le code suivant:

    Pour se logguer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    if((isset($_POST['loginpa'])) || (isset($_POST['passwdpa']))) {
        if($_POST['loginpa'] == "") $errlogin = 1;
        if(($_POST['passwdpa'] == "") && ($_POST['loginpa'] != "")) $errlogin = 2;
        if($errlogin == 0) {
            $mylogin = htmlentities($_POST['loginpa']);
            $mypasswd = htmlentities($_POST['passwdpa']);
            $query = $mysql->query_mysql("SELECT UP_LEVEL, MDPASSE FROM MEMBRE WHERE PSEUDO='$mylogin' LIMIT 1");
            if(mysql_num_rows($query) != 0) {
                $result = mysql_fetch_array($query);
                if($result['UP_LEVEL'] == "0") { header("Location: http://localhost/index.php?page=activateaccount&pseudo=$mylogin",301); }
                $mdpbdd = $result['MDPASSE'];
                if(md5($mypasswd) != $mdpbdd) {
                    $errlogin = 2;
                } else {
                    $_SESSION['pseudo'] = $mylogin;
                    $_SESSION['leveluser'] = $result['UP_LEVEL'];
                    $pseudomembre = $_SESSION['pseudo'];
                    $level = $_SESSION['leveluser'];
                    if(isset($_POST['rememberme'])) {
                        setcookie("papseudo",$pseudomembre,time()+60*60*24*90,"/"); // expiration 3 mois
                        setcookie("papwd",md5($mypasswd),time()+60*60*24*90,"/");
                    } else {
                        setcookie("papseudo",$pseudomembre,time()+60*30,"/"); // expiration 30 min
                        setcookie("papwd",md5($mypasswd),time()+60*30,"/");
                    } // FIN COOKIE CONNEXION
                } // FIN MOTS DE PASSES IDENTIQUES
            } // FIN PSEUDO EXISTANT
        } // FIN 2 CHAMPS RENSEIGNÉS
    }else {
        if($_SESSION['pseudo'] != "") {
            $pseudomembre = $_SESSION['pseudo'];
            $level = $_SESSION['leveluser'];
        } else {
            // COOKIES EXISTANTS MAIS MEMBRE NON LOGGUÉ
            if((isset($_COOKIE['papseudo'])) && (isset($_COOKIE['papwd']))) {
                // SI LES COOKIES NE SONT PAS VIDES
                if(($_COOKIE['papseudo'] != "") && ($_COOKIE['papwd'] != "")) {
                    $pseudocookie = $_COOKIE['papseudo'];
                    $mdpcookie = $_COOKIE['papwd'];
                    $query = $mysql->query_mysql("SELECT UP_LEVEL, MDPASSE FROM MEMBRE WHERE PSEUDO='$pseudocookie' LIMIT 1");
                    // SI LE LOGIN EXISTE
                    if(mysql_num_rows($query) != 0) {
                        $result = mysql_fetch_array($query);
                        // SI LES MOTS DE PASSES SONT IDENTIQUES
                        if($mdpcookie == $result['MDPASSE']) {
                            $_SESSION['pseudo'] = $pseudocookie;
                            $pseudomembre = $pseudocookie;
                            $_SESSION['leveluser'] = $result['UP_LEVEL'];
                            $level = $_SESSION['leveluser'];
                        } // FIN MDP IDENTIQUES
                        else {
                            setcookie('papseudo','', time()-3600); // expiration cookie pseudo
                            setcookie('papwd','', time()-3600); // expiration cookie password
                        }
                    } // FIN PSEUDO EXISTANT
                    else {
                        setcookie('papseudo','', time()-3600); // expiration cookie pseudo
                        setcookie('papwd','', time()-3600); // expiration cookie password
                    }
                } // FIN COOKIES NON VIDES
            } // FIN COOKIES EXISTANT ET SESSION PSEUDO INEXISTANTE
        } // SESSION OUVERTE
    } // FIN FORMULAIRE NON SOUMI

    Pour se délogguer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if(($_GET['action'] != "") && ($_GET['sid'] != "")) {
        $action = htmlentities($_GET['action']);
        if($action == 'logout') {
            $sid = htmlentities($_GET['sid']);
            if($sid == session_id()) {
                // DESTRUCTION DES DONNEES DE SESSION ET DE LA SESSION
                $_SESSION = array();
                session_destroy();
                setcookie('papseudo','', time()-3600); // expiration cookie pseudo
                setcookie('papwd','', time()-3600); // expiration cookie password
            }
        }
    }
    Ce qu'il se passe, c'est qu'au premier deloggue, la session est recréé et si je reclique ca fonctionne bien... je suis délogguer.
    Sinon quand je ferme le navigateur et que je le ré ouvre, meme si j'ai coché Toujours connecter ca ne fonctionne pas

    j'ai fais mon petit algo mais aparement c'est pas trop ca en pratique
    J'ai pas testé l'expiration du cookie pour le déloggue automatique (30min) mais je doute que ca fonctionne

    Bref je viens faire appel a votre aide car la j'ai quelques difficultés pour comprendre le fonctionnement du couple sessions+cookies!


    Merci de votre aide.
    Cordialement, DD.

  2. #2
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    L'enregistrement de cookie avec rememberme doit fonctionner 90 jours, je vous propose de vider vos cookies a la main et de re-essayer.
    En revanche, htmlentities() n'est pas le meilleur moyen de securiser du contenu provenant du client, bien que cela soit correct si le serveur n'envoie pas d'UTF-7 ou autre charset exotique, pour cela il vaut mieux utiliser mysql_real_escape_string().
    A part ca, nommer la fonction query_mysql n'est pas tres interressante, il faudrait probablement l'appeler simplement db_query, imaginez que vous souhaitez pouvoir migrer tranquillement votre script de mysql a mysqli ou vice-versa (sans parler des autres moteurs de bases de donnees).
    Enfin, c'est une mauvaise idee de trimballer le mot de passe dans toutes les requetes HTTP, meme/particulierement en md5. Mieux vaut d'au-moins utiliser crypt, au mieux un identifiant aleatoire.
    Bon courage.

  3. #3
    Membre confirmé
    Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juin 2004
    Messages : 88
    Par défaut
    Il y avait effectivement un problème de cookies ça a l'air de fonctionner maintenant

    Pour le problème de la déconnexion j'ai mis un header location apres la destruction de session et de lexpiration des cookies, peut etre pas très propre mais ca n'a pas l'air de géner

    Pour ta remarque sur htmlentities(), je suis curieux et toujours ouvert aux critiques, j'ai donc suivi ta remarque et utilisé cette autre fonction pour les variables utilisés dans des requêtes. Mais est-ce la peine aussi pour les variables qui sont récupérées en POST ou GET pour être affichées? ou htmlentities() suffit?

    Pour le nom de la fonction je ne vois pas trop pourquoi un nom plutôt qu'un autre, mais si il y a un standard, enfin une convention universelle pourquoi pas

    Enfin, j'ai suivi ton conseil, et j'utilise crypt pour les cookies,enfin pas du blowfish mon hébergeur n'a pas le module apparemment mais celui du dessous (CRYPT_MD5) donc jai choisi de faire crypt(md5()...), bon choix ou pas?

    Voila j'ai modifié mon code et tout fonctionne sous firefox et IE7, je testerais sous d'autres navigateurs plus tard pour être sur


    Merci encore pour tes conseils même s'ils ne répondaient pas a ma question car je ne demande qu'a m'améliorer

    Cordialement, DD.

  4. #4
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    Pour ta remarque sur htmlentities(), je suis curieux et toujours ouvert aux critiques, j'ai donc suivi ta remarque et utilisé cette autre fonction pour les variables utilisés dans des requêtes. Mais est-ce la peine aussi pour les variables qui sont récupérées en POST ou GET pour être affichées? ou htmlentities() suffit?
    Tout depend de ce que tu compte faire des variables.
    Pour le nom de la fonction je ne vois pas trop pourquoi un nom plutôt qu'un autre, mais si il y a un standard, enfin une convention universelle pourquoi pas
    Comme je le disait, si tu veux que la fonction soit capable de faire "abstraction" de la base de donnees, pas la peine d'y mettre le nom d'une base. Le but etant de pouvoir passer a mysqli ou autre sans changer le code appelant la fonction.
    Enfin, j'ai suivi ton conseil, et j'utilise crypt pour les cookies,enfin pas du blowfish mon hébergeur n'a pas le module apparemment mais celui du dessous (CRYPT_MD5) donc jai choisi de faire crypt(md5()...), bon choix ou pas?
    Pas mal mais rien de tel qu'un identifiant aleatoire au lieu du mot de passe dans le cookie.
    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Cookies] variable globale, cookie, session
    Par badock dans le forum Langage
    Réponses: 2
    Dernier message: 01/02/2008, 17h36
  2. [Cookies] session php cookie
    Par afroweb dans le forum Langage
    Réponses: 5
    Dernier message: 16/05/2007, 11h55
  3. [Cookies] Sessions ou cookies
    Par arti2004 dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2006, 19h39
  4. Réponses: 3
    Dernier message: 01/05/2006, 14h27
  5. [Cookies] Session sans cookie
    Par billoum dans le forum Langage
    Réponses: 2
    Dernier message: 25/04/2006, 19h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo