86 votes

Vérifier si les cookies sont activés

Je suis en train de travailler sur une page qui nécessite l'activation de javascript et des sessions. J'ai déjà le code pour avertir l'utilisateur si le javascript est désactivé. Maintenant, je veux gérer le cas où les cookies sont désactivés, à l'id de session est stocké dans les cookies.

J'ai pensé juste un couple des idées:

  1. L'incorporation de l'id de session dans les liens et les formulaires
  2. Avertir l'utilisateur qu'il doit activer les cookies si elles sont désactivées (aurait besoin d'aide pour détecter si les cookies sont désactivés)

Quelle est la meilleure façon d'aborder cette question? Merci

MODIFIER

Basé sur les articles, je suis venu avec ma propre approche et pensé que je voudrais partager, quelqu'un d'autre pourrait être en mesure de l'utiliser, peut-être que j'aurai un peu de critiques. (Suppose que votre session PHP magasins dans un cookie nommé PHPSESSID)

<div id="form" style="display:none">Content goes here</div>
<noscript>Sorry, but Javascript is required</noscript>
<script type="text/javascript"><!--
if(document.cookie.indexOf('PHPSESSID')!=-1)
   document.getElementById('form').style.display='';
else
   document.write('<p>Sorry, but cookies must be enabled</p>');
--></script>

101voto

Sascha Galley Points 7516

JavaScript

En JavaScript vous test simple pour le cookieEnabled de la propriété, qui est pris en charge dans tous les principaux navigateurs. Si vous faites affaire avec un navigateur plus ancien, vous pouvez définir un cookie et de vérifier s'il existe. (emprunté à Moderniste):

if (navigator.cookieEnabled) return true;

// set and read cookie
document.cookie = "cookietest=1";
var ret = document.cookie.indexOf("cookietest=") != -1;

// delete cookie
document.cookie = "cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT";

return ret;

PHP

En PHP, il est assez "compliqué" car vous devez actualiser la page ou de rediriger vers un autre script. Ici, je vais utiliser deux scripts:

somescript.php

<?php
session_start();
setcookie('foo', 'bar', time()+3600);
header("location: check.php");

check.php

<?php echo (isset($_COOKIE['foo']) && $_COOKIE['foo']=='bar') ? 'enabled' : 'disabled';

17voto

misza Points 55

Mais pour vérifier si les cookies sont activés à l'aide de la fonction isset($_COOKIE["cookies"]), vous devez actualiser. Im faire de sat façon (avec des sessions basées sur les cookies :)

session_start();
$a = session_id();
session_destroy();

session_start();
$b = session_id();
session_destroy();

if ($a == $b)
    echo"Cookies ON";
else
    echo"Cookies OFF";

11voto

Erwinus Points 1587

La réponse à une vieille question, ce nouveau message est posté sur avril, la 4e 2013

Pour compléter la réponse de @misza, voici une méthode avancée pour vérifier si les cookies sont activés sans recharger la page. Le problème avec @misza est qu'il ne pas toujours fonctionner lorsque le php ini paramètre session.use_cookies n'est pas vrai. Aussi la solution de ne pas vérifier si une session est déjà commencé.

J'ai fait cette fonction et de le tester plusieurs fois dans différentes situations et fait le travail très bien.

    function suGetClientCookiesEnabled() // Test if browser has cookies enabled
    {
      // Avoid overhead, if already tested, return it
      if( defined( 'SU_CLIENT_COOKIES_ENABLED' ))
       { return SU_CLIENT_COOKIES_ENABLED; }

      $bIni = ini_get( 'session.use_cookies' ); 
      ini_set( 'session.use_cookies', 1 ); 

      $a = session_id();
      $bWasStarted = ( is_string( $a ) && strlen( $a ));
      if( !$bWasStarted )
      {
        @session_start();
        $a = session_id();
      }

   // Make a copy of current session data
  $aSesDat = (isset( $_SESSION ))?$_SESSION:array();
   // Now we destroy the session and we lost the data but not the session id 
   // when cookies are enabled. We restore the data later. 
  @session_destroy(); 
   // Restart it
  @session_start();

   // Restore copy
  $_SESSION = $aSesDat;

   // If no cookies are enabled, the session differs from first session start
  $b = session_id();
  if( !$bWasStarted )
   { // If not was started, write data to the session container to avoid data loss
     @session_write_close(); 
   }

   // When no cookies are enabled, $a and $b are not the same
  $b = ($a === $b);
  define( 'SU_CLIENT_COOKIES_ENABLED', $b );

  if( !$bIni )
   { @ini_set( 'session.use_cookies', 0 ); }

  //echo $b?'1':'0';
  return $b;
    }

Utilisation:

if( suGetClientCookiesEnabled())
 { echo 'Cookies are enabled!'; }
else { echo 'Cookies are NOT enabled!'; }

Remarque importante: La fonction de modifier temporairement le paramètre ini de PHP quand il n'a pas le bon réglage et la restaurer quand il n'était pas activé. Ce n'est que pour tester si les cookies sont activés. Il peut aller mal lorsque vous démarrez une session et le php ini paramètre de session.use_cookies a une valeur incorrecte. Pour être sûr que la session fonctionne correctement, vérifier et/ou le jeu avant de commencer une session, par exemple:

   if( suGetClientCookiesEnabled())
     { 
       echo 'Cookies are enabled!'; 
       ini_set( 'session.use_cookies', 1 ); 
       echo 'Starting session';
       @start_session(); 

     }
    else { echo 'Cookies are NOT enabled!'; }

9voto

zibilico Points 11

Transparente, claire et simple d'approche, la vérification des cookies disponibilité avec PHP et profiter de l' AJAX transparent redirection, donc pas de déclenchement d'un rechargement de la page. Il ne nécessite pas de séances.

Code côté Client (JavaScript)

function showCookiesMessage(cookiesEnabled) {
    if (cookiesEnabled == 'true')
        alert('Cookies enabled');
    else
        alert('Cookies disabled');
}

$(document).ready(function() {
    var jqxhr = $.get('/cookiesEnabled.php');
    jqxhr.done(showCookiesMessage);
});

(JQuery AJAX appel peut être remplacé avec JavaScript et AJAX appel)

Le code côté serveur (PHP)

if (isset($_COOKIE['cookieCheck'])) {
    echo 'true';
} else {
    if (isset($_GET['reload'])) {
        echo 'false';
    } else {
        setcookie('cookieCheck', '1', time() + 60);
        header('Location: ' . $_SERVER['PHP_SELF'] . '?reload');
        exit();
    }
}

La première fois que le script est appelé, le cookie est créé et le script indique au navigateur pour rediriger vers lui-même. Le navigateur ne prend de manière transparente. Aucun rechargement de page est nécessaire, car il est fait un appel AJAX portée.

La deuxième fois, lorsqu'il est appelé par la redirection, si le cookie est reçu, le script répond HTTP 200 (avec chaîne "true"), d'où l' showCookiesMessage fonction est appelée.

Si le script est appelé pour la deuxième fois (identifié par le "rechargement" paramètre) et le cookie n'est pas reçu, il répond HTTP 200, avec de la ficelle "false" - showCookiesMessage fonction est appelée.

6voto

drfunjohn Points 31

Vous ne pouvez pas dans la même page de chargement de définir et de vérifier si les cookies est défini, vous devez effectuer recharger la page:

  • L'exécution de PHP sur le Serveur;
  • cookies au client.
  • les cookies envoyés au serveur uniquement lors du chargement d'une page.
  • Juste créé les témoins n'ont pas été envoyées au serveur encore et ne sera envoyé qu'au prochain chargement de la page.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X