Salut à tous. Depuis ce matin je suis sur la creation d'un espace membre et tout c'est bien passé jusqu'à ce que j'essaie de l'amerliorer en ajoutant une case à cocher se souvenir de moi. Je suivais ce tuto( tuto sur se souvenir de moi) mais je me suis planté.
Le cookie qui doit permettrent de stocker les informations de l'utilisateur ne sont pas crée.
Je vous presente mes codes sources pour que vous m'aider:

la page config.php

<?php
session_start();
    if(isset($_COOKIE'auth']))
    {
        $auth = $_COOKIE'auth'];
        $auth = explode('-----', $auth);
        echo 'cookie existe'; //verifie si le cookie est crée
    }
    $bdd = new PDO('mysql:host=localhost; dbname=membres', 'root', '', array(PDO:: ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

?>

la page index.php

<?php
    include('config.php');
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
    </head>
    <body>
        <?php
        if (isset($_SESSION'pseudo'])) {
            echo 'Bienvenu sur le site.<br/>
                    <a href="deconnexion.php">Se deconnecter</a>';
        }
        else
        {
            ?>
            <h1>Bienvenu</h1>
            <p>Si vous n'êtes pas encore inscrit alors, faites le: <a href="inscription.php">Inscription</a></p>
            <p>Si vous êtes déjà inscrit, vous pouvez vous connecter: <a href="connexion.php">Se connecter</a></p>
            <?php
        }
        ?>
    </body>
</html>

la page inscription.php

<?php
    include('config.php');
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>Inscription</title>
    </head>
    <body>
    <?php
    //Si la personne est connecté on lui demandé de se connecter pour effectuer une autre inscription
    if (isset($_SESSION'pseudo'])) {
        echo 'Vous êtes déjà connecté. Pour effectuer une autre inscription, veuillez d\'abord vous deconnectez.<br/>
                <a href="deconnexion.php">Se deconnecter</a>';
    }
        // Si l'utilisateur à renseigner les informations pour l'inscription
    if (isset($_POST'submit']))
    {
        if(!empty($_POST'pseudo']) AND !empty($_POST'email']) AND !empty($_POST'password']) AND !empty($_POST'verified_password']))
        {
            // On verife si le pseudo n'est pas deja utilisé
            $req = $bdd->query('SELECT pseudo FROM inscription WHERE pseudo="'.$_POST'pseudo'].'"');
            $donnees = $req->fetch();
            if($donnees'pseudo'] != $_POST'pseudo'])
            {
                //On verifie aussi si le format du pseudo est correct
                if(preg_match('#^[a-zA-Z0-9._-]{3,20}$#',$_POST'pseudo']))
                {
                    //Si le pseudo est disponible on verife si l'email envoyé correspond à un bon format
                    if(preg_match('#^[a-zA-Z0-9._-]{3,}@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}(\.?[a-z]{2,4})?$#',$_POST'email']))
                    {
                        //On verifie si les deux mot de passe sont identiques
                        if($_POST'password'] == $_POST'verified_password'])
                        {
                            $pseudo = addslashes($_POST'pseudo']);
                            $email = addslashes($_POST'email']);
                            $password = sha1($_POST'password']);
                            $req1 = $bdd->prepare('INSERT INTO inscription(pseudo, email, password, date_inscription) VALUES(?, ?, ?, NOW())');
                            $req1->execute(array($pseudo, $email, $password));
                            $message = 'Félicitation. Vous êtes desormais membre du site.<br/><a href="connexion.php">Se Connecter</a>';    
                        }
                        else
                        {
                            $message = 'les deux mots de passe ne sont pas identiques';
                            $form=1;
                        }
                    }
                    else
                    {
                        $message = 'L\'émail entré n\'est pas correct';
                        $form=1;
                    }
                }
                else
                {
                    $form=1;
                    $message = 'Vérifiez que le pseudo correspond à un bon format et qu\'il soit compris entre 3 et 20 caractères';
                }
            }
            else
            {
                $message = 'Ce pseudo existe deja';
                $form=1;
            }
        }
        else
        {
            $form=1;
            $message= 'Veuillez remplir les champs';
        }
    }
        if(isset($form) AND $form==1 OR !isset($_POST'submit']))
        {
                if(isset($message))
                {
                    echo $message;
                }
            ?>
                <form method="post">
                    <label for="email">Email: </label><input type="text" id="email" name="email"/><br/>
                    <label for="pseudo">Pseudo: </label><input type="text" id="pseudo" name="pseudo"/><br/>
                    <label for="password">Mot de Passe: </label><input type="password" id="password" name="password"/><br/>
                    <label for="password">Reparter Mot de Passe: </label><input type="password" id="password" name="verified_password"/><br/>
                    <input type="submit" value="Envoyer" name="submit"/>
                </form>
            <?php
        }
    ?>
    </body>
</html>

la page connexion.php

<?php
    include('config.php');
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>Connexion</title>
    </head>
    <body>
        <?php 
        //Si la personne est connecté on la renvoie vers la page d'accueil
        if (isset($_SESSION'pseudo'])) {
            header('Location: index.php');
        }
        if (isset($_POST'submit']))
        {
            if (!empty($_POST'pseudo']) AND !empty($_POST'password']))
            {
                //On verifie si les coordonnées remplis sont correctes
                $password = sha1($_POST'password']);
                $req = $bdd->query('SELECT id, pseudo, password FROM inscription WHERE pseudo="'.$_POST'pseudo'].'" AND password="'.$password.'"');
                $donnees = $req->fetch();
                $id = $donnees'id'];
                $password_dans_base_de_donnees = $donnees'password'];
                $pseudo_dans_base_de_donnees = $donnees'pseudo'];
                //Comparaison des identifiants rentrés par l'utilisateur et ceux de la base de donnés
                //Si les données sont identiques alors il est connecté
                if (isset($_POST'remember']))
                {
                    setcookie('auth', $id . '-----' . sha1($pseudo_dans_base_de_donnees . $password_dans_base_de_donnees), time() + 3600*24*7, '/', 'localhost', false, true);
                }
                if ($pseudo_dans_base_de_donnees==$_POST'pseudo'] AND $password_dans_base_de_donnees==$password)
                {
                    $_SESSION'pseudo'] = $_POST'pseudo'];
                    echo 'Félicitation '.$_SESSION'pseudo'].'. vous êtes bien connecté au site';
                }
                else
                {
                    $message='Les identifiants rentrés ne sont pas corrects';
                    $form = 1;
                }
            }
            else
            {
                $message='Les champs suivants sont obligatoires';
                $form = 1;
            }
        }
        if(!isset($_POST'submit']) OR isset($form) AND $form==1)
        {
                if(isset($message))
                {
                    echo $message;
                }
        ?>
            <form method="post">
                <label for="pseudo">Pseudo: </label><input type="text" id="pseudo" name="pseudo"/><br/>
                <label for="password">Mot de Passe: </label><input type="password" id="password" name="password"/><br/>
                <input type="checkbox" id="remember" name="remember"/><label for="remember">Se souvenir de moi</label><br/>
                <input type="submit" Value="Connexion" name="submit"/>
            </form>
        <?php   
        }
        ?>
    </body>
</html>

la page deconnexion.php

<?php
session_start();
if(isset($_SESSION'pseudo']))
{
    session_destroy();
    header('Location: index.php');
}
else
{
    echo 'Vous êtes déjà deconnecté';
}
?>

efin ma base de données

-- phpMyAdmin SQL Dump
-- version 4.0.4
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Aug 28, 2014 at 09:01 PM
-- Server version: 5.6.12-log
-- PHP Version: 5.4.12
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `membres`
--
CREATE DATABASE IF NOT EXISTS `membres` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `membres`;
-- --------------------------------------------------------
--
-- Table structure for table `inscription`
--
CREATE TABLE IF NOT EXISTS `inscription` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pseudo` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `date_inscription` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
--
-- Dumping data for table `inscription`
--
INSERT INTO `inscription` (`id`, `pseudo`, `email`, `password`, `date_inscription`) VALUES
(3, 'princelionelnzi', 'prince@email.com', '7c4a8d09ca3762af61e59520943dc26494f8941b', '2014-08-28 13:11:53'),
(4, 'cerv0cerv0', 'cerv0@email.com', '7c4a8d09ca3762af61e59520943dc26494f8941b', '2014-08-28 13:17:48');
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

8 réponses


Slt,
Mouai... C'est quand même dangereux de mettre le mot de passe de l'utilisateur dans un cookie !

salut. oui oui je suits le tutoriel. mais dis t'as pas une solution à mon problème?

j'ai lu des tutoriels par rapport au cookie mais dans mon cas(la page connexion.php) la creation ne fonction pas. tu peux y jetter un coup d'œil pour m'aider

Il y a sans doute une erreur dans ta syntaxe de setcookie

Mais je ne trouve pas l'erreur

Re,
Déjà, ajoute des tests à tes if, afin de voir si tes arguments fonctionnent, ensuite test un setcookie sans toute tes données, histoire de voir dans un premier temps, si le cookie est créer, et enfin voir si justement il y a pas une erreur dans ton setcookie avec tes donnés ajoutés.

Je l'ai fait et je vois que le cookie n'est pas creer

Hello,
Déjà, il y a une injection SQL sur la page connexion.php (Et pareil sur la page inscription.php):

$req = $bdd->query('SELECT id, pseudo, password FROM inscription WHERE pseudo="'.$_POST'pseudo'].'" AND password="'.$password.'"');

Utilise les requêtes préparées pour éviter ça:

$req = $bdd->prepare('SELECT id, pseudo, password FROM inscription WHERE pseudo = :pseudo AND password = :password');
$req->bindValue(':pseudo', $_POST'pseudo'], PDO::PARAM_STR);
$req->bindValue(':password', $password, PDO::PARAM_STR);
$req->execute();
$result = $req->fetch();

De plus, après tu vérifies ces données :

if ($pseudo_dans_base_de_donnees==$_POST'pseudo'] AND $password_dans_base_de_donnees==$password)
{
    $_SESSION'pseudo'] = $_POST'pseudo'];
    echo 'Félicitation '.$_SESSION'pseudo'].'. vous êtes bien connecté au site';
} else {
    $message='Les identifiants rentrés ne sont pas corrects';
    $form = 1;
}

Or, pas besoin de vérifier ça vue que la requête SQL le fait pour toi, mais tu as juste à faire une vérification sur la variable $result et si elle est vide (empty), c'est tout simplement que son mot de passe et/ou pseudo n'est pas correct.

Quand aux cookies, plutôt que tout mettre bout à bout, fait des tableaux, tu trouveras un exemple ici (et plein sur Google): http://php.net//manual/fr/function.setcookie.php#example-4624

Et évite de stocker le mot de passe dans les cookies ( même haché ), tu peut stocker plein d'autre information moins risqué, comme l'id de l'utilisateur, la date de création du compte etc. Car les cookies peuvent être accessible si le site à une faille XSS. Et comme je sais que tu va te dire que sa risque rien car ils sont hachés, il faut savoir qu'il existe des dictionnaires pour les hashs, notamment pour les fonction md5 et sha1 qui sont les plus utilisés, et donc certain mot de passe comme les plus utilisé peuvent être trouvé via ces dictionnaires.

En parlant de faille XSS, il y en a une ici (ligne 36):

echo 'Félicitation '.$_SESSION'pseudo'].'. vous êtes bien connecté au site';

Il faut TOUJOURS prendre l'habitude de parser les données qui sont envoyé par un utilisateur avant de les afficher. En l'occurrence tu peux utiliser la fonction htmlspecialchars.