Cookies

Résolu
Max747 - 27 avril 2018 à 16:33
 Max747 - 28 avril 2018 à 08:30
Bonjour,

Ayant il y a quelques temps j'ai réussi à faire fonctionner mon site en local sous Wamp par l'utilisation de cookies, mais je viens d'avoir la désagréable surprise de voir que celui ci ne me permet pas de les utiliser sur serveur distant.
Ce site étant important en nombre de fichiers, j'ai donc repris ceux qui me sont utiles et sur lesquels je me suis occupé pour les cookies.
C'est ainsi que j'ai obtenu confirmation quand à savoir qu'en local cela fonctionne mais en en distant même avec uniquement les fichiers utilisés pour les cookies.
D'abord voici les résultats en image:
Pour le mode local qui fonctionne:

Et pour le mode sur serveur distant qui ne fonctionne pas:


J'ai donc pensé contacter un technicien de ce serveur pour tenter de lui demander des explications.
Voici ce que je lui ai demandé:
"Bonjour,
J'aimerai savoir si il existe une configuration particulière sur votre serveur pour lire les cookies?
Car mon site fonctionne en local sous Wamp, mais sur votre serveur bien que le cookie soit inscrit sur mon navigateur, il est toujours obligatoire à chaque nouvelle connexion d'y entrer les données utilisateur.

Merci d'avance pour une réponse qui pourra m'aider.
"

Et voici la réponse qui m'a été faite rapidement:
"Bonjour,
Merci d'avoir contacté XXXXX. Veuillez noter qu'il n'y a pas de configuration pour les cookies car ils sont sauvegardés sur l'ordinateur local des utilisateurs et n'ont en fait rien à voir avec nos serveurs. Pour toute question, envoyez-nous un e-mail ou contactez notre service d'aide en direct(https://www.XXXXXXXXX/chat). Nous sommes prêts à vous aider 24/7.
Bien cordialement.
"

Je dois avouer que je suis resté sur ma faim car si il n'y a pas de configurations spécifiques chez ce fournisseur, cela me renvoie à un dysfonctionnement d'un de mes scrypts si c'est bien cela.
J'ai donc revu les fichiers que voici en espérant y trouver quelque chose d'anormal, mais je n'ai rien trouvé.
Je rappelle qu'ils servent en test uniquement pour la recherche au développement mais qu'ils fonctionnent en mode local.

D'abord 1) le fichier index.php:
<?php
require 'conf.php';
require 'header.php';
require 'connexion.php';
require 'footer.php';
// récupération PROPRE de la 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;
echo "</br>";
if (!empty ($id)){
	echo "La variable ID est présente.";
}else{
	echo "La variable ID est absente.";
}
echo "</br>";
echo $id;
echo "</br>";
##############################################################################""

$requete = $connection->prepare("SELECT username FROM utilisateurs WHERE id = :id");			
$requete->bindValue(':id', $id);
            $requete->execute();
			while($row=$requete->fetch())
			{
				echo $row['username'];			
				$pseudo=$row['username'];
			}
$requete->closeCursor();		
echo "</br>";			
echo 'Remplacement de $username par $pseudo qui reste '.$pseudo.'. ';	
?>


2) con.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 * 1, '/', 'localhost', false, true);
    }else{
        setcookie('auth', '', time() - 3600, '/', 'localhost', false, true);
    }
}


3) db.class.php
<?php
class DB{

    private $host = 'localhost';
    private $username = 'root';
    private $password = '';
    /*private $host = 'XXXXXXXXX';
    private $username = 'XXXXXXX';
    private $password = 'XXXXXXX';*/
    private $database = 'jeuxechecs_fr';
    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];
    }

}


4) hearder.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="compte.php">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">


5)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>


