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 :

Espace membre et sessions


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Par défaut Espace membre et sessions
    Bonsoir, (je poste au bon endroit?)

    Je débute en PHP et je fais quelques tests en local dans le but de me faire un petit script de connexion pour mon site. Voici le code:

    Formulaire de connexion:
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    <?php
    session_start();
    ?>
    //ici j'ai mis la fonction genClef qui permet de générer aléatoirement une très grande chaîne de caractères
    <?php
     
    try //test de la connexion
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=test','root',''); //connexion
    }
    catch (Exception $e)
    {
    	die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
    }
    if(isset($_POST['pseudo']) AND isset($_POST['passe']))
    {
     
    	$requete = $bdd->prepare('SELECT COUNT(*) FROM membre WHERE pseudo = ?');
        $requete->execute(array($_POST['pseudo']));
    	$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
     
    	if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
        {
            echo 'Pseudo incorrect';
        }
        else
        {
    		$requete = $bdd->prepare('SELECT passe FROM membre WHERE pseudo = ?');
    		$requete->execute(array($_POST['pseudo']));
    		$reponse = $requete->fetch();
     
            if ($_POST['passe'] == $reponse['passe'])
    		{
     
    			$clefIdentifianteUnique = genClef(); //génère une clef identifiante unique grâce à la fonction genClef
    			echo $clefIdentifianteUnique;
     
    			$requete = $bdd->prepare('INSERT INTO clefIdentifianteUnique (clefIdentifianteUnique) Values(?)'); //enregistre la clef dans la bdd
    			$requete->execute(array($clefIdentifianteUnique));
     
    			$requete = $bdd->prepare('SELECT id FROM clefIdentifianteUnique WHERE clefIdentifianteUnique = ?'); //récupère l'id de la clef
    			$requete->execute(array($clefIdentifianteUnique));
    			$reponse = $requete->fetch();
     
    			$pseudoId = $_POST['pseudo'] . $reponse['id']; //crée une variable composée du pseudo et de l'id de la clef
    			echo $pseudoId;
     
    			$requete = $bdd->prepare('UPDATE clefIdentifianteUnique SET pseudoId = ? WHERE clefIdentifianteUnique = ?'); //enregistre la variable dans la bdd
    			$requete->execute(array($pseudoId, $clefIdentifianteUnique));
     
    			$_SESSION['clefIdentifianteUnique'] = $clefIdentifianteUnique; //enregistre le code et le pseudo dans des variables de session
    			$_SESSION['pseudo'] = $_POST['pseudo'];
    			$_SESSION['pseudoId'] = $pseudoId;
     
    			echo '<a href="espaceMembre.php">Espace membre</a>';
     
    			echo 'Bonne navigation<br/>';
    			echo $_POST['pseudo'];
    		}
    		else
    		{
    			echo 'Mot de passe incorrect';
    		}
        }
     
    	$requete->closeCursor();
    }
    else
    {
    	echo 'ERREUR';
    }
    ?>
     
    <form method="post" action="index.php">
    <input name="pseudo" type="text" value="Pseudo"><br/>
    <input name="passe" type="password" value="Mot de passe"><br/>
    <input type="submit" value="Valider"/><br/>
    </form>
    Et l'espace membre (qui est destiné à se remplir):

    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
    <?php
    if(!isset($_SESSION))
    {
    	session_start();
     
     
    	try //test de la connexion
    	{
    		$bdd = new PDO('mysql:host=localhost;dbname=test','root',''); //connexion
    	}
    	catch (Exception $e)
    	{
    		die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
    	}
     
    	$requete = $bdd->prepare('SELECT clefIdentifianteUnique FROM clefIdentifianteUnique WHERE pseudoId = ?');
    	$requete->execute(array($_SESSION['pseudoId']));
     
    	$reponse = $requete->fetch();
     
    	if ($reponse['clefIdentifianteUnique'] == $_SESSION['clefIdentifianteUnique'])
    	{
    		echo $_SESSION['clefIdentifianteUnique'];
    		echo $_SESSION['pseudo'];
    	}
    	else
    	{
    		echo 'Accès refusé';
    	}
    }	
    else
    {
    	echo 'ARGG';
    }
    	?>
    Seulement lorsque j'essaie d'accéder à mon espace membre sans passer par le formulaire, au lieu d'avoir le messages d'erreur j'ai:
    Notice: Undefined index: pseudoId in*E:\Program Files\wamp\www\test\espaceMembre.php*on line*17

    Notice: Undefined index: clefIdentifianteUnique in*E:\Program Files\wamp\www\test\espaceMembre.php*on line*21

    Notice: Undefined index: clefIdentifianteUnique in*E:\Program Files\wamp\www\test\espaceMembre.php*on line*23

    Notice: Undefined index: pseudo in*E:\Program Files\wamp\www\test\espaceMembre.php*on line*24
    Ce qui veut dire que PHP lit le code même avec le if. Donc je sais pas si j'ai loupé quelque chose ou si j'utilise mas les sessions, mais je ne trouve pas de solution.

    Sinon que pensez-vous de ce script? Est-ce assez sécurisé? (j'ai du mal à me rendre compte du niveau de sécurité qu'offrent les sessions).

    Merci pour votre aide!

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    C'est plutot un test dans ce genre qu'il te faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    session_start();
    if(!isset($_SESSION['clefIdentifianteUnique'])
    {
    Sinon je ne vois pas pas bien ce qu'apporte ta clef supplementaire en session comme sécurité.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Par défaut
    Je vais essayer merci!

    L'intérêt de la clef et de ne pas transmettre le mot de passe qui reste bien au chaud dans la bdd, d'autant plus qu'il n'est pas encore hasché. Après je suis peut être un peu trop parano.
    Mais comme j'ai pas vraiment compris comment les sessions transmettent les variables, je préfère sécuriser au maximum. J'ai lu que les sessions peuvent utiliser des cookies par exemple. Dans ce cas le mot de passe serait exposé aux pirates, non?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Les données des sessions sont stockés sur le serveur.
    Le cookie fait le lien entre l'utilisateur et sa session sur le serveur.

    Il n'y a de toute facon pas d'interet a stocker le mot de passe en session puisqu'il n'y a pas d'interet a re-controler le mot de passe (ou n'importe quel autre élément) a chaque page.

    Ce qui est interessant par contre est de regenerer la session lorsque l'utilisateur change de niveau d'accès (authentification, changement de mot de passe etc.).
    En effet une technique de vol d'accès consiste a voler la session de l'utilisateur puis de l'inciter a se connecter sur le site (faux lien etc.).
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Par défaut
    En quoi consiste le vol de session?

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Cela consiste a recuperer l'identifiant de session (stocké dans un cookie ou dans l'url).
    Le voleur peut alors usurper l'accès de l'utilisateur.

    Pour renforcer la sécurité, on peut controler que les informations de l'utilisateur (navigateur, adresse ip, systeme d'exploitation etc.) ne changent pas au cours de la session, ce qui laisserait supposer que l'utilisateur a changé.
    http://guillaume-affringue.developpe...rement/?page=4
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Par défaut
    Merci beaucoup!

    Ca devrait résoudre mon problème et renforcer mes maigres bases en PHP

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Par défaut
    Après la lecture du très bon et complet dossier sur les techniques de protection, j'ai décidé d'adapter le système du ticket à mon cas. J'en ai profiter pour corriger les très nombreuses erreurs et futilités de mon code.

    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
    65
    66
    67
    68
    69
    70
    71
    <?php
    session_start();
    ?>
     
    <form method="post" action="index.php">
    <input name="pseudo" type="text" value="Pseudo"><br/>
    <input name="passe" type="password" value="Mot de passe"><br/>
    <input type="submit" value="Valider"/><br/>
    </form>
    <a href="espaceMembre.php">Espace Membre</a>
    <?php
     
    try //test de la connexion
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=test','root',''); //connexion
    }
    catch (Exception $e)
    {
    	die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
    }
    if(isset($_POST['pseudo']) AND isset($_POST['passe']))
    {
     
    	$requete = $bdd->prepare('SELECT COUNT(*) FROM membre WHERE pseudo = ?');
        $requete->execute(array($_POST['pseudo']));
    	$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
     
    	if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
        {
            echo 'Pseudo incorrect';
        }
        else
        {
    		$requete = $bdd->prepare('SELECT passe FROM membre WHERE pseudo = ?');
    		$requete->execute(array($_POST['pseudo']));
    		$reponse = $requete->fetch();
     
            if ($_POST['passe'] == $reponse['passe'])
    		{
     
    			$clefIdentifianteUnique = genClef(); //génère une clef identifiante unique grâce à la fonction genClef
    			//echo $clefIdentifianteUnique;
    			setcookie('pseudo',$clefIdentifianteUnique, time() + 3600, null, null, false, true);
     
    			$ticketIdentifiantUnique = genClef();
    			setcookie('ticket',$ticketIdentifiantUnique, time() + 3600, null, null, false, true);
    			$_SESSION['ticket'] = $ticketIdentifiantUnique;
    $_SESSION['clefIdentifianteUnique'] = $clefIdentifianteUnique; //enregistre le code et le pseudo dans des variables de session
    			$_SESSION['pseudo'] = $_POST['pseudo'];
     
     
     
     
    			echo '<a href="espaceMembre.php">Espace membre</a><br/>';
     
    			echo 'Bonne navigation<br/>';
    			echo $_POST['pseudo'];
    		}
    		else
    		{
    			echo 'Mot de passe incorrect';
    		}
        }
     
    	$requete->closeCursor();
    }
    else
    {
    	echo 'ERREUR';
    }
    ?>
    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
     
    <?php
    session_start();
    if(isset($_SESSION['clefIdentifianteUnique']))
    {
    	if($_COOKIE['pseudo'] = $_SESSION['clefIdentifianteUnique'] AND $_COOKIE['ticket'] = $_SESSION['ticket'])
    	{
    		//echo $_SESSION['clefIdentifianteUnique'];
    		//echo $_SESSION['pseudo'];
    		//echo $_COOKIE['pseudo'];
                    $ticketIdentifiantUnique = genClef();
    		setcookie('ticket',$ticketIdentifiantUnique, time() + 3600, null, null, false, true);
    		$_SESSION['ticket'] = $ticketIdentifiantUnique;
     
                    $membre = true;
    	}
    	else
    	{
    		echo 'Accès refusé<br/>';
    		echo '<a href=index.php">Connexion</a>';
    	}
    }
    else
    {
    	echo 'Veuillez vous connecter<br/>';
    	echo '<a href=index.php">Connexion</a>';
    }
    	?>
    Qu'en pensez vous?

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

Discussions similaires

  1. session qui se melange sur un espace membre
    Par monlou dans le forum Langage
    Réponses: 7
    Dernier message: 12/08/2014, 22h43
  2. session et espace membre!
    Par italiasky dans le forum ASP.NET
    Réponses: 4
    Dernier message: 12/08/2010, 16h39
  3. Session espace membres
    Par bernard26000 dans le forum Langage
    Réponses: 1
    Dernier message: 28/12/2008, 10h06
  4. [MySQL] Session espace membre
    Par spawns dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/12/2008, 18h01
  5. [MySQL] Espace membre avec session
    Par yamatoshi dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/05/2008, 11h11

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