Überprüfen Sie, ob Cookies aktiviert sind

76

Ich arbeite an einer Seite, die Javascript und Sitzungen erfordert. Ich habe bereits Code, um den Benutzer zu warnen, wenn Javascript deaktiviert ist. Jetzt möchte ich den Fall behandeln, in dem Cookies deaktiviert sind, da die Sitzungs-ID in Cookies gespeichert ist.

Ich habe nur an ein paar Ideen gedacht:

  1. Einbetten der Sitzungs-ID in die Links und Formulare
  2. Warnen Sie den Benutzer, dass Cookies aktiviert werden müssen, wenn sie deaktiviert sind (benötigen Sie Hilfe, um festzustellen, ob Cookies deaktiviert sind).

Was ist der beste Weg, um dies zu erreichen? Vielen Dank

BEARBEITEN

Basierend auf den verlinkten Artikeln kam ich auf meinen eigenen Ansatz und dachte, ich würde ihn teilen, jemand anderes könnte ihn vielleicht verwenden, vielleicht bekomme ich ein paar Kritiken. (Angenommen, Ihre PHP-Sitzung wird in einem Cookie mit dem Namen gespeichert. PHPSESSID)

<div id="form" style="display:none">Content goes here</div>
<noscript>Sorry, but Javascript is required</noscript>
<script type="text/javascript"><!--
if(document.cookie.indexOf('PHPSESSID')!=-1)
   document.getElementById('form').style.display='';
else
   document.write('<p>Sorry, but cookies must be enabled</p>');
--></script>
steveo225
quelle
3
Das Einbetten der Sitzungs-ID in Links ist möglich, aber unübersichtlich. Dies bedeutet, dass Sie Suchmaschinen Sitzungs-IDs präsentieren. Dies bedeutet, dass sich Personen, die Links freigeben, möglicherweise bei derselben Sitzung anmelden.
TRiG
Können Sie den Titel der Frage wie folgt aktualisieren: Überprüfen Sie, ob Cookies mit Javascript aktiviert sind?
Imme
Darum ging es in der Frage nicht, bitte lesen Sie die gesamte Frage. JavaScript ist einfach, wie die Frage beantwortet wurde.
steveo225

Antworten:

86

JavaScript

In JavaScript testen Sie einfach die Eigenschaft cookieEnabled , die in allen gängigen Browsern unterstützt wird. Wenn Sie mit einem älteren Browser arbeiten, können Sie ein Cookie setzen und prüfen, ob es vorhanden ist. (von Modernizer ausgeliehen ):

if (navigator.cookieEnabled) return true;

// set and read cookie
document.cookie = "cookietest=1";
var ret = document.cookie.indexOf("cookietest=") != -1;

// delete cookie
document.cookie = "cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT";

return ret;

PHP

In PHP ist es ziemlich "kompliziert", da Sie die Seite aktualisieren oder zu einem anderen Skript umleiten müssen. Hier werde ich zwei Skripte verwenden:

somescript.php

<?php
session_start();
setcookie('foo', 'bar', time()+3600);
header("location: check.php");

check.php

<?php echo (isset($_COOKIE['foo']) && $_COOKIE['foo']=='bar') ? 'enabled' : 'disabled';
Sascha Galeere
quelle
16
Es wäre sehr hilfreich, wenn Sie Ihre Antwort erweitern könnten, um einige der Techniken am anderen Ende dieser Links zu erläutern und die Links als Referenz aufzubewahren . Wenn Sie dies nicht tun, ist die Antwort durch Link Rot gefährdet, und diese Arten von Links sind normalerweise die Art, die plötzlich verschwinden. Vielen Dank.
Kev
1
Weiterleitung nicht erforderlich, siehe auch meine Antwort unten. Sie können überprüfen, ob Cookies aktiviert sind, ohne sie erneut zu laden.
Codebeat
Ist das Malware im zweiten Link? "PHP und Cookies, eine gute Mischung!" Warum werde ich gebeten, eine gruselige Browser-Erweiterung zu installieren?
Miguel Valencia
@ MiguelValencia: Die Seite scheint nicht mehr zu existieren, ich habe den Link entfernt
Sascha Galley
Vielen Dank für Ihre klare und einfache Antwort. Modernizer empfiehlt jetzt die Verwendung von navigator.cookieenabled: github.com/Modernizr/Modernizr/blob/master/feature-detects/…
joshterrell805
17