5) login.php
<?php
require 'conf.php';
if(isset($_SESSION['Auth']['id'])) //on regarde si le cokkie éxiste
{
	header('Location:qcm.php');
	exit();
}
if (!empty($_POST))//$_POST variable contenant les infos envoyées par le formulaire. Si on clique sur le bouton 'submit' on commence à agir comme ci dessous :
{																	
	$username = htmlspecialchars(trim($_POST['username'])); // "htmlspecialchars" pour empêcher tous carractères malveillants et "trim" pour empêcher les espaces.
	$_SESSION['username']=$username;
	$repeatusername = htmlspecialchars(trim($_POST['repeatusername']));
	$password = htmlspecialchars(trim($_POST['password']));
	$_SESSION['password']=$password;
	$repeatpassword = htmlspecialchars(trim($_POST['repeatpassword']));
	$mail = htmlspecialchars(trim($_POST['mail']));
	$remail = htmlspecialchars(trim($_POST['remail']));			
		if($username&&$repeatusername&&$password&&$repeatpassword&&$mail&&$remail) // Si on a complété tous ces champs là, on continue.
			{
				if(strlen("$username")>=4)
				{
					if(strlen("$password")>=6)	
						{
							if($username==$repeatusername)
								{
									if($password==$repeatpassword)
										{
											if($mail==$remail)
											{	
												$password = md5($password); // password est crypté en md5 
												$_SESSION['password']=$password;											
												include 'connexion.php';//On se connecte à MySQL pour voir si un autre utilisateur n'est pas déjà inscrit.											
												$sth = $connection->prepare('SELECT count(*) AS nb FROM utilisateurs WHERE username=:username');
												$sth->execute(array(':username' => $username));
												$ligne = $sth->fetch(PDO::FETCH_OBJ);
												if ($ligne->nb == 0) // Si username ne se trouvent pas en base.
												{
													//$erreur= "<h3>Un joueur est déjà inscrit avec votre pseudo! Veuillez en écrire un autre différent.</h3>";										
																																																																				
													$sth-> closeCursor();												
													#####Sinon on place l'utilisateur en base#####								
													$query = $connection->prepare('INSERT INTO utilisateurs (username,password,mail) VALUES(:username,:password,:mail)');
													$query->execute(array(
													'username' => $_POST['username'],
													'password' => $password,
													'mail' => $mail));											
													$query-> closeCursor();
													
													##############Création cookies##############
													$user = $db->row('SELECT id, username, password FROM utilisateurs WHERE username=:username AND password=:password', array(
														'username' => $username,
														'password' => md5($_POST['password'])
													));												
													$_SESSION['username']=$username;
													if(isset($_POST['remember'])){
														setcookie('auth', $user->id . '-----' . sha1($user->username . $user->password . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 1, '/', 'localhost', false, true);
													}
													if($user){
														$_SESSION['Auth'] = (array)$user;
														header('Location:index.php');
														exit();
													}																								
												}else{
													echo "<h3>Un joueur est déjà inscrit avec votre pseudo! Choisissez en un autre différent.</h3>";
												}														
											}else echo	"<h3> Les adresses mails ne sont pas identiques!  Veuillez recommencer.</h3>";
										}else echo "<h3> Les mots de passe ne sont pas identiques!  Veuillez recommencer.</h3>";										
								}else echo "<h3> Les noms d'utilisateurs ne sont pas identiques! Veuillez recommencer.</h3>";									
						}else echo "<h3> le mot de passe est trop court! Veuillez recommencer.</h3>";
				}else echo "<h3> Votre nom d'utilisateur est trop court! Veuillez recommencer.</h3>";		
			}else echo "<h3>  Veuillez saisir tous les champs!<h3>";	
}			
require 'header.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css" type="text/css" charset="utf-8" />
<link rel="stylesheet" href="stylee.css" type="text/css" charset="utf-8" />
<title>Inscription</title>
</head>
<body>
<style>
body {
	background-color: #ffffcc;
}
.centrer{
	margin:auto;
}
</style>
<div class="centrer">
<form method="post" action="login.php">
    <fieldset>
        <legend><h2 align="center">Inscription.</h2></br></legend> 
		<?php//$erreur;?>
        <input type="text" name="username" placeholder="Votre pseudo">
        <input type="text" name="repeatusername" placeholder="Répéter votre pseudo"></br>
		<input type="password" name="password" placeholder="Votre mot de passe">
        <input type="password" name="repeatpassword" placeholder="Répéter votre mot de passe"></br>
		<input type="email" name="mail" placeholder="Votre E-mail">
        <input type="email" name="remail" placeholder="Répéter votre E-mail">
        <label>
			<h3 align="center">Se souvenir de moi pour ne plus me réinscrire la prochaine fois.
			<a href=""><img src="http://www.lacasagoum.com/php/images/gifs/fleches/9right.gif" alt="Flèche à droite" /></a><input type="checkbox" name="remember"></br><h3>
		</label>
        <button type="submit" class="btn">Valider</button>
		<!--<input type="submit" name="submit" value="Valider"></h3>-->
    </fieldset>
</form>
</div>
</body>
</html>

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


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


C'est ainsi que je m'adresse à vous qui pour obtenir l'aide nécessaire afin de terminer mon site au niveau des cookies.

Merci.
A voir également:

4 réponses

jordane45 Messages postés 37510 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 30 mai 2023 341
27 avril 2018 à 16:43
Bonjour,

Comme le dit le technicien... les COOKIES .. sont sur le PC de l'utilisateur et non sur le serveur web.
Le souci viendrait donc de ton code qui génère les cookies....
Par exemple :
setcookie('auth', '', time() - 3600, '/', 'localhost', false, true);


Pour rappel, la notice d'utilisation de la fonction setcookie est disponible ici http://php.net/manual/fr/function.setcookie.php
Tu lui passes, parmis les paramètres, le DOMAINE.
Qui, en local... est bien localhost .... mais une fois sur ton serveur... devrait être le DOMAINE de site web......

Comme indiqué dans la documentation pour le paramètre "domain" (voir lien ci-dessus...)

Le domaine pour lequel le cookie est disponible.

1
Bonjour Jordane 45.

Je vois que tu as toujours l'oeil . Et le bon pour débusquer les erreurs !
Moi je suis passé devant sans m'en apercevoir.
C'est bien dommage car j'y consacre pourtant beaucoup de temps!

En tout cas merci encore pour ton aide.
Je vais lire la documentation pour le paramètre "domain" et je t'indiquerai demain au plus tard ce qu'il en est.
Mais je reste confiant car de toutes façons c'est une erreur de ma part que je dois rectifier pour que cela fonctionne.
A bientôt....
0
Bonsoir Jordane45

Ca y est j'ai fini.
J'ai remplacé tous les "localhost" par le nom de domaine de mon site et cela fonctionne bien désormais.

Je te remercie pour ton aide qui fut pour moi décisive.

Bonne continuation.

Très cordialement

(Sujet déjà résolu.)
0
jordane45 Messages postés 37510 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 30 mai 2023 341
27 avril 2018 à 22:36
N'oublie pas de mettre le sujet en résolu.
(via l'icone de roue crantée qui se trouve en haut à droite de la discussion)
Bonne soirée.
0
Merci,
Justement je ne trouvai plus comment faire pour placer le sujet en résolu.
Et là je n'osai pas te le demander.Oui quand même.
Bon weekend et merci pour tout.
0