Lire avec PHP un cookie créé en JavaScript

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Lire avec PHP un cookie créé en JavaScript

par Cyrano » 02 mai 2007, 15:21

Petit ajout : je viens de retomber sur le même problème coté JavaScript et devant pouvoir utiliser des url commençant par "localhost" au lieu d'une IP, j'ai fini par trouver comment faire : les paramètres DOMAIN et PATH sont deux éléments intimement liés.

Pour pouvoir utiliser localhost en JavaScript, configurer:
- domain = null;
- path = "/nom_repertoire";

Par exemple, pour tester un système de cookie dans un développement situé à la racine de mon serveur sur C:/www/mon_projet, ça donnera :
- domain = null;
- path = "/mon_projet";
Et dans ce cas, toutes les pages contenues dans ce répertoire pourront accéder au cookie en question.

Bon dev.

par titerm » 19 avr. 2007, 11:16

J'ai bien fais d'aller prendre une café alors :)

C'est ce que j'avais appeler alias, j'aurai du etre plus précis, je parlais d'alias au sens IP...
c'est confusant avec les alias apache surtout apres avoir parlé de vhost juste avant :/

par Cyrano » 19 avr. 2007, 10:13

Ton observation m'a mis sur la voie titerm : en fait, le problème venait de ce que j'affichais l'url http://localhost/... au lieu de http://127.0.0.1/... et du coup ça ne fonctionnait pas.

Problème résolu, merci les copains :)

par Cyrano » 19 avr. 2007, 10:11

Juste une question, la page qui cherche a lire le cookie se trouve bien sur ton serveur dans
http://127.0.0.1/CodesDivers/maPageQuiLitLeCookie.php ??

Tu tulises bien 127.0.0.1 et pas un vhost ou un alias ?
Absolument : les deux pages sont dans le même répertoire et je travaille sur 127.0.0.1 et non sur un vhost.

Je ferai éventuellement un test sur le serveur de développement qui est sous Linux, mais je doute que ça change quoique ce soit...

par titerm » 19 avr. 2007, 10:03

J'ai exactement le meme code pour le setCookie :)...
c'est éprouvé et ca marche...

Juste une question, la page qui cherche a lire le cookie se trouve bien sur ton serveur dans
http://127.0.0.1/CodesDivers/maPageQuiLitLeCookie.php ??

Tu tulises bien 127.0.0.1 et pas un vhost ou un alias ?

par Cyrano » 19 avr. 2007, 09:43

Ok, alors voici le code du cookie. Il s'agit à la base d'un panier persistant (pour aider à la compréhension), mais en fin de compte, on se fout du contenu :
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Cookie</title>
</head>

<body>
<script type="text/javascript">
/* <![CDATA[ */
function cookiePanier()
{
    // attributs.
    this.enabled    = false;

    // méthodes.
    this.Set        = setCookie;
    this.Get        = getCookie;
    this.Del        = delCookie;
    this.DelAll     = delAllCookies;
}
function getCookieVal(offset)
{
    var endstr = document.cookie.indexOf (";", offset);
    if (endstr == -1)
    {
        endstr = document.cookie.length;
    }
    return unescape(document.cookie.substring(offset, endstr));
}
function GetCookie (name)
{
    var arg  = name +"=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i<clen)
    {
        var j = i + alen;
        if (document.cookie.substring(i, j) == arg)
        {
            return getCookieVal (j);
        }
        i = document.cookie.indexOf(" ",i) + 1;
        if (i == 0)
        {
            break;
        }
    }
    return null;
}
function SetCookie (name, value)
{
    // un cookie a besoin d'un nom, d'une valeur, d'un nom de domaine, d'une date d'expiration
    //
    var argv    = SetCookie.arguments;
    var argc    = SetCookie.arguments.length;
    var expires = (argc > 2) ? argv[2] : null;
    var path    = (argc > 3) ? argv[3] : null;
    var domain  = (argc > 4) ? argv[4] : '127.0.0.1';
    var secure  = (argc > 5) ? argv[5] : false;
    document.cookie = name +"="+ escape(value)+
                    ((expires == null) ? ""         : ("; expires="+ expires.toGMTString()))+
                    ((path    == null) ? ""         : ("; path="+ path))+
                    ((domain  == null) ? ""         : ("; domain="+ domain))+
                    ((secure  == true) ? "; secure" : "");
}

function DeleteCookie (nom)
{
    var exp = new Date();
    alert('Timestamp actuel : '+ exp);
    exp.setTime (exp.getTime() - 10000000);
    alert('Validité modifiée : '+ exp);
    var cval = GetCookie (nom);
    document.cookie = nom +"="+ cval +"; expires="+ exp.toGMTString();
}

function Set(nom, valeur, jours)
{
    var date_exp = new Date();
    date_exp.setTime(date_exp.getTime() + (jours * 24 * 3600 * 1000));
    alert(valeur);
    SetCookie(nom, valeur, date_exp);
}

function Get(nom)
{
    alert("Cookie stocké :\nNom : cookie;\nValeur : "+ this.GetCookie(nom));
}
function Bye(nom)
{
    SetCookie(nom, "Le panier est vide.");
    DeleteCookie(nom);
    alert("cookie supprimé.");
}
/* ]]> */
</script>
<form id="testcookie" method="post" action="./">
  <fieldset>
    <input type="hidden" value="a%3A1%3A%7Bi%3A0%3Ba%3A4%3A%7Bi%3A0%3Bs%3A5%3A%2200001%22%3Bi%3A1%3Bs%3A68%3A%22TAILLEFINE%7CFiz%7CBoisson%20gazeuse%20rafra%EEchissante%20aux%20agrumes%20PRIX%20CHOC%22%3Bi%3A2%3Bs%3A1%3A%221%22%3Bi%3A3%3Bs%3A4%3A%224.15%22%3B%7D%7D" name="panier" id="panier" />
    <input type="button" value="Stocker un cookie" onclick="Set('paniertest', unescape(document.getElementById('panier').value), 365);" />
    <input type="button" value="Voir le cookie" onclick="Get('panier');" />
    <input type="button" value="Supprimer" onclick="Bye('panier');" />
  </fieldset>
</form>
</body>
</html>
Le contenu est envoyé en dur. Le résultat donne ceci :

Code : Tout sélectionner

Nom : paniertest Contenu : a%3A1%3A%7Bi%3A0%3Ba%3A4%3A%7Bi%3A0%3Bs%3A5%3A%2200001%22%3Bi%3A1%3Bs%3A68%3A%22TAILLEFINE%7CFiz%7CBoisson%20gazeuse%20rafra%EEchissante%20aux%20agrumes%20PRIX%20CHOC%22%3Bi%3A2%3Bs%3A1%3A%221%22%3Bi%3A3%3Bs%3A4%3A%224.15%22%3B%7D%7D Hôte : 127.0.0.1 Chemin : /CodesDivers/ Envoi pour : Tout type de connexion Expire : vendredi 18 avril 2008 09:30:00

Voici maintenant la seconde page que j'utilise pour essayer de lire le même cookie en PHP :
<?php
echo('<?xml version="1.0" encoding="iso-8859-1"?>' . "\n");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title></title>
	</head>
	<body>
<?php
if(isset($_COOKIE['paniertest']))
{
?>
    <pre>
<?php
    var_dump($_COOKIE['paniertest']);
?>
    </pre>
<?php
}
?>
	</body>
</html>
Et comme résultat, j'ai une page blanche, aussi bien sous IE que sous Firefox...

par naholyr » 19 avr. 2007, 09:32

Fais donc aussi voir le code qui créer le cookie en Javascript (même s'il est sans doute très classique, sait-on jamais) ;)

par titerm » 19 avr. 2007, 09:31

tu as regardé les entetes ? est il transmis dans la requete ?

tu peux nous dumper le contenu du cookie ( un copy paste du contenu du fichier ) ?

par Cyrano » 19 avr. 2007, 09:26

Durée de validité : 1 an.

Je le vérifie en affichant les cookies dans Firefox ou en allant voir dans le répertoire des fichiers temporaires pour IE : dans les deux cas, le cookie est bien présent.

Ce que je saisis mal, c'est pourquoi je n'arrive pas à le lire en PHP, il n'est même pas dans la liste.

Alors j'aurais une solution alternative avec Ajax pour transmettre à une variable de session deux des valeurs créées coté JavaScript, mais ça me semble un peu bricolage comme solution :-k

par zeus » 19 avr. 2007, 09:20

Comment vérifie-tu que le cookie existe ? tu regardes l'existence du fichier ?

Dans l'affirmative, vérifie que la durée de vie de ton cookie est bien supérieure à 0. Je ne suis pas sûr que JS interprète "0" comme "illimité".

De plus, est-ce que tu as essayé de ré-accéder à ce cookie en JS ?

par titerm » 19 avr. 2007, 09:19

perso, je fourni toujours 4 params et ca passe bien...

nom, valeur, expires (null pour un cookie de session) et le path (je te suggere /)

pour la valeur, n'oublie pas de faire un escape() dessus.

peut etre ton cookie est t il mal formé ? Pb sur d'expiration, essai un cookie de session sans date d'expiration)

par Cyrano » 19 avr. 2007, 09:00

Pour les besoins du test, j,ai deux fichiers situés dans un même répertoire.
- le premier crée le cookie en JavaScript. Je lance la création et après vérification, le cookie est bien présent, pas de problème.
- le second est en PHP : même si je fais une liste des cookies disponibles, celui précédemment créé est absent, même après rechargement multiple de la page.

Sais-tu si, à part le nom, certaines données sont obligatoires coté PHP ? Je pensais que l'absence de domaine coté JavaScript était la cause du problème, mais même en ajoutant cet élément, ça ne change rien...

par titerm » 19 avr. 2007, 08:51

php n'a pas a detecter les cookies, il sont transmis automatiquement par le browser... Alors si tu ne le voie pas, il y a peut etre d'autre raison...
1/ Tu le cree dans un domaine autre que celui sur lequel tu veux le lire.
2/ Tu le crée sur le meme serveur mais dans une arbo autre et distincte de la page qui va le lire ?
3/ Tu essais de le lire alors qu'il vient d'etre créé et donc n'as pas encore été trante...

- Assure toi via un quelquonque moyen (firebug ? :) ) que le cookie est bien transmis dans l'entete de la requete, si il est présent (F12, onglet net, section all, tu deplis l'appel à la page et tu regarde l'onglet header)
- Si ce n'est pas le cas, assure toi que le cookie est bien crée, dans firefox, outils/options/vie privée/afficher les cookire, tu entre le domaine et tu regarde si le cookie est la et sur quel arbo
- Assure toi de creer ton cookie sur la racine en indiquant le path /. De cette facon, il sera dispo pour les pages du site

Lire avec PHP un cookie créé en JavaScript

par Cyrano » 19 avr. 2007, 08:35

Salut tout le monde,
je me heurte à un petit problème technique de récupération.

À la base, je crée un cookie persistant en JavaScript. De ce coté là, tout fonctionne très bien et je le manipule sans difficultés. Là où ça coince, c'est que je voudrais pouvoir récupérer une partie des données en PHP, mais là, j'ai un problème de taille, PHP ne détecte même pas ce cookie. J'aimerais éviter de développer une bidouille en Ajax, si quelqu'un a une astuce à me suggérer ou une piste de solution existante en ligne, il aura ma bénédiction sur 12 générations ;)