Um zu überprüfen, ob Cookies mit isset ($ _ COOKIE ["cookie"]) aktiviert sind, müssen Sie eine Aktualisierung durchführen. Ich mache es so (mit Sitzungen basierend auf Cookies :)

session_start();
$a = session_id();
session_destroy();

session_start();
$b = session_id();
session_destroy();

if ($a == $b)
    echo"Cookies ON";
else
    echo"Cookies OFF";
Misza
quelle
2
Dies ist das bisher einfachste und beste Beispiel! Ein Kommentar: Überprüfen Sie zunächst, ob die Sitzung bereits gestartet wurde, bevor Sie dies tun, und lassen Sie sie aktiviert, wenn Sie den Test beenden.
Codebeat
Siehe meinen modifizierten und robusteren Beitrag Ihrer Antwort auf dieser Seite!
Codebeat
11
Dies funktioniert nur nach der Aktualisierung! Beim ersten Laden wird immer " Cookies AUS" angezeigt, da nicht getestet werden kann, ob Cookies aktiviert sind, ohne mindestens eine Anforderung mit dem Browser auszutauschen. Cookies werden bei jeder Anfrage als Teil der Header-Informationen verwendet, und Cookie-Manipulationen werden mit Antwortheadern durchgeführt. Daran führt kein Weg vorbei.
Pavel
10

Antwort auf eine alte Frage, dieser neue Beitrag wurde am 4. April 2013 veröffentlicht

Um die Antwort von @misza zu vervollständigen, finden Sie hier eine erweiterte Methode, um zu überprüfen, ob Cookies aktiviert sind, ohne dass die Seite neu geladen werden muss. Das Problem mit @misza ist, dass es nicht immer funktioniert, wenn die PHP-INI-Einstellung session.use_cookiesnicht wahr ist. Außerdem prüft die Lösung nicht, ob eine Sitzung bereits gestartet wurde.

Ich habe diese Funktion gemacht und sie viele Male in verschiedenen Situationen getestet und mache den Job sehr gut.

    function suGetClientCookiesEnabled() // Test if browser has cookies enabled
    {
      // Avoid overhead, if already tested, return it
      if( defined( 'SU_CLIENT_COOKIES_ENABLED' ))
       { return SU_CLIENT_COOKIES_ENABLED; }

      $bIni = ini_get( 'session.use_cookies' ); 
      ini_set( 'session.use_cookies', 1 ); 

      $a = session_id();
      $bWasStarted = ( is_string( $a ) && strlen( $a ));
      if( !$bWasStarted )
      {
        @session_start();
        $a = session_id();
      }

   // Make a copy of current session data
  $aSesDat = (isset( $_SESSION ))?$_SESSION:array();
   // Now we destroy the session and we lost the data but not the session id 
   // when cookies are enabled. We restore the data later. 
  @session_destroy(); 
   // Restart it
  @session_start();

   // Restore copy
  $_SESSION = $aSesDat;

   // If no cookies are enabled, the session differs from first session start
  $b = session_id();
  if( !$bWasStarted )
   { // If not was started, write data to the session container to avoid data loss
     @session_write_close(); 
   }

   // When no cookies are enabled, $a and $b are not the same
  $b = ($a === $b);
  define( 'SU_CLIENT_COOKIES_ENABLED', $b );

  if( !$bIni )
   { @ini_set( 'session.use_cookies', 0 ); }

  //echo $b?'1':'0';
  return $b;
    }

Verwendung:

if( suGetClientCookiesEnabled())
 { echo 'Cookies are enabled!'; }
else { echo 'Cookies are NOT enabled!'; }

Wichtiger Hinweis: Die Funktion ändert vorübergehend die INI-Einstellung von PHP, wenn sie nicht die richtige Einstellung hat, und stellt sie wieder her, wenn sie nicht aktiviert wurde. Dies dient nur zum Testen, ob Cookies aktiviert sind. Es kann schief gehen, wenn Sie eine Sitzung starten und die PHP-INI-Einstellung session.use_cookies einen falschen Wert hat. Um sicherzustellen, dass die Sitzung ordnungsgemäß funktioniert, überprüfen und / oder legen Sie sie fest, bevor Sie eine Sitzung starten. Beispiel:

   if( suGetClientCookiesEnabled())
     { 
       echo 'Cookies are enabled!'; 
       ini_set( 'session.use_cookies', 1 ); 
       echo 'Starting session';
       @start_session(); 

     }
    else { echo 'Cookies are NOT enabled!'; }
Codebeat
quelle
Erwinus, können Sie bitte etwas näher erläutern, was Sie meinen, indem Sie sagen: "Es kann schief gehen, wenn Sie eine Sitzung starten und die PHP-INI-Einstellung session.use_cookies einen falschen Wert hat." Welcher Wert könnte falsch sein? Ich versuche Ihre Idee umzusetzen, war mir aber nicht sicher, was ich brauche, um meine PHP-INI einzustellen ... Danke!
Sebastian
2
@Sebastian: Wenn Sie eine Sitzung gestartet haben, BEVOR Sie überprüfen, ob Cookies aktiviert sind UND session.use_cookies beispielsweise FALSE ist, kann dies fehlschlagen. Um sicherzustellen, dass dies ordnungsgemäß funktioniert, müssen Sie zuerst die Testfunktion suGetClientCookiesEnabled () aufrufen, bevor Sie eine Sitzung starten. Ist das für Sie klar / verständlich? Hoffe es hilft.
Codebeat
Leider funktioniert es nicht, wenn eine Site zum ersten Mal aufgerufen wird, z. B. im Inkognito-Modus. Nach dem ersten Aufruf einer Site können Sie damit rechnen, dass $ _COOKIE ['PHPSESSID'] gesetzt wird und dies beweist, dass Cookies aktiviert sind. Beim ersten Aufruf ist es jedoch leer - mit Ihrer Methode erhalten Sie jedes Mal eine neue Sitzungs-ID , es beweist nichts.
Rob
@Rob: Ich denke du machst etwas falsch. Sie müssen überprüfen, ob Cookies aktiviert sind, bevor Sie eine andere Sitzung starten. Siehe auch Kommentar zu Sebastian und den 'wichtigen Hinweis' in der Antwort. Aus Sicherheitsgründen ist es besser, den Sitzungsnamen umzubenennen: ini_set ('Sitzungsname', 'Ihr Name') und ini_set ('session.use_only_cookies', true); und ini_set ('session.use_trans_sid', false);
Codebeat
3
@Erwinus - du hast es nicht versucht? Um zu beweisen, was ich gesagt habe, versuchen Sie bitte: 1. Erstellen Sie eine PHP-Datei mit dem Code aus Ihrer Antwort. 2. Öffnen Sie ein neues Inkognito-Fenster in Chrome. 3. Navigieren Sie direkt zur PHP-Testdatei. Der erste Anruf lautet: "Cookies sind NICHT aktiviert!". Der zweite Aufruf lautet: "Cookies sind aktiviert!". Ich habe nur darauf hingewiesen. Leider wird Ihr Code dadurch etwas Zeitverschwendung, da Sie beim zweiten Aufruf überprüfen können, ob $ _COOKIE ['PHPSESSID'] ausgefüllt ist. Wenn dies der Fall ist, werden Cookies aktiviert.
Rob
6

Sie können nicht im Ladeset derselben Seite nachsehen, ob Cookies gesetzt sind. Sie müssen die Seite neu laden:

  • PHP läuft auf dem Server;
  • Cookies beim Kunden.
  • Cookies werden nur beim Laden einer Seite an den Server gesendet.
  • Gerade erstellte Cookies wurden noch nicht an den Server gesendet und werden erst beim nächsten Laden der Seite gesendet.
drfunjohn
quelle
Es ist möglich, siehe meine Antwort
Codebeat
Danke Martijn. Ich lerne nur und schätze diese Konformation. Ich finde die ganze Idee, Cookies in einem PHP-Skript setzen oder lesen zu können, aufgrund Ihres allerersten Punktes sehr verwirrend. Wenn Sie sich das PHP-Handbuch ansehen, denken Sie, solange Sie ein setcookie () vor Ihrem <html> -Tag ausführen, können Sie später sofort eine Codezeile lesen, was so gut wie unmöglich erscheint Ich, es sei denn, ich vermisse etwas Wichtiges. Ehrlich gesagt ist mir der Mechanismus, durch den Ihr letzter Punkt auftritt, immer noch ein Rätsel. Ich wünschte, ich könnte eine endgültige Erklärung dafür finden, wie das funktioniert.
Randy
6

Ein transparenter, sauberer und einfacher Ansatz, bei dem die Verfügbarkeit von Cookies mit PHP überprüft und die transparente AJAX- Umleitung genutzt wird, ohne dass ein erneutes Laden der Seite ausgelöst wird . Es sind auch keine Sitzungen erforderlich.

Clientseitiger Code (JavaScript)

function showCookiesMessage(cookiesEnabled) {
    if (cookiesEnabled == 'true')
        alert('Cookies enabled');
    else
        alert('Cookies disabled');
}

$(document).ready(function() {
    var jqxhr = $.get('/cookiesEnabled.php');
    jqxhr.done(showCookiesMessage);
});

(JQuery AJAX-Aufruf kann durch reinen JavaScript AJAX-Aufruf ersetzt werden)

Serverseitiger Code (PHP)

if (isset($_COOKIE['cookieCheck'])) {
    echo 'true';
} else {
    if (isset($_GET['reload'])) {
        echo 'false';
    } else {
        setcookie('cookieCheck', '1', time() + 60);
        header('Location: ' . $_SERVER['PHP_SELF'] . '?reload');
        exit();
    }
}

Beim ersten Aufruf des Skripts wird das Cookie gesetzt und das Skript weist den Browser an, zu sich selbst umzuleiten. Der Browser macht das transparent. Es findet kein erneutes Laden der Seite statt, da dies innerhalb eines AJAX-Aufrufbereichs erfolgt .

Das zweite Mal, wenn das Cookie durch Umleitung aufgerufen wird und das Cookie empfangen wird, antwortet es auf ein HTTP 200 (mit der Zeichenfolge "true"), daher wird die showCookiesMessageFunktion aufgerufen.

Wenn das Skript zum zweiten Mal aufgerufen wird (gekennzeichnet durch den Parameter "reload") und das Cookie nicht empfangen wird, antwortet es einem HTTP 200 mit der Zeichenfolge "false" - und die showCookiesMessageFunktion wird aufgerufen.

zibilico
quelle
1
Dieser Ansatz wird auf den meisten Geräten funktionieren, wird aber verrückt, wenn Javascript deaktiviert ist
ppp
2

Sie können einen Ajax-Anruf tätigen ( Hinweis : Für diese Lösung ist JQuery erforderlich):

example.php

<?php
    setcookie('CookieEnabledTest', 'check', time()+3600);
?>

<script type="text/javascript">

    CookieCheck();

    function CookieCheck()
    {
        $.post
        (
            'ajax.php',
            {
                cmd: 'cookieCheck'
            },
            function (returned_data, status)
            {
                if (status === "success")
                {
                    if (returned_data === "enabled")
                    {
                        alert ("Cookies are activated.");
                    }
                    else
                    {
                        alert ("Cookies are not activated.");
                    }
                }
            }
        );
    }
</script>

ajax.php

$cmd = filter_input(INPUT_POST, "cmd");

if ( isset( $cmd ) && $cmd == "cookieCheck" )
{
    echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
}

Als Ergebnis wird ein Warnfeld angezeigt, das anzeigt, ob Cookies aktiviert sind oder nicht. Natürlich müssen Sie kein Warnfeld anzeigen. Von hier aus können Sie weitere Schritte unternehmen, um mit deaktivierten Cookies umzugehen.

Schwarz
quelle
1

JavaScript

Sie können ein Cookie mit JavaScript erstellen und prüfen, ob es vorhanden ist:

//Set a Cookie`
document.cookie="testcookie"`

//Check if cookie exists`
cookiesEnabled=(document.cookie.indexOf("testcookie")!=-1)? true : false`

Oder Sie können ein jQuery Cookie-Plugin verwenden

//Set a Cookie`
$.cookie("testcookie", "testvalue")

//Check if cookie exists`
cookiesEnabled=( $.cookie("testcookie") ) ? true : false`

Php

setcookie("testcookie", "testvalue");

if( isset( $_COOKIE['testcookie'] ) ) {

}

Ich bin mir nicht sicher, ob das PHP funktioniert, da ich es nicht testen kann.

Tomgrohl
quelle
2
Der PHP-Code funktioniert nicht. Sie müssen die Seite neu laden, damit der Browser eine zweite HTTP-Anforderung sendet. Wenn die zweite HTTP-Anforderung das Cookie enthält, das von der ersten HTTP-Anforderung gesetzt wurde, werden Cookies aktiviert.
Dave Jarvis
0

Es ist leicht zu erkennen, ob die Cookies aktiviert sind:

  1. Setzen Sie einen Cookie.
  2. Nimm den Keks

Wenn Sie das von Ihnen gesetzte Cookie erhalten können, ist das Cookie cookieaktiviert, andernfalls nicht.

Übrigens: Es ist eine schlechte Idee Embedding the session id in the links and forms, es ist schlecht für SEO. Meiner Meinung nach ist es nicht sehr häufig, dass Leute keine Cookies aktivieren möchten.

James.Xu
quelle
1
Zu Ihrer Information, Sie wären tatsächlich überrascht. Ich habe ein Firefox-Plugin, das alle Cookies außer Domains auf einer Whitelist blockiert, und habe festgestellt, dass viele Benutzer diesem Beispiel folgen. Genau das warf die Frage auf: Ich konnte das Formular nicht verwenden und konnte zunächst nicht herausfinden, warum, lol.
steveo225
Was meinst du mit kann das Formular nicht verwenden? kann die jsessionid nicht in form einbetten?
James.Xu
Das Formular ist ein Multi-Submit-System ohne aktivierte Cookies. Die Seite wird immer wieder neu gestartet, anstatt fortgesetzt zu werden, da die Sitzung niemals festgelegt werden konnte.
steveo225
In Europa gibt es ein neues Cookielaw, das viele Menschen fürchtet, Cookies zu aktivieren, weil eine Website die Annahme von Cookies verlangen muss. Diese Frage irritiert die Besucher, aus diesem Grund schalten sie Cookies vollständig aus. Sie sagten: "nicht sehr häufig", das ist wahr, weil sie nicht wussten, dass es dort war. Aufgrund dieses dummen Gesetzes wissen mehr Leute davon und schalten es aus, wenn sie wissen, wie man das macht.
Codebeat
0

Hier ist ein sehr nützliches und leichtes Javascript-Plugin, um dies zu erreichen: js-cookie

Cookies.set('cookieName', 'Value');
      setTimeout(function(){
        var cookieValue =  Cookies.get('cookieName');
        if(cookieValue){
           console.log("Test Cookie is set!");
        } else {
           document.write('<p>Sorry, but cookies must be enabled</p>');
        }
        Cookies.remove('cookieName');
      }, 1000);

Funktioniert in allen Browsern, akzeptiert alle Zeichen.

Gewähren
quelle
0

Cookies sind clientseitig und können mit PHP nicht ordnungsgemäß getestet werden. Das ist die Basis und jede Lösung ist ein Wrap-Around für dieses Problem.

Das heißt, wenn Sie nach einer Lösung für Ihr Cookie-Problem suchen, sind Sie auf dem falschen Weg. Verwenden Sie kein PHP, sondern eine Client-Sprache wie Javascript.

Können Sie Cookies mit PHP verwenden? Ja, aber Sie müssen neu laden, um die Einstellungen für PHP "sichtbar" zu machen.

Zum Beispiel: Ist ein Test möglich, um festzustellen, ob der Browser Cookies mit einfachem PHP setzen kann? Die einzig richtige Antwort ist "NEIN".

Können Sie ein bereits gesetztes Cookie lesen: 'JA' verwenden Sie das vordefinierte $ _COOKIE (eine Kopie der Einstellungen, bevor Sie PHP-App gestartet haben).

Schaden
quelle