wake-up-neo.com

So erkennen Sie serverseitig, ob Cookies deaktiviert sind

Wie kann ich auf dem Server (serverseitig) feststellen, ob Cookies im Browser deaktiviert sind? Ist es möglich?

Detaillierte Erklärung: Ich verarbeite eine HTTP-Anfrage auf dem Server. Ich möchte ein Cookie über den Set-Cookie-Header setzen. Ich muss zu diesem Zeitpunkt wissen, ob der Cookie vom Client-Browser gesetzt wird oder ob meine Anfrage zum Setzen des Cookies ignoriert wird.

89

Senden Sie eine Antwort mit dem Cookie-Set. bei der Verarbeitung des (speziellen) umgeleiteten URL-Tests für das Cookie - wenn es zur normalen Verarbeitung umgeleitet wird, andernfalls an einen Fehlerstatus weiterleiten.

Beachten Sie, dass Sie nur feststellen können, dass der Browser das Setzen des Cookies zugelassen hat, jedoch nicht für wie lange. Mein FF ermöglicht es mir, alle Cookies in den "Sitzungsmodus" zu erzwingen, sofern die Website nicht ausdrücklich einer Ausnahmeliste hinzugefügt wird. Solche Cookies werden verworfen, wenn FF unabhängig vom Ablaufdatum des Servers heruntergefahren wird. Und das ist der Modus, in dem ich FF immer laufe.

55
Lawrence Dol

Sie können Javascript verwenden, um dies zu erreichen

Bibliothek:

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 zum Ausführen:

alert(areCookiesEnabled());

Merken

Dies funktioniert nur, wenn Javascript aktiviert ist!

45
balexandre

Ich glaube nicht, dass es direkte Möglichkeiten gibt, dies zu überprüfen. Am besten speichern Sie einen Wert im Cookie und versuchen, sie zu lesen und zu entscheiden, ob Cookies aktiviert sind oder nicht.

18
Shoban

Eine gängige Methode zur Überprüfung der Cookie-Unterstützung ist die Weiterleitung.

Es ist eine gute Idee, dies nur dann zu tun, wenn der Benutzer versucht, etwas zu tun, das eine Sitzung initiiert, z. B. das Anmelden oder das Hinzufügen von Objekten in den Warenkorb. Andernfalls blockieren Sie, abhängig von Ihrer Vorgehensweise, möglicherweise den Zugriff auf Ihre gesamte Website für Benutzer - oder Bots -, die keine Cookies unterstützen.

Zunächst überprüft der Server die Anmeldedaten wie gewohnt - wenn die Anmeldedaten falsch sind, erhält der Benutzer diese Rückmeldung wie üblich. Wenn dies der Fall ist, antwortet der Server sofort mit einem Cookie und einer Weiterleitung zu einer Seite, die darauf abzielt, nach diesem Cookie zu suchen. Dabei kann es sich um dieselbe URL handeln, jedoch mit einer Markierung, die der Abfragezeichenfolge hinzugefügt wird. Wenn diese zweite Seite das Cookie nicht erhält, erhält der Benutzer eine Meldung, dass er sich nicht anmelden kann, da Cookies in seinem Browser deaktiviert sind.

Wenn Sie bereits das Post-Redirect-Get-Muster für Ihr Anmeldeformular verwenden, werden durch diese Einstellung und Überprüfung des Cookies keine zusätzlichen Anforderungen hinzugefügt. Das Cookie kann während der vorhandenen Weiterleitung gesetzt und vom geladenen Ziel überprüft werden nach der Weiterleitung.

Nun, warum mache ich einen Cookie-Test nur nach einer vom Benutzer eingeleiteten Aktion, anders als bei jedem Laden der Seite. Ich habe gesehen, wie Websites auf jeder einzelnen Seite einen Cookie-Test implementiert haben, ohne zu wissen, dass dies Auswirkungen auf Dinge wie Suchmaschinen haben wird, die versuchen, die Website zu crawlen. Das heißt, wenn ein Benutzer Cookies aktiviert hat, wird der Testcookie einmal gesetzt, so dass er nur eine Umleitung auf der ersten Seite durchlaufen muss, die er anfordert, und ab diesem Zeitpunkt gibt es keine Umleitungen mehr. Bei jedem Browser oder anderen Benutzeragenten, beispielsweise einer Suchmaschine, die keine Cookies zurückgibt, kann jede einzelne Seite lediglich zu einer Weiterleitung führen.

Eine weitere Methode zur Überprüfung auf Cookie-Unterstützung ist Javascript. Auf diese Weise ist keine Weiterleitung erforderlich. Sie können einen Cookie schreiben und ihn praktisch sofort zurücklesen, um zu sehen, ob er gespeichert und dann abgerufen wurde. Der Nachteil ist, dass es auf der client-Seite in einem Skript ausgeführt wird - dh, wenn Sie noch die Nachricht darüber erhalten möchten, ob Cookies unterstützt werden, um zum Server zurückzukehren, müssen Sie dies noch organisieren - beispielsweise mit Ajax Anruf.

Für meine eigene Anwendung implementiere ich einen gewissen Schutz für "Login CSRF" -Angriffe, eine Variante von CSRF-Angriffen, indem ich auf dem Anmeldebildschirm ein Cookie mit einem zufälligen Token setze, bevor der Benutzer sich anmeldet, und das Token prüft, wenn der Benutzer seinen Login übergibt Einzelheiten. Lesen Sie mehr über Login CSRF von Google. Ein Nebeneffekt ist, dass ich in dem Moment, in dem sie sich einloggen, das Vorhandensein dieses Cookies überprüfen kann - eine zusätzliche Weiterleitung ist nicht erforderlich.

16
thomasrutter

