So erkennen Sie serverseitig, ob Cookies deaktiviert sind

91

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-CookieHeader setzen. Ich muss zu diesem Zeitpunkt wissen, ob das Cookie vom Client-Browser gesetzt wird oder meine Anfrage zum Setzen des Cookies ignoriert wird.

Alexander Yanovets
quelle
Wo? Im Browser (Client-Seite)? Oder auf dem Server? (welcher Server)
Assaf Lavie
7
DETECT-Cookies im serverseitigen Code aktiviert / deaktiviert, ja.
Assaf Lavie
Sie meinen, Sie verwenden eine dynamische Sprache anstelle von Javascript. Cookies werden immer zum Client-Browser hinzugefügt, also ... kein Server!
Balexandre

Antworten:

58

Senden Sie eine Weiterleitungsantwort mit dem Cookie-Set. bei der Verarbeitung des (speziellen) umgeleiteten URL-Tests für das Cookie - wenn es dort zur normalen Verarbeitung umleitet, andernfalls zur Umleitung in einen Fehlerzustand.

Beachten Sie, dass dies nur Ihnen mitteilen kann, dass der Browser das Setzen des Cookies zugelassen hat, nicht jedoch wie lange. Mit meinem FF kann ich alle Cookies in den "Sitzungs" -Modus zwingen, es sei denn, die Site wird speziell zu einer Ausnahmeliste hinzugefügt. Solche Cookies werden verworfen, wenn FF unabhängig vom angegebenen Server-Ablauf heruntergefahren wird. Und in diesem Modus starte ich FF immer.

Lawrence Dol
quelle
14
außer für Stackoverflow?
Simon_Weaver
9
Mit Ausnahme einer Reihe von Websites, von denen eine tatsächlich SO ist.
Lawrence Dol
43

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;
}

Auszuführender Code:

alert(areCookiesEnabled());

Merken

Dies funktioniert nur, wenn Javascript aktiviert ist!

Balexandre
quelle
23
Die Frage ist, wie Cookies auf der Serverseite erkannt werden. Ihr Code wird auf der Clientseite ausgeführt.
Adam
2
Serverseite - Aber er hat nicht angegeben, welche Serversprache er verwendet! Aber der Trick ist der gleiche ... schreibe ein Cookie und
schau,
14
Es spielt keine Rolle, welche Sprache er auf dem Server verwendet. Diese Frage kann in Bezug auf HTTP-Anfragen / Antworten beantwortet werden.
Martijn
7
Dieser Javascript-Code muss im Browser ausgeführt werden, um festzustellen, ob im Browser Cookies aktiviert sind. Es kann nicht serverseitig ausgeführt werden.
Marquis von Lorne
4
@Adam - Obwohl das OP nach der Serverseite gefragt hat, kann dies durch einen clientseitigen Cookie-Test erreicht werden (vorausgesetzt, JavaScript ist aktiviert), wenn Sie versuchen, den Benutzer darüber zu informieren, dass für die Website die Aktivierung von Cookies erforderlich ist.
Chris
18

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

Shoban
quelle
16

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

Es ist eine gute Idee, dies nur zu tun, wenn der Benutzer versucht, etwas zu tun, das eine Sitzung initiiert, z. B. sich anzumelden oder etwas in den Warenkorb zu legen. Andernfalls blockieren Sie je nach Handhabung 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 gewohnt. Wenn es richtig ist, antwortet der Server sofort mit einem Cookie und einer Weiterleitung auf eine Seite, auf der nach diesem Cookie gesucht werden soll. Dies kann nur dieselbe URL sein, aber der Abfragezeichenfolge wird ein Flag hinzugefügt. Wenn diese zweite Seite das Cookie nicht erhält, erhält der Benutzer eine Nachricht, dass er sich nicht anmelden kann, weil Cookies in seinem Browser deaktiviert sind.

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

Nun, warum ich einen Cookie-Test nur nach einer vom Benutzer initiierten Aktion außer bei jedem Laden der Seite durchführe. Ich habe gesehen, dass Websites auf jeder einzelnen Seite einen Cookie-Test implementieren, ohne zu wissen, dass dies Auswirkungen auf Dinge wie Suchmaschinen haben wird, die versuchen, die Website zu crawlen. Wenn für einen Benutzer Cookies aktiviert sind, wird das Test-Cookie einmal gesetzt, sodass er nur auf der ersten angeforderten Seite eine Weiterleitung aushalten muss und von da an keine Weiterleitungen mehr vorhanden sind. Für jeden Browser oder anderen Benutzeragenten wie eine Suchmaschine, der keine Cookies zurückgibt, kann jedoch jede einzelne Seite einfach zu einer Weiterleitung führen.

Eine andere Methode zur Überprüfung der Cookie-Unterstützung ist Javascript. Auf diese Weise ist keine Weiterleitung erforderlich. Sie können ein Cookie schreiben und es praktisch sofort zurücklesen, um festzustellen, ob es gespeichert und dann abgerufen wurde. Der Nachteil dabei ist, dass es auf der Clientseite in einem Skript ausgeführt wird. Wenn Sie also weiterhin die Nachricht erhalten möchten, ob Cookies unterstützt werden, um zum Server zurückzukehren, müssen Sie dies weiterhin organisieren - beispielsweise bei einem Ajax-Aufruf.

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

thomasrutter
quelle
5

Normalerweise müssen Sie möglicherweise erst nach Cookie-Unterstützung suchen, nachdem der Benutzer auf der Website Maßnahmen ergriffen hat, z. B. das Senden eines Anmeldeformulars, das Hinzufügen eines Artikels zum Warenkorb usw.

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

Sie sollten wahrscheinlich woanders hingehen, um mehr über CSRF zu lesen , aber die Idee dahinter ist, dass andere Websites Ihre Benutzer dazu verleiten könnten, eine versteckte Form ihrer Wahl an Ihre eigene Website zu senden. Um dies zu umgehen, müssen Sie ein Cookie setzen, wenn der Betrachter ein Formular sieht, und ein übereinstimmendes Token als verstecktes Formularelement festlegen. Überprüfen Sie dann bei der Verarbeitung des Formulars, ob sowohl das Cookie als auch das versteckte Formularelement gesetzt wurden und miteinander übereinstimmen. Wenn es sich um einen versuchten CSRF-Angriff handelt, kann die Site das ausgeblendete Feld nicht bereitstellen, das mit dem Cookie des Benutzers übereinstimmt, da das Cookie des Benutzers für ihn unter derselben Richtlinie nicht lesbar ist.

Wenn ein Formular ohne Cookie gesendet wird, das 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 sollte. Die andere Möglichkeit besteht natürlich darin, dass der Benutzer Opfer eines versuchten CSRF-Angriffs wird. Das Blockieren des Benutzers, wenn das Cookie nicht übereinstimmt, hat also auch den Nebeneffekt, dass dieser Angriff verhindert wird.

thomasrutter
quelle
4

Ich habe das immer benutzt:

navigator.cookieEnabled

Laut w3schools "wird die Eigenschaft cookieEnabled in allen gängigen Browsern unterstützt."

Dies funktioniert jedoch bei mir, wenn ich Formulare verwende, bei denen ich den Browser anweisen kann, die zusätzlichen Informationen zu senden.

user1018130
quelle
+1 von mir. Irgendein Grund für die Abstimmungen? Dies scheint ein vernünftiger Weg zu sein, um das Blockieren von Cookies in JavaScript zu erkennen (und funktioniert für mich sowohl in Chrome als auch in IE).
Milan Gardian
6
Ich glaube, die Abstimmungen sind darauf zurückzuführen, dass die Frage speziell gestellt wurde, wie Support von der Serverseite erkannt werden kann. Dies ist der beste Weg, um den Support auf der Clientseite zu testen.
TJ VanToll
3
W3Schools ist anscheinend keine glaubwürdige Quelle für HTML / Javascript / CSS / etc. Information.
BryanH
5
Dies testet nur, ob der Browser dies unterstützt. Es wird nicht getestet, ob es aktiviert ist. Praktisch jeder Browser unterstützt dies, daher scheint dies ziemlich wertlos zu sein. Es tut uns leid.
StuckOnSimpleThings
3

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.

Joonas Pulakka
quelle
Viele Websites tun dies. Es ist (auf dem Server) nicht möglich herauszufinden, ob Cookies bei der ersten Anforderung aktiviert sind , aber Sie können einen kurzen Umleitungsschritt implementieren, um dies herauszufinden.
Tom Lianza
2

Ü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());
user2511210
quelle
1

Die Frage, ob Cookies "aktiviert" sind, ist zu boolesch. Mein Browser (Opera) verfügt über eine Cookie-Einstellung pro Site. Außerdem 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 dem Einstellen testen, ist es dort. Morgen wird 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, die Sie getestet haben . Ich hätte vielleicht beschlossen, diesen einen Cookie manuell zu akzeptieren. Wenn ich weiterhin Spam bekomme, kann (und werde ich manchmal) einfach Cookies für diese Site deaktivieren.

MSalters
quelle
3
Guter Punkt, aber ich muss nur wissen, ob mein Set-Cookie-Header dazu führt, dass die nächste Anfrage vom selben Client mit diesem Cookie geliefert wird oder nicht. Für mich ist es nicht wichtig, ob es permanent oder nur für Sitzungen ist.
Alexander Yanovets
1

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

ZB in Ihrem web.config-Dateisatz:

<sessionState cookieless="AutoDetect" />

Überprüfen Sie dann, ob Cookies auf dem Client aktiviert sind mit:

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

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

magritte
quelle
1
Angenommen, ASP.NET Die ursprüngliche Frage war technologieneutral
David Moorhouse
1

Ich verwende eine viel vereinfachte Version der obigen Antwort von "balexandre". Es wird versucht, ein Sitzungscookie zu setzen und zu lesen, um festzustellen, ob Cookies aktiviert sind. Und ja, dafür muss auch JavaScript aktiviert sein. Vielleicht möchten Sie dort ein Tag, wenn Sie eines 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>
Broote
quelle
1

NodeJS - Serverseite - Cookie Check Redirect Middleware - Express-Sitzung / 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()
}
decoder7283
quelle
0

Die cookieEnabledEigenschaft 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>
Zameer Khan
quelle
OP wollte wissen, wie man es serverseitig erkennt.
ZiggyTheHamster
Natürlich müssen Sie diese Informationen auf eine für Ihre Anwendung geeignete Weise an den Server zurückgeben. Es sollte klar sein, dass es unmöglich ist festzustellen, ob für einen Browser Cookies aktiviert sind, ohne mit dem Browser zu interagieren.
Steve
-1

Verwenden Sie navigator.CookieEnabled für aktivierte Cookies (es wird true oder false zurückgeben) und das HTML-Tag noscript. Übrigens ist navigator.cookieEnabled Javascript, geben Sie es also nicht als HTML ein

BürgermeisterMonty
quelle
1
Die Frage betrifft serverseitige Überprüfungen, nicht clientseitige.
Evan M
-1
<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>
user3211045
quelle