Comment détecter côté serveur si les cookies sont désactivés


91

Comment puis-je détecter sur le serveur (côté serveur) si les cookies du navigateur sont désactivés? C'est possible?

Explication détaillée: je traite une requête HTTP sur le serveur. Je souhaite définir un cookie via l'en- Set-Cookietête. J'ai besoin de savoir à ce moment-là si le cookie sera défini par le navigateur client ou si ma demande de configuration du cookie sera ignorée.


Où? Dans le navigateur (côté client)? Ou dans le serveur? (quel serveur)
Assaf Lavie

7
DÉTECTER les cookies activés / désactivés dans le code côté serveur, oui.
Assaf Lavie

vous voulez dire en utilisant un langage dynamique au lieu de Javascript, les cookies sont toujours ajoutés au navigateur client, donc ... pas de serveur!
balexandre

Réponses:


58

Envoyez une réponse de redirection avec l'ensemble de cookies; lors du traitement du test (spécial) d'URL redirigée pour le cookie - s'il y est redirigé vers le traitement normal, sinon rediriger vers un état d'erreur.

Notez que cela peut seulement vous indiquer que le navigateur a autorisé le cookie à être défini, mais pas pour combien de temps. My FF me permet de forcer tous les cookies en mode «session», à moins que le site ne soit spécifiquement ajouté à une liste d'exceptions - ces cookies seront supprimés lorsque FF s'arrêtera indépendamment de l'expiration spécifiée par le serveur. Et c'est le mode dans lequel je lance toujours FF.


14
sauf pour stackoverflow?
Simon_Weaver

9
Sauf pour un certain nombre de sites, dont l'un est en effet SO.
Lawrence Dol

43

Vous pouvez utiliser Javascript pour y parvenir

Bibliothèque:

function createCookie(name, value, days) {
    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    else expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, "", -1);
}

function areCookiesEnabled() {
    var r = false;
    createCookie("testing", "Hello", 1);
    if (readCookie("testing") != null) {
        r = true;
        eraseCookie("testing");
    }
    return r;
}

Code à exécuter:

alert(areCookiesEnabled());

Rappelles toi

Cela ne fonctionne que si Javascript est activé!


23
La question est de savoir comment détecter les cookies côté serveur. Votre code s'exécute côté client.
Adam

2
Côté serveur - Mais il n'a pas précisé la langue du serveur qu'il utilise! Mais l'astuce est la même ... écrivez un cookie et voyez s'il est là ... si c'est le cas, cookies activés, sinon ... désactivés;)
balexandre

14
Peu importe la langue qu'il utilise sur le serveur. Cette question peut être répondue en termes de requêtes / réponses HTTP.
Martijn

7
Ce code Javascript doit s'exécuter dans le navigateur pour détecter si les cookies sont activés dans le navigateur. Il ne peut pas fonctionner côté serveur.
Marquis de Lorne

4
@Adam - bien que l'OP ait posé des questions sur le côté serveur, si vous essayez d'informer l'utilisateur que le site nécessite que les cookies soient activés pour fonctionner pleinement, un test de cookie côté client peut y parvenir (en supposant que JavaScript est activé).
Chris

18

Je ne pense pas qu'il existe des moyens directs de vérifier. Le meilleur moyen est de stocker une valeur dans le cookie et d'essayer de les lire et de décider si les cookies sont activés ou non.


16

Un moyen courant de vérifier la prise en charge des cookies consiste à utiliser une redirection.

C'est une bonne idée de ne faire cela que lorsque l'utilisateur essaie de faire quelque chose qui lance une session, comme se connecter ou ajouter quelque chose à son panier. Sinon, selon la façon dont vous le gérez, vous bloquez potentiellement l'accès à l'ensemble de votre site aux utilisateurs - ou aux robots - qui ne prennent pas en charge les cookies.

Tout d'abord, le serveur vérifie les données de connexion comme d'habitude - si les données de connexion sont erronées, l'utilisateur reçoit ce retour comme d'habitude. Si c'est vrai, le serveur répond immédiatement avec un cookie et une redirection vers une page conçue pour vérifier ce cookie - qui peut être simplement la même URL mais avec un indicateur ajouté à la chaîne de requête. Si cette deuxième page ne reçoit pas le cookie, l'utilisateur reçoit un message indiquant qu'il ne peut pas se connecter car les cookies sont désactivés sur son navigateur.

Si vous suivez déjà le modèle Post-Redirect-Get pour votre formulaire de connexion, alors ce paramètre et la vérification du cookie n'ajoutent aucune demande supplémentaire - le cookie peut être défini pendant la redirection existante et vérifié par la destination qui se charge après la redirection.

Maintenant, pourquoi je ne fais un test de cookie qu'après une action initiée par l'utilisateur autre qu'à chaque chargement de page. J'ai vu des sites mettre en œuvre un test de cookie sur chaque page, sans me rendre compte que cela allait avoir des effets sur des choses comme les moteurs de recherche essayant d'explorer le site. Autrement dit, si un utilisateur a activé les cookies, le cookie de test est défini une fois, de sorte qu'il ne doit subir une redirection que sur la première page qu'il demande et à partir de là, il n'y a pas de redirection. Cependant, pour tout navigateur ou autre agent utilisateur, comme un moteur de recherche, qui ne renvoie pas de cookies, chaque page peut simplement entraîner une redirection.

Une autre méthode de vérification de la prise en charge des cookies est avec Javascript - de cette manière, aucune redirection n'est nécessairement nécessaire - vous pouvez écrire un cookie et le relire pratiquement immédiatement pour voir s'il a été stocké puis récupéré. L'inconvénient est que cela fonctionne en script côté client - c'est-à-dire que si vous voulez toujours que le message indiquant si les cookies sont pris en charge pour revenir au serveur, vous devez toujours organiser cela - comme avec un appel Ajax.

Pour ma propre application, j'implémente une protection contre les attaques `` Login CSRF '', une variante des attaques CSRF, en définissant un cookie contenant un jeton aléatoire sur l'écran de connexion avant que l'utilisateur ne se connecte, et en vérifiant ce jeton lorsque l'utilisateur soumet son login détails. En savoir plus sur la connexion CSRF de Google. Un effet secondaire de ceci est que dès qu'ils se connectent, je peux vérifier l'existence de ce cookie - une redirection supplémentaire n'est pas nécessaire.


5

Habituellement, vous n'aurez besoin de vérifier la prise en charge des cookies qu'après que l'utilisateur a effectué une action sur le site, comme la soumission d'un formulaire de connexion, l'ajout d'un article à son panier, etc.

Pour moi actuellement, la vérification de la prise en charge des cookies va de pair avec la prévention CSRF (Cross-Site Request Forgery).

Vous devriez probablement aller ailleurs pour en savoir plus sur CSRF , mais l'idée derrière cela est que d'autres sites peuvent inciter vos utilisateurs à soumettre une forme cachée de leur choix à votre propre site. La solution consiste à définir un cookie lorsque le spectateur voit un formulaire et à définir un jeton correspondant en tant qu'élément de formulaire masqué, puis lors du traitement du formulaire, à vérifier que le cookie et l'élément de formulaire masqué ont été définis et correspondent. S'il s'agit d'une tentative d'attaque CSRF, le site ne sera pas en mesure de fournir le champ masqué correspondant au cookie de l'utilisateur, car le cookie de l'utilisateur ne sera pas lisible pour eux dans le cadre de la politique de même origine.

Si un formulaire est soumis sans cookie, mais qu'il contient un jeton d'apparence valide, vous pouvez en conclure que l'utilisateur a désactivé les cookies et afficher un message indiquant que l'utilisateur doit activer les cookies et réessayer. L'autre possibilité, bien sûr, est que l'utilisateur soit victime d'une tentative d'attaque CSRF. Ainsi, bloquer l'utilisateur lorsque le cookie ne correspond pas aura également pour effet secondaire d'empêcher cette attaque.


4

J'ai toujours utilisé ceci:

navigator.cookieEnabled

Selon w3schools "La propriété cookieEnabled est prise en charge dans tous les principaux navigateurs.".

Cependant, cela fonctionne pour moi lorsque j'utilise des formulaires, où je peux demander au navigateur d'envoyer les informations supplémentaires.


+1 de moi. Une raison pour les votes négatifs? Cela semble être un moyen raisonnable de détecter le blocage des cookies dans JavaScript (et fonctionne à la fois dans Chrome et IE pour moi).
Milan Gardian

6
Je pense que les votes négatifs sont dus au fait que la question était spécifiquement posée sur la façon de détecter le support du côté serveur. C'est la meilleure façon de tester le support côté client.
TJ VanToll

3
W3Schools n'est apparemment pas une source crédible pour HTML / Javascript / CSS / etc. information.
BryanH

5
Cela ne teste que si le navigateur le prend en charge. Il ne teste pas s'il est activé. Pratiquement tous les navigateurs le prennent en charge, cela semble donc sans valeur. Désolé.
StuckOnSimpleThings

3

Essayez de stocker quelque chose dans un cookie, puis lisez-le. Si vous n'obtenez pas ce que vous attendez, les cookies sont probablement désactivés.


De nombreux sites Web le font. Il n'est pas possible (sur le serveur) de déterminer si les cookies sont activés lors de la première requête, mais vous pouvez implémenter une courte étape de redirection pour le comprendre.
Tom Lianza

2

vérifiez ce code, cela vous aidera.

<?php
session_start();

function visitor_is_enable_cookie() {
    $cn = 'cookie_is_enabled';
    if (isset($_COOKIE[$cn]))
        return true;
    elseif (isset($_SESSION[$cn]) && $_SESSION[$cn] === false)
        return false;

    // saving cookie ... and after it we have to redirect to get this
    setcookie($cn, '1');
    // redirect to get the cookie
    if(!isset($_GET['nocookie']))
        header("location: ".$_SERVER['REQUEST_URI'].'?nocookie') ;

    // cookie isn't availble
    $_SESSION[$cn] = false;
    return false;
}

var_dump(visitor_is_enable_cookie());

1

La question de savoir si les cookies sont «activés» est trop booléenne. Mon navigateur (Opera) a un paramètre de cookie par site. De plus, ce paramètre n'est pas oui / non. La forme la plus utile est en fait "session uniquement", ignorant la date d'expiration des serveurs. Si vous le testez directement après le réglage, il sera là. Demain, ce ne sera pas le cas.

De plus, comme il s'agit d'un paramètre que vous pouvez modifier, même le fait de tester si les cookies restent ne vous informe que du paramètre lorsque vous avez testé . J'aurais peut-être décidé d'accepter ce cookie, manuellement. Si je continue à être spammé, je peux (et je le ferai parfois) simplement désactiver les cookies pour ce site.


3
Bon point, mais j'ai juste besoin de savoir si mon en-tête Set-Cookie entraînera la prochaine demande du même client avec ce cookie ou non. Ce n'est pas important pour moi si c'est permanent ou juste une session uniquement.
Alexander Yanovets

1

Si vous souhaitez uniquement vérifier si les cookies de session (cookies qui existent pour la durée de vie de la session) sont activés, définissez votre mode de session sur AutoDetect dans votre fichier web.config, puis le framework Asp.Net écrira un cookie dans le navigateur client appelé AspxAutoDetectCookieSupport . Vous pouvez ensuite rechercher ce cookie dans la collection Request.Cookies pour vérifier si les cookies de session sont activés sur le client.

Par exemple, dans votre ensemble de fichiers web.config:

<sessionState cookieless="AutoDetect" />

Vérifiez ensuite si les cookies sont activés sur le client avec:

if (Request.Cookies["AspxAutoDetectCookieSupport"] != null)  { ... }

Remarque: par défaut, il est défini sur UseDeviceProfile, qui tentera d'écrire des cookies sur le client tant que le client les prend en charge , même si les cookies sont désactivés. Je trouve un peu étrange que ce soit l'option par défaut car cela semble en quelque sorte inutile - les sessions ne fonctionneront pas avec les cookies désactivés dans le navigateur client avec le paramètre UseDeviceProfile, et si vous prenez en charge le mode sans cookie pour les clients qui ne prennent pas en charge les cookies , alors pourquoi ne pas utiliser AutoDetect et prendre en charge le mode sans cookie pour les clients qui les ont désactivés ...


1
Suppose ASP.NET La question initiale était technologiquement neutre
David Moorhouse

1

J'utilise une version beaucoup plus simplifiée de la réponse de "balexandre" ci-dessus. Il essaie de définir et de lire un cookie de session dans le seul but de déterminer si les cookies sont activés. Et oui, cela nécessite également que JavaScript soit activé. Vous voudrez peut-être une étiquette là-dedans si vous voulez en avoir une.

<script>
// Cookie detection
document.cookie = "testing=cookies_enabled; path=/";
if(document.cookie.indexOf("testing=cookies_enabled") < 0)
{
    // however you want to handle if cookies are disabled
    alert("Cookies disabled");
}
</script>
<noscript>
    <!-- However you like handling your no JavaScript message -->
    <h1>This site requires JavaScript.</h1>
</noscript>

1

NodeJS - Côté serveur - Intergiciel de redirection de vérification des cookies - Session express / Analyseur de cookies

Dépendances

var express = require('express'),
    cookieParser = require('cookie-parser'),
    expressSession = require('express-session')

Middleware

return (req, res, next) => {
  if(req.query.cookie && req.cookies.cookies_enabled)
    return res.redirect('https://yourdomain.io' + req.path)
  if(typeof(req.cookies.cookies_enabled) === 'undefined' && typeof(req.query.cookie) === 'undefined') {
    return res.cookie('cookies_enabled', true, {
      path: '/',
      domain: '.yourdomain.io',
      maxAge: 900000, 
      httpOnly: true,
      secure: process.env.NODE_ENV ? true : false
    }).redirect(req.url + '?cookie=1')
  }
  if(typeof(req.cookies.cookies_enabled) === 'undefined') {
    var target_page = 'https://yourdomain.io' + (req.url ? req.url : '')
    res.send('You must enable cookies to view this site.<br/>Once enabled, click <a href="' + target_page + '">here</a>.')
    res.end()
    return
  }
  next()
}

0

La cookieEnabledpropriété renvoie une valeur booléenne qui spécifie si les cookies sont activés ou non dans le navigateur

<script>
if (navigator.cookieEnabled) {
    // Cookies are enabled
}
else {
    // Cookies are disabled
}
</script>

OP voulait savoir comment le détecter côté serveur.
ZiggyTheHamster

De toute évidence, vous devrez renvoyer ces informations sur le serveur d'une manière adaptée à votre application. Il doit être clair qu'il est impossible de déterminer si un navigateur a activé les cookies sans interagir avec le navigateur.
Steve

-1

Utilisez navigator.CookieEnabled pour les cookies activés (il retournera vrai ou faux) et la balise Html noscript. Au fait, navigator.cookieEnabled est javascript, alors ne le tapez pas au format HTML


1
La question concerne les contrôles côté serveur et non côté client.
Evan M

-1
<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.