In der Regel müssen Sie möglicherweise nur nach Unterstützung für Cookies suchen, nachdem der Benutzer einige Aktionen auf der Website ausgeführt hat, z. B. das Senden eines Anmeldeformulars, das Hinzufügen eines Artikels in den Warenkorb usw.

Für mich geht die Überprüfung der Cookie-Unterstützung derzeit mit der Prävention von Cross-Site Request Forgery (CSRF) einher.

Sie sollten wahrscheinlich an einem anderen Ort nachlesen, um mehr über CSRF zu lesen, aber die Idee dahinter ist, dass andere Websites möglicherweise dazu verleitet werden oder Ihre Benutzer dazu verleiten, eine verborgene Form ihrer Wahl an Ihre eigene Site zu senden. Um dies zu umgehen, legen Sie ein Cookie fest, wenn der Betrachter ein Formular sieht, und legen Sie ein übereinstimmendes Token als ausgeblendetes Formularelement fest. Wenn Sie das Formular bearbeiten, überprüfen Sie, ob sowohl das Cookie als auch das ausgeblendete Formularelement gesetzt wurden und zueinander passen. Wenn es sich um einen CSRF-Angriff handelt, kann die Site das ausgeblendete Feld nicht entsprechend dem Cookie des Benutzers bereitstellen, da das Cookie des Benutzers unter derselben Origin-Richtlinie nicht für sie lesbar ist.

Wenn ein Formular gesendet wird, das kein Cookie enthält, jedoch ein gültig aussehendes Token enthält, können Sie daraus schließen, dass der Benutzer Cookies deaktiviert hat, und eine Meldung anzeigen, dass der Benutzer Cookies aktivieren und erneut versuchen soll. Die andere Möglichkeit ist natürlich, dass der Benutzer Opfer eines versuchten CSRF-Angriffs ist. Das Blockieren des Benutzers, wenn der Cookie nicht übereinstimmt, hat auch den Nebeneffekt, diesen Angriff zu verhindern.

5
thomasrutter

Ich habe das immer benutzt:

navigator.cookieEnabled

Gemäß w3schools "Die cookieEnabled-Eigenschaft wird in allen gängigen Browsern unterstützt.".

Dies funktioniert jedoch für mich, wenn ich Formulare verwende, in denen ich den Browser anweisen kann, die zusätzlichen Informationen zu senden.

5
user1018130

Versuchen Sie, etwas in einem Cookie zu speichern, und lesen Sie es dann. Wenn Sie nicht das bekommen, was Sie erwarten, sind Cookies wahrscheinlich deaktiviert.

3
Joonas Pulakka

Überprüfen Sie diesen Code, es wird Ihnen helfen.

<?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());
2
user2511210

Ich verwende eine viel vereinfachte Version der Antwort von "Balexandre". Es wird versucht, ein Sitzungs-Cookie festzulegen und zu lesen, um festzustellen, ob Cookies aktiviert sind. Und ja, dies setzt voraus, dass auch JavaScript aktiviert ist. Vielleicht möchten Sie dort einen Tag, wenn Sie einen haben möchten. 

<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
Broote

Die Frage, ob Cookies "aktiviert" sind, ist zu boolean. Mein Browser (Opera) hat eine Cookie-Einstellung für jede Site. Darüber hinaus ist diese Einstellung nicht Ja/Nein. Die nützlichste Form ist in der Tat "nur Sitzung", wobei das Ablaufdatum der Server ignoriert wird. Wenn Sie es direkt nach der Einstellung testen, ist es da. Morgen geht es nicht.

Da es sich um eine Einstellung handelt, die Sie ändern können, werden Sie auch beim Testen, ob Cookies verbleiben, nur über die Einstellung informiert, als Sie getestet haben. Ich habe mich vielleicht entschieden, dieses eine Cookie manuell zu akzeptieren. Wenn ich weiterhin Spam bekomme, kann ich Cookies für diese Website deaktivieren (und werde dies auch manchmal tun).

1
MSalters

Wenn Sie nur prüfen möchten, ob Sitzungscookies (Cookies, die für die Dauer der Sitzung vorhanden sind) aktiviert sind, setzen Sie Ihren Sitzungsmodus in Ihrer Datei web.config auf AutoDetect, dann schreibt das Asp.Net-Framework ein Cookie für den Client-Browser mit dem Namen AspxAutoDetectCookieSupport. Sie können dann in der Request.Cookies-Auflistung nach diesem Cookie suchen, um zu prüfen, ob auf dem Client Sitzungscookies aktiviert sind. 

Z.B. in Ihrem web.config-Dateisatz:

<sessionState cookieless="AutoDetect" />

Prüfen Sie dann, ob auf dem Client Cookies aktiviert sind:

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

Sidenote: Standardmäßig ist UseDeviceProfile gesetzt, das versucht, Cookies an den Client zu schreiben, solange der Client unterstützt diese auch dann, wenn Cookies deaktiviert sind. Ich finde es etwas seltsam, dass dies die Standardoption ist, da es irgendwie sinnlos erscheint - Sitzungen funktionieren nicht mit deaktivierten Cookies im Client-Browser, wenn sie auf UseDeviceProfile gesetzt ist und wenn Sie den cookieless-Modus für Clients unterstützen, die keine Cookies unterstützen , warum dann nicht AutoDetect verwenden und den cookieless-Modus für Clients unterstützen, bei denen sie deaktiviert sind ... 

1
magritte

NodeJS - Serverseite - Cookie Check Weiterleitung Middleware - Express Session/Cookie Parser

Abhängigkeiten

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
indospace.io

Die cookieEnabled-Eigenschaft gibt einen booleschen Wert zurück, der angibt, ob Cookies im Browser aktiviert sind oder nicht

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