2009-02-10 15 views
88

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

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

+0

Wo? Im Browser (Client-Seite)? Oder im Server? (welcher Server) –

+1

Cookies im Server ???? – balexandre

+7

DETECT-Cookies aktiviert/deaktiviert im Server-Seitencode, ja. –

Antwort

55

Senden Sie eine Weiterleitungsantwort mit dem Cookie-Set; bei der Verarbeitung des (speziellen) umgeleiteten URL-Tests für das Cookie - wenn es dort umgeleitet wird zur normalen Verarbeitung, ansonsten auf einen Fehlerzustand umleiten.

Beachten Sie, dass dies nur sagen kann, dass der Browser das Setzen des Cookies zulässt, aber nicht für wie lange. Mein FF ermöglicht es mir, alle Cookies in den "Session" -Modus zu versetzen, es sei denn, die Site wurde speziell zu einer Ausnahmeliste hinzugefügt - solche Cookies werden verworfen, wenn FF unabhängig vom vom Server angegebenen Ablauf beendet wird. Und das ist der Modus, in dem ich immer FF betreibe.

+13

außer Stackoverflow? –

+9

Außer einer Reihe von Websites, von denen eine in der Tat SO ist. –

3

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

+0

Viele Websites tun dies. Es ist nicht möglich (auf dem Server) herauszufinden, ob Cookies auf der * ersten * Anfrage aktiviert sind, aber Sie können einen kurzen Umleitungsschritt implementieren, um es herauszufinden. –

17

Ich glaube nicht, es gibt direkte Möglichkeiten zu überprüfen. Der beste Weg ist, einen Wert im Cookie zu speichern und zu versuchen, sie zu lesen und zu entscheiden, ob Cookies aktiviert sind oder nicht.

44

Sie Javascript verwenden, um zu erreichen, dass

Library:

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 auszuführen:

alert(areCookiesEnabled()); 

Denken Sie daran,

Dies funktioniert nur, wenn Javascript aktiviert ist!

+22

Die Frage ist, wie Cookies auf der Serverseite erkannt werden. Ihr Code wird auf der Clientseite ausgeführt. – Adam

+2

Serverseite - Er hat jedoch nicht angegeben, welche Serversprache er verwendet! Aber der Trick ist der gleiche ... schreibe einen Cookie und schau ob er da ist ... wenn ja, Cookies aktiviert, wenn nicht ... Deaktiviert;) – balexandre

+14

Es ist egal welche Sprache er auf dem Server benutzt. Diese Frage kann in Form von HTTP-Anfragen beantwortet werden. – Martijn

1

Die Frage, ob Cookies "aktiviert" sind, ist zu boolesch. Mein Browser (Opera) hat eine Cookie-Einstellung pro Seite. 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, wird es da sein. Morgen wird es nicht.

Auch, da es eine Einstellung ist, können Sie ändern, sogar testen, ob Cookies bleiben nur erzählt über die Einstellung , wenn Sie getestet. Ich könnte entschieden haben, diesen einen Cookie manuell zu akzeptieren. Wenn ich weitergespammt werde, kann ich Cookies für diese Site deaktivieren (und manchmal auch).

+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 dem Cookie kommt oder nicht. Es ist nicht wichtig für mich, ob es dauerhaft oder nur Session-Only ist. –

15

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

Es ist eine gute Idee, dies nur zu tun, wenn der Benutzer versucht, etwas zu tun, das eine Sitzung initiiert, z. B. sich anmeldet oder etwas in seinen Warenkorb legt. Je nachdem, wie Sie damit umgehen, blockieren Sie möglicherweise den Zugriff auf Ihre gesamte Website für Benutzer - oder Bots -, die keine Cookies unterstützen.

Zuerst überprüft der Server die Anmeldedaten wie üblich - wenn die Anmeldedaten falsch sind, erhält der Benutzer diese Rückmeldung wie gewohnt.Wenn es richtig ist, dann antwortet der Server sofort mit einem Cookie und einer Weiterleitung zu einer Seite, die darauf ausgerichtet ist, nach diesem Cookie zu suchen - der nur die gleiche URL sein kann, aber mit einem Flag, das der Abfragezeichenfolge hinzugefügt wird. Wenn diese zweite Seite den Cookie nicht empfängt, erhält der Benutzer eine Nachricht, dass er sich nicht anmelden kann, da Cookies in seinem Browser deaktiviert sind.

Wenn Sie das Post-Redirect-Get-Muster für Ihr Anmeldeformular bereits befolgen, fügt diese Einstellung und Prüfung des Cookies keine zusätzlichen Anforderungen hinzu - der Cookie kann während der bestehenden Weiterleitung gesetzt und von geprüft werden das Ziel, das nach der Weiterleitung geladen wird.

Jetzt für, warum ich nur einen Cookie-Test nach einer Benutzer initiierten Aktion anders als auf jeder Seite laden. Ich habe gesehen, Websites implementieren einen Cookie-Test auf jeder einzelnen Seite, nicht zu erkennen, dass dies Auswirkungen auf Dinge wie Suchmaschinen Crawlen der Website haben wird. Das heißt, wenn ein Benutzer Cookies aktiviert hat, wird der Test-Cookie einmal gesetzt, so dass er nur eine Weiterleitung auf der ersten Seite ertragen muss, die er anfordert, und von da an gibt es keine Weiterleitungen mehr. Für jeden Browser oder anderen Benutzeragenten, wie eine Suchmaschine, die keine Cookies zurückgibt, kann jedoch jede einzelne Seite einfach zu einer Umleitung führen.

Eine weitere Methode, um auf Cookie-Unterstützung zu prüfen, ist Javascript - so wird keine Umleitung benötigt - Sie können ein Cookie schreiben und es virtuell sofort lesen, um zu sehen, ob es gespeichert und dann abgerufen wurde. Der Nachteil ist, dass es im Skript auf der Client-Seite läuft - dh wenn Sie immer noch die Nachricht darüber, ob Cookies unterstützt werden, um zurück zum Server zu bekommen, dann müssen Sie noch organisieren - wie mit einem Ajax-Aufruf. Für meine eigene Anwendung implementiere ich einen Schutz für "Login CSRF" -Angriffe, eine Variante von CSRF-Angriffen, indem ich einen Cookie mit einem zufälligen Token auf dem Anmeldebildschirm vor der Anmeldung des Benutzers festlege und dieses Token überprüfe, wenn der Benutzer sendet seine Anmeldedaten. Lesen Sie mehr über Login CSRF von Google. Ein Nebeneffekt davon ist, dass in dem Moment, in dem sie sich einloggen, ich auf die Existenz dieses Cookies prüfen kann - eine zusätzliche Umleitung ist nicht notwendig.

1

Wenn Sie nur, wenn Session-Cookies (Cookies, die für die Dauer der Sitzung vorhanden sind) aktiviert sind, stellen Sie Ihren Sitzungsmodus zu AutoDetect in Ihrer web.config-Datei überprüfen, dann wird der Asp.Net Rahmen schreiben ein Cookie an den Client-Browser AspxAutoDetectCookieSupport. Sie können dann in der Request.Cookies-Sammlung nach diesem Cookie suchen, um zu überprüfen, ob Sitzungscookies auf dem Client aktiviert sind.

z. in der Datei web.config Set:

<sessionState cookieless="AutoDetect" /> 

überprüfen dann, wenn Cookies auf dem Client mit aktiviert sind:

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

Nebenbei bemerkt: standardmäßig dies UseDeviceProfile eingestellt, der schreiben wird versuchen, Cookies an den Client, solange der Client unterstützt sie, auch wenn Cookies deaktiviert sind. Ich finde es etwas merkwürdig, dass dies die Standardoption ist, da es sinnlos erscheint - Sitzungen funktionieren nicht mit Cookies, die im Client-Browser mit UseDeviceProfile deaktiviert sind und wenn Sie den cookieless-Modus für Clients unterstützen, die keine Cookies unterstützen , warum nicht AutoDetect verwenden und den cookieless-Modus für Clients unterstützen, die sie deaktiviert haben ...

+1

Übernimmt ASP.NET Die ursprüngliche Frage war technologieneutral –

5

ich dies immer verwendet:

navigator.cookieEnabled 

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

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

+0

+1 von mir. Irgendein Grund für die Downvotes? Dies scheint eine vernünftige Methode zu sein, um das Blockieren von Cookies in JavaScript zu erkennen (und funktioniert für mich sowohl in Chrome als auch in IE). –

+6

Ich glaube, die Down-Stimmen sind, weil die Frage speziell gefragt, wie Support von der Server-Seite zu erkennen. Dies ist der beste Weg, den Support auf der Clientseite zu testen. –

+3

W3Schools ist anscheinend [keine glaubwürdige Quelle] (http://w3fools.com/) für HTML/Javascript/CSS/etc. Information. – BryanH

5

Normalerweise müssen Sie möglicherweise nur nach Cookie-Unterstützung suchen, nachdem der Benutzer einige Aktionen auf der Website ausgeführt hat, z. B. das Senden eines Anmeldeformulars, das Hinzufügen eines Elements zu seinem Einkaufswagen und so weiter.

Für mich ist derzeit die Überprüfung auf Cookie-Unterstützung mit CSRF (Cross-Site Request Forgery) -Prophylaxe Hand in Hand.

Sie sollten wahrscheinlich woanders hin gehen, um more about CSRF zu lesen, aber die Idee dahinter ist, dass andere Websites Ihre Benutzer oder Benutzer dazu bringen können, ein verstecktes Formular ihrer Wahl auf Ihrer eigenen Website einzureichen. Um dies festzulegen, legen Sie einen Cookie fest, wenn der Betrachter ein Formular sieht, und legen Sie ein übereinstimmendes Token als verborgenes Formularelement fest. Überprüfen Sie dann beim Verarbeiten des Formulars, ob das Cookie und das ausgeblendete Formularelement festgelegt wurden und übereinstimmen. Wenn es sich um einen versuchten CSRF-Angriff handelt, kann die Site das ausgeblendete Feld nicht dem Cookie des Benutzers zuordnen, da das Cookie des Benutzers unter derselben Richtlinie nicht gelesen werden kann.

Wenn ein Formular eingereicht wird, das keinen Cookie enthält, aber ein gültiges Token enthält, können Sie daraus schließen, dass der Benutzer Cookies deaktiviert hat, und eine Meldung ausgeben, dass der Benutzer Cookies aktivieren und Versuchen. Die andere Möglichkeit ist natürlich, dass der Benutzer Opfer eines versuchten CSRF-Angriffs ist. Wenn Sie also den Benutzer blockieren, wenn der Cookie nicht übereinstimmt, hat dies auch den Nebeneffekt, diesen Angriff zu verhindern.

1

Ich verwende eine viel vereinfachte Version von "balexandre" 's Antwort oben. Es versucht, einen Sitzungscookie festzulegen und zu lesen, um festzustellen, ob Cookies aktiviert sind. Und ja, dazu muss JavaScript aktiviert sein. Sie können also ein Tag dort haben, 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

Verwenden navigator.CookieEnabled für Cookies aktiviert (es wird wahr oder falsch zurück) und der HTML-Tag noscript. By the way navigator.cookieEnabled ist Javascript so geben Sie es nicht als HTML

+1

Die Frage bezieht sich auf serverseitige Überprüfungen, nicht auf der Clientseite. –

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()); 
-1
<?php session_start(); 
if(SID!=null){ 
    echo "Please enable cookie"; 
} 
?> 
0

Die cookieEnabled Eigenschaft gibt einen booleschen Wert ab, ob Cookies spezifiziert werden im Browser aktiviert

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

OP wollte wissen, wie man es serverseitig erkennt. – ZiggyTheHamster

Verwandte Themen