95 votes

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

Comment puis-je détecter sur le serveur (côté serveur) si les cookies sont désactivés dans le navigateur ? Est-ce possible ?

Explication détaillée : Je traite une requête HTTP sur le serveur. Je veux définir un cookie via la méthode Set-Cookie tête. Je dois savoir à ce moment-là si le cookie sera défini par le navigateur du client ou si ma demande de définition du cookie sera ignorée.

0 votes

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

7 votes

Détecter les cookies activés/désactivés dans le code côté serveur, oui.

0 votes

Vous voulez dire utiliser un langage dynamique au lieu de Javascript, les cookies sont toujours ajoutés au navigateur du client, donc... pas de serveur !

61voto

Lawrence Dol Points 27976

Envoyez une réponse de redirection avec le cookie défini ; lors du traitement de l'URL (spéciale) redirigée, vérifiez la présence du cookie - s'il est présent, redirigez vers le traitement normal, sinon redirigez vers un état d'erreur.

Notez que cela ne peut vous dire que le navigateur a autorisé l'installation du cookie, mais pas pour combien de temps. Mon FF me permet de forcer tous les cookies à passer en mode "session", sauf si le site est spécifiquement ajouté à une liste d'exceptions - ces cookies seront supprimés lorsque FF s'éteindra, quelle que soit l'expiration spécifiée par le serveur. Et c'est dans ce mode que je lance FF en permanence.

9 votes

À l'exception d'un certain nombre de sites, dont l'un est effectivement SO.

41voto

balexandre Points 36115

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());

Souvenez-vous de

Cela ne fonctionne que si Javascript est activé !

27 votes

La question porte sur la manière de détecter les cookies du côté du serveur. Votre code s'exécute du côté client.

2 votes

Côté serveur - Mais il n'a pas précisé quel langage serveur il utilise ! Mais l'astuce est la même... écrire un cookie et voir s'il est là... s'il l'est, Cookies Enabled, sinon.... Désactivés ;)

14 votes

La langue qu'il utilise sur le serveur n'a pas d'importance. On peut répondre à cette question en termes de demandes/réponses HTTP.

18voto

Shoban Points 18742

Je ne pense pas qu'il y ait 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.

18voto

thomasrutter Points 42905

Une façon courante de vérifier la prise en charge des cookies est de procéder à une redirection.

Il est conseillé de ne le faire que lorsque l'utilisateur tente de faire quelque chose qui déclenche une session, comme se connecter ou ajouter quelque chose à son panier. Sinon, selon la façon dont vous gérez la situation, vous risquez de bloquer 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 un retour d'information comme d'habitude. Si elles sont correctes, le serveur répond immédiatement par un cookie et une redirection vers une page conçue pour vérifier la présence de 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, la définition 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.

Je vais maintenant vous expliquer pourquoi je ne teste les cookies qu'après une action initiée par l'utilisateur et non à chaque chargement de page. J'ai vu des sites mettre en place un test de cookie sur chaque page, sans réaliser que cela va avoir des effets sur des choses comme les moteurs de recherche qui essaient d'explorer le site. En d'autres termes, si un utilisateur a activé les cookies, le cookie de test est défini une seule fois, de sorte qu'il ne doit supporter une redirection que sur la première page qu'il demande et qu'à partir de là, il n'y a plus de redirections. Cependant, pour tout navigateur ou autre agent utilisateur, comme un moteur de recherche, qui ne renvoie pas de cookies, chaque page pourrait simplement donner lieu à une redirection.

Une autre méthode pour vérifier la prise en charge des cookies est le Javascript - de cette façon, 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 de cette méthode est qu'elle s'exécute en script sur l'ordinateur de l'utilisateur. côté client - c'est-à-dire que si vous voulez toujours que le message indiquant si les cookies sont acceptés soit renvoyé au serveur, vous devez l'organiser, par exemple avec un appel Ajax.

Pour ma propre application, je mets en place une protection contre les attaques "Login CSRF", une variante des attaques CSRF, en plaçant 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 ses données de connexion. Pour en savoir plus sur le CSRF de connexion, consultez le site de Google. Un effet secondaire de cette méthode est qu'au moment où l'utilisateur se connecte, je peux vérifier l'existence de ce cookie - une redirection supplémentaire n'est pas nécessaire.

2voto

user1018130 Points 73

J'ai toujours utilisé ça :

navigator.cookieEnabled

Selon w3schools "La propriété cookieEnabled est prise en charge par 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.

0 votes

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

8 votes

Je pense que les votes négatifs sont dus au fait que la question portait spécifiquement sur la manière de détecter le support du côté serveur. C'est la meilleure façon de tester le support du côté client.

3 votes

W3Schools est apparemment pas une source crédible pour des informations sur HTML/Javascript/CSS/etc.

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