Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/06/2007, 02h43   #1
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2004
Messages : 78
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2004
Messages : 78
Points : 34
Points : 34
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 :
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 :
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.
ddelec24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2007, 06h54   #2
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
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.
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2007, 15h20   #3
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2004
Messages : 78
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2004
Messages : 78
Points : 34
Points : 34
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.
ddelec24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2007, 11h08   #4
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
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
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h41.


 
 
 
 
Partenaires

Hébergement Web