Menu

La mise en application des cookies. [Résolu]

Max747 29 Messages postés vendredi 11 juillet 2014Date d'inscription 23 mars 2018 Dernière intervention - 26 janv. 2018 à 10:15 - Dernière réponse :  Max747
- 29 janv. 2018 à 15:52
Bonjour,

Désirant actuellement mettre en oeuvre des cookies en ajoutant quelques fichiers à mon site internet sur le jeu des questions, j'ai obtenus ceux ci concernant la création de ces cookies.
De surcroit sécurisés!
Cependant, malgré cette installation de cookies faites sur mon ordinateur en mode local, je ne parviens pas à les exploiter à partir de ceux utilisés que voici:
Fichier db.class.php
<?php
class DB{

    private $host = 'localhost';
    private $username = 'root';
    private $password = '';
    private $database = 'persistente';
    private $db;

    public function __construct($host = null, $username = null, $password = null, $database = null){
        if($host != null){
            $this->host = $host;
            $this->username = $username;
            $this->password = $password;
            $this->database = $database;
        }

        try{
            $this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database, $this->username, $this->password, array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
                ));
        }catch(PDOException $e){
            die('<h1>Impossible de se connecter a la base de donnee</h1>');
        }


    }

    public function query($sql, $data = array()){
        $req =$this->db->prepare($sql);
        $req->execute($data);
        return $req->fetchAll(PDO::FETCH_OBJ);
    }

    public function row($sql, $data = array()){
        $datas = $this->query($sql, $data);
        return empty($datas) ? false : $datas[0];
    }

}


Fichier conf.php
<?php
require 'db.class.php';
$db = new DB();
session_start();
if(isset($_COOKIE['auth']) && !isset($_SESSION['Auth'])){
    $auth = $_COOKIE['auth'];
    $auth = explode('-----', $auth);
    $user = $db->row('SELECT * FROM users WHERE id=:id', array('id' => $auth[0]));
    $key = sha1($user->username . $user->password . $_SERVER['REMOTE_ADDR']);
    if($key == $auth[1]){
        $_SESSION['Auth'] = (array)$user;
        setcookie('auth', $user->id . '-----' . $key, time() + 3600 * 24 * 3, '/', 'localhost', false, true);
    }else{
        setcookie('auth', '', time() - 3600, '/', 'localhost', false, true);
    }
}
?>


Fichier login.php
<?php
require 'conf.php';
$error = false;
if (!empty($_POST)) {
    $user = $db->row('SELECT id, username, password FROM users WHERE username=:username AND password=:password', array(
        'username' => $_POST['username'],
        'password' => md5($_POST['password'])
    ));
    if(isset($_POST['remember'])){
        setcookie('auth', $user->id . '-----' . sha1($user->username . $user->password . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 3, '/', 'localhost', false, true);
    }
    if($user){
        $_SESSION['Auth'] = (array)$user;
        header('Location:index.php');
    }else{
        $error = true;
    }
}

require 'header.php';
?>

<form method="post" action="login.php">
    <fieldset>
        <legend>Se connecter</legend>
        <?php if ($error): ?>
            <div class="alert alert-error">
                Identifiants Incorrects
            </div>
        <?php endif ?>
        <input type="text" name="username" placeholder="Identifiant">
        <input type="password" name="password" placeholder="Mot de passe">
        <label class="checkbox">
            <input type="checkbox" name="remember"> Se souvenir de moi
        </label>
        <button type="submit" class="btn">Submit</button>
    </fieldset>
</form>

<?php require 'footer.php'; ?>


Fichier footer.php
    <div class="row">
        <div class="span6">
            <h4>Contenu de la session $_SESSION</h4>
            <?= var_dump($_SESSION); ?>
        </div>
        <div class="span6">
            <h4>Contenu du COOKIE $_COOKIE</h4>
            <?= var_dump($_COOKIE); ?>
        </div>
    </div>

    </div>

  </body>
</html>


Fichier header.php
<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Bootstrap, from Twitter</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="description" content="">
        <meta name="author" content="">

        <!-- Le styles -->
        <link href="css/bootstrap.css" rel="stylesheet">
        <style>
            body {
                padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */
            }
        </style>
        <link href="../assets/css/bootstrap-responsive.css" rel="stylesheet">

        <!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
        <!--[if lt IE 9]>
            <script src="../assets/js/html5shiv.js"></script>
        <![endif]-->

    </head>

    <body>

        <div class="navbar navbar-inverse navbar-fixed-top">
            <div class="navbar-inner">
                <div class="container">
                    <a class="brand" href="#">Tutoriel</a>
                    <ul class="nav pull-right">
                        <?php if (isset($_SESSION['Auth']['id'])): ?>
                            <li><a href="#">Mon compte</a></li>
                            <li><a href="logout.php">Se déconnecter</a></li>
                        <?php else: ?>
                            <li><a href="login.php">Se connecter</a></li>
                        <?php endif ?>
                    </ul>
                </div>
            </div>
        </div>

        <div class="container">


Fichier index.php
<?php
require 'conf.php';
require 'header.php';
?>

<h1>Bienvenue sur le site</h1>

<?php require 'footer.php'; ?>


Fichier logout.php
<?php
require('conf.php');
session_destroy();
setcookie('auth', '', time() - 3600, '/', 'localhost', false, true);
header('Location:login.php');

//codes de ma création: 
foreach ($_SESSION['Auth'] as $array)
{
	echo '<h4>'.$array.'</h4>';
	$_SESSION['x']=$array;
	header('Location:jeux.php');
	exit();
}
?>


Fichier connexion.php
<?php
try 
{
  $connection = new PDO("mysql:host=localhost;dbname=persistente; charset=utf8", 'root', '', 
  array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));  
} 
catch ( Exception $e ) 
{
  echo "Connection à MySQL impossible : ", $e->getMessage();
  die();
}

?>


Fichier jeux.php:
<?php
session_start();
echo $_SESSION['x'];
?>


Et enfin, une partie d'un fichier pour l'enregistrement en base de données register.php
include 'connexion.php';//On se connecte à MySQL
											$password = md5($password); // password est crypté en md5 																		
											$query = $connection->prepare('INSERT INTO users (username,password,mail) VALUES(:username,:password,:mail)');
											$query->execute(array(
											'username' => $_POST['username'],
											'password' => $password,
											'mail' => $mail));	


Eventuellement pour ceux à qui cela intéresse je tiens à disposition le fichier css bootstrap.css trop volumineux pour ne pas parasiter le sujet ici présent.

Conclusion:
Le site auquel je souhaiterai l'utilisation des cookies représenté simplement ici par le fichier jeux.php ne contient que l'id de l'utilisateur.(Dans jeux.php echo retourne le chiffre 1 comme faisant partie du pseudo de la première ligne du tableau $array.)
Alors qu'il me faudrait au moins son pseudo et mot de passe pour qu'il soit reconnu et qu'il n'ait plus à se connecter.
L' id bien qu'unique pour un utilisateur donné ne me convient pas vraiment pour adapter celui ci à mon site de jeux.
Je pense qu'une solution plus simple à cette adaptation sur mon site pourrait sans doute être mise en eouvre concernant la pratique des cookies.
C'est donc le sujet de ma demande.

Merci d'avance pour votre aide et de celles que j'ai déjà reçu sur ce forum afin que les joueurs de mon site puisse en profiter.

(Veuillez excuser l'auteur de ces fichiers pour les "exit();" manquant après les "header('Location:xxxxx.php');"
Afficher la suite 

Votre réponse

13 réponses

jordane45 21169 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 26 janv. 2018 à 10:53
0
Utile
Bonjour,


Le site auquel je souhaiterai l'utilisation des cookies représenté simplement ici par le fichier jeux.php ne contient que l'id de l'utilisateur.(Dans jeux.php echo retourne le chiffre 1 comme faisant partie du pseudo de la première ligne du tableau $array.)
Alors qu'il me faudrait au moins son pseudo et mot de passe pour qu'il soit reconnu et qu'il n'ait plus à se connecter.

Si tu as l'ID ... il t'es alors possible de récupérer les infos le concernant en BDD .... tu as donc tout ce qu'il te faut.

Commenter la réponse de jordane45
Max747 29 Messages postés vendredi 11 juillet 2014Date d'inscription 23 mars 2018 Dernière intervention - 27 janv. 2018 à 18:08
0
Utile
Bonjour,
Je pensais avoir trouvé l'ID se trouvant dans le cookie, mais en fait je crois que je me suis trompé.
J'ai trouvé une solution toute simple.Mais c'était trop facile pour fonctionner.
La voici pour trouver l'utilisateur (username) dans le cookie:
<?php
require 'conf.php';
require 'header.php';
echo 'Bonjour ' . htmlspecialchars($_COOKIE["username"]) . '!';
?>

<h1>Bienvenue sur le site</h1>

<?php require 'footer.php'; 

Pareil avec l' id.
Et voici le message d'erreur retourné:


Le problème se produit lorsque j'ouvre le navigateur après l'avoir fermé.
Sinon les SESSIONs fonctionnent tant que le navigateur est ouvert bien entendu.
D'où l'inutilité des cookies dans ce cas.
jordane45 21169 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 27 janv. 2018 à 19:36
Visiblement.. dans ton cookie tu dispose de l'ID
(dans la variable AUTH )
Il te suffit donc de faire une requête dans ta bdd pour récupérer les infos du users...
SELECT  username FROM users 
WHERE id = :id


Au passage... tu as oublié de mettre l'exécution de ta requête dans un try/catch...
Tu dois modifier ta fonction query comme ceci:
public function query($sql, $data = array()){
    try{
        $req =$this->db->prepare($sql);
        $req->execute($data);
        return $req->fetchAll(PDO::FETCH_OBJ);
     }catch(Exception $e){
       echo " Erreur ! " .$e->getMessage();
       exit();
     }
 }
Commenter la réponse de Max747
Max747 29 Messages postés vendredi 11 juillet 2014Date d'inscription 23 mars 2018 Dernière intervention - 28 janv. 2018 à 11:24
0
Utile
Bonjour,

Ok. J'avais omis de modifié la fonction "query".
C'est fait désormais.

Ensuite j'ai réalisé cette requête dans le fichier index.php:
<?php
require 'conf.php';
require 'header.php';
require 'connexion.php';
$username = $_SESSION['username'];
//Voir présence d'username:	
echo $username;
echo "</br>";
if (isset ($username)){
	echo "La variable username est présente.";
}else{
	echo "La variable username est absente.";
}
echo "</br>";	
$errMsg = NULL;
//préparation de la requête et de ses variables		
$sql = "SELECT username FROM users WHERE id = :id";
$datas = array( ':username' => $username);
//traitement de la requete
try{
  $user = $connection->prepare($sql); 
  $user->execute($datas);
  $result = $user->fetch(PDO::FETCH_ASSOC); // on récupère la première ligne de résultat
}catch(Exception $e){
  $errMsg[] = "Erreur dans la requete ".$sql . " => " . $e->getMessage();
  $error = true;
}
require 'footer.php';
?>


Mais comme l'indique le message d'erreur que voici, la variable username est toujours absente lorsque je ferme le navigateur pour l'ouvrir ensuite.


Sans doute n' ais je pas fait exactement ce que tu m'avais conseillé de faire?
Dans ce cas, j'aurai besoin d'autres précisions plus détaillées, si tu veux bien, pour aboutir à l'utilisation et la mise en oeuvre des cookies.
Commenter la réponse de Max747
jordane45 21169 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 28 janv. 2018 à 11:42
0
Utile
Oulalalaaa...

Déjà.. tu as une fonction "query" ... pourquoi ne pas l'utiliser ?

Ensuite... la récupération "propre" des variables...ça serait bien.
A lire ici : http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Ensuite.... ta requête a besoin de la variable ID
Cette variable est contenu dans ta variable COOKIE ....
A quel moment l'as tu récupéré dans le code que tu nous montres ??


Commenter la réponse de jordane45
Max747 29 Messages postés vendredi 11 juillet 2014Date d'inscription 23 mars 2018 Dernière intervention - 28 janv. 2018 à 12:40
0
Utile
Justement tout le problème est pour moi d'extraire la variable ID de $_COOKIE['auth']
Je ne sais pas le faire même en cherchant.

J'utilise toujours prépare en sachant que c'est sécuritif.
Alors c'est devenu une habitude qui fait que je ne pense plus à query.

Pour la récupération propre des variable se serait bien en effet.
Mais avant cela je dois résoudre le problème de l'extraction de l'ID du cookie.

Merci de bien vouloir m'aider.
Commenter la réponse de Max747
jordane45 21169 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - Modifié par jordane45 le 28/01/2018 à 13:06
0
Utile

J'utilise toujours prépare en sachant que c'est sécuritif.
Alors c'est devenu une habitude qui fait que je ne pense plus à query

Quand je parle de "query" ... je parle de TA FONCTION "query" (celle à laquelle je t'ai fait ajouté le TRY CATCH


e problème est pour moi d'extraire la variable ID de $_COOKIE['auth']

Tu as créé ton cookie avec ce code :
setcookie('auth', $user->id . '-----' . sha1($user->username . $user->password . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 3, '/', 'localhost', false, true);

Il te suffit donc de lire le contenu de 'auth' puis de spliter la chaine en utilisant le séparateur '-----'

Va donc voir la fonction :
http://php.net/manual/fr/function.explode.php


Pour la récupération propre des variable se serait bien en effet.

C'est plus que "bien" ... c'est NÉCESSAIRE !
Ça évite un grand nombre d'erreur et ça facilite l'écriture et la maintenance du code.



Merci de bien vouloir m'aider.

C'est ce que je fait.
jordane45 21169 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 28 janv. 2018 à 13:08
NB1 : Au passage... c'est une grosse faille de sécurité de stocker le password dans les variables de session ou de cookie.

NB2 : On n'utilise plus le SHA1 ni le MD5 pour l'encodage des password....
Désormais on utilise la fonction password_verify.
http://php.net/manual/fr/function.password-verify.php et donc, pour encoder le password : http://php.net/manual/fr/function.password-hash.php
Commenter la réponse de jordane45
Max747 29 Messages postés vendredi 11 juillet 2014Date d'inscription 23 mars 2018 Dernière intervention - 28 janv. 2018 à 13:49
0
Utile
Voici mon code qui n' a pas beaucoup évolué je dois dire:
<?php
require 'conf.php';
require 'header.php';
require 'connexion.php';
$username = $_SESSION['username'];
//Voir présence d'username:	
echo $username;
echo "</br>";
if (isset ($username)){
	echo "La variable username est présente.";
}else{
	echo "La variable username est absente.";
}
echo "</br>";	
$errMsg = NULL;
//préparation de la requête et de ses variables		
$sql = "SELECT username FROM users WHERE id = :id";
$datas = array( ':username' => $username);
//traitement de la requete
try{
  $user = $connection->query($sql); 
  $user->execute($datas);
  $result = $user->fetch(PDO::FETCH_ASSOC); // on récupère la première ligne de résultat
}catch(Exception $e){
  $errMsg[] = "Erreur dans la requete ".$sql . " => " . $e->getMessage();
  $error = true;
}
$pseudo=$username;
echo 'Remplacement de $username par $pseudo qui reste '.$pseudo.'. ';	
require 'footer.php';
explode ($_COOKIE['auth']);
?>


Alors restons pour l'instant sur la question de l'ID et essayons d'avancer pas à pas si tu veux bien.
D'abord la notice n'est pas assez explicative pour moi et sans doute pour beaucoup qui nous lisent ou qui nous lirons.
http://php.net/manual/fr/function.explode.php

Néanmoins je tente d'utiliser cette fonction explode qui si j'ai bien compris sert à scinder chaque variables du cookie.
Voici donc la première ligne que j'ai écrit:
explode ($_COOKIE['auth']);

Je ne pense pas que ce soit si mauvais que cela.
Mais cela me retourne quand même le message que voici:


Comment écrirais tu cela à ma place pour ne pas avoir ce message d'erreur.

Au passage aussi.
Mon site ne comporte pas une importance telle il ne soit pas nécessaire pour l'instant de ne plus utiliser le SHA1 ni le MD5 au profit de la fonction password_verify.
Néanmoins, merci pour cette information importante qui pourrait l'être pour les autres.
jordane45 21169 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 28 janv. 2018 à 20:18
Le message d'erreur... pourtant limpide... t'explique que tu as mal écrit la fonction explode et qu'il te manque un paramètre.... (un argument) lors de son appel dans ton code.

Ensuite


D'abord la notice n'est pas assez explicative pour moi et sans doute pour beaucoup qui nous lisent ou qui nous lirons

Hein ??? pas assez explicative ???

Que ne comprends tu pas dans cette simple phrase

Retourne un tableau de chaînes de caractères créées en découpant la chaîne du paramètre string en plusieurs morceaux suivant le paramètre delimiter.


As tu au moins pris le temps de regarder les exemples qui y sont donnés ???
// Exemple 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2



Le tout ... mixé avec ma réponse précédente :

Il te suffit donc de lire le contenu de 'auth' puis de spliter la chaine en utilisant le séparateur '-----'

Alors pour traduire :
"splitter" => explode
"séparateur" => delimiter

Pour finir.... tu ne tiens compte d'aucune de mes précédentes remarques concernant ton code....
Tu ne réutilises pas ta fonction query ...
Tu ne récupères toujours pas les variables AVANT de les utiliser
Donc commence par mettre un peu de rigueur dans ton travail... tu verras que ça te rendra service (et à nous aussi lorsque tu viens nous demander de l'aide)
Commenter la réponse de Max747
0
Utile
Le message d'erreur n'est pas limpide pour moi car je ne sais pas lire l'anglais.
Et je n'ai pas honte de l'écrire car je me souviens qu'autrefois un premier ministre de la France qui s'appelait Pierre Bérégovoy ne connaissait pas non plus l'anglais.
Ce qui ne l'empêchait pas d'occuper l'une des plus hautes fonctions de l'état.
La phrase que voici est également difficilement compréhensible pour moi:
"Retourne un tableau de chaînes de caractères créées en découpant la chaîne du paramètre string en plusieurs morceaux suivant le paramètre delimiter."
Trop longue pour être suffisamment explicative. C'est presque du Stendhal!
Bien sûr que j'ai pris le temps de lire les exemples.Et j'ai même appliquer celui que tu me montres.
Et si il y a des gens qui perdent leur temps à lire ce sujet, en tous cas pour certains d'entre eux ils seront bien contents de récupérer les fichiers que j'ai présenté.
Car ceux ci fonctionnent pour créer des cookies d'un bon niveau de sécurité!
Le seul problème qu'il reste à résoudre étant l'utilisation de ces foutus cookies.
Mais je sais que d'autres un peu plus compétents que moi sauront résoudre ce problème en silence sans me dire merci.
Bien sûr.
En tout cas je ne suis pas venu les "mains vides" comme on dit.
C'est ainsi qu' en remerciement je pouvais espérer une aide plus conséquente.
Si c'était à refaire, je ne pense pas que j'aurai présenté ainsi tous mes fichiers.Au vu du faible retour que j'en reçois.
Si je reviens un jour sur ce site, je pratiquerai autrement.
En attendant, il me reste à résoudre toujours ce problème d'utilisation des cookies.
Alors même si je dois en réduire la sécurité, je finirai bien par y arriver d'une manière comme d'une autre.
Salutations.
jordane45 21169 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 29 janv. 2018 à 12:35
Wouaaahhhh......
Trop longue pour être suffisamment explicative

Je te retourne le compliment .... faire un message aussi long pour ne rien dire... chapeau !

Bref..contrairement à l'époque.. aujourd'hui il existe de nombreux outils qui permettent de traduire en français des textes anglais.... et désolé si mes phrases (ou celles des notices d'utilisation ) font plus de 5 mots.


Mais comme je ne suis pas (trop) méchant... je vais te donner le code tout fait (chose qu'on ne fait pas ici !!! )
voila :
// récupération PROPRE de ta variable COOKIE  AVANT de l'utiliser
$auth = !empty($_COOKIE['auth']) ? $_COOKIE['auth'] : NULL;

//explode :
$a_auth = explode('-----',$auth);

// on extrait l'ID
$id =  !empty($a_auth) ? $a_auth[0] : NULL;





Pour finir

contents de récupérer les fichiers que j'ai présenté.
Car ceux ci fonctionnent pour créer des cookies d'un bon niveau de sécurité!

Il est clair pour tout le monde, vu ta question et ton manque de compréhension des plus basiques explications qui te sont données... que tu n'es pas l'auteur de ce code....
Alors .. dire "merci" pour ces fichiers ... désolé mais je n'en vois pas l’intérêt. Surtout qu'a peu près n'importe quel débutant serait en mesure des les écrire sans grande difficulté.
Commenter la réponse de Max747
0
Utile
Cela fonctionne désormais.
Merci pour tout.
Au revoir.

Sujet résolu.
Commenter la réponse de Max747