Jak wykryć po stronie serwera, czy pliki cookie są wyłączone

Jak mogę wykryć na serwerze (po stronie serwera), czy pliki cookie w przeglądarce są wyłączone? Czy to możliwe?

Szczegółowe wyjaśnienie: przetwarzam żądanie HTTP na serwerze. Chcę ustawić plik cookie za pomocą nagłówka Set-Cookie. W tym czasie muszę wiedzieć, czy plik cookie zostanie ustawiony przez przeglądarkę klienta, czy moje żądanie ustawienia pliku cookie zostanie zignorowane.

Author: Rory O'Kane, 2009-02-10

15 answers

Wyślij odpowiedź przekierowania z ustawionym ciasteczkiem; podczas przetwarzania (specjalnego) przekierowanego URL test dla pliku cookie-Jeśli tam jest przekierowanie do normalnego przetwarzania, w przeciwnym razie przekierowanie do stanu błędu.

Zauważ, że może to tylko powiedzieć, że przeglądarka zezwoliła na ustawienie pliku cookie, ale nie na jak długo. Mój FF pozwala mi zmusić wszystkie pliki cookie do trybu "sesyjnego", chyba że strona zostanie specjalnie dodana do listy wyjątków - takie pliki cookie zostaną odrzucone, gdy FF wyłączy się niezależnie od okres ważności serwera. A w takim trybie zawsze uruchamiam FF.

 58
Author: Lawrence Dol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 07:57:02

Możesz użyć Javascript, aby to osiągnąć

Biblioteka:

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

Kod do uruchomienia:

alert(areCookiesEnabled());

Remember

To działa tylko wtedy, gdy Javascript jest włączony!

 43
Author: balexandre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-15 07:08:25

Myślę, że nie ma bezpośrednich sposobów, aby sprawdzić. Najlepszym sposobem jest zapisanie wartości w pliku cookie i spróbuj je odczytać i zdecydować, czy pliki cookie są włączone, czy nie.

 18
Author: Shoban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-16 21:22:40

Powszechnym sposobem sprawdzania obsługi plików cookie jest przekierowanie.

Jest to dobry pomysł, aby zrobić to tylko wtedy, gdy użytkownik próbuje zrobić coś, co inicjuje sesję, takie jak zalogowanie się lub dodanie czegoś do koszyka. W przeciwnym razie, w zależności od tego, jak sobie z tym radzisz, potencjalnie blokujesz dostęp do całej witryny dla użytkowników - lub botów - które nie obsługują plików cookie.

Najpierw serwer sprawdza dane logowania jak zwykle-jeśli dane logowania są błędne użytkownik otrzymuje to informacje zwrotne jak zwykle. Jeśli to prawda, serwer natychmiast odpowiada ciasteczkiem i przekierowaniem na stronę, która ma na celu sprawdzenie tego ciasteczka - który może być tylko tym samym adresem URL, ale z pewną flagą dodaną do ciągu zapytania. Jeśli ta druga strona nie otrzyma pliku cookie, użytkownik otrzymuje komunikat, że nie może się zalogować, Ponieważ pliki cookie są wyłączone w przeglądarce.

Jeśli śledzisz już wzór Post-Redirect-Get dla formularza logowania, to ten ustawienie i sprawdzenie pliku cookie nie dodaje żadnych dodatkowych żądań - plik cookie może być ustawiony podczas istniejącego przekierowania i sprawdzany przez miejsce docelowe, które ładuje się po przekierowaniu.

Teraz dlaczego robię test ciasteczek tylko po akcji zainicjowanej przez użytkownika innej niż przy każdym załadowaniu strony. Widziałem, jak witryny wdrażają test plików cookie na każdej stronie, nie zdając sobie sprawy, że będzie to miało wpływ na takie rzeczy, jak Wyszukiwarki próbujące indeksować witrynę. Oznacza to, że jeśli użytkownik ma Pliki cookie włączone, a następnie testowy plik cookie jest ustawiany raz, więc muszą tylko znosić przekierowanie na pierwszej stronie, którą żądają i od tego momentu nie ma przekierowań. Jednak w przypadku każdej przeglądarki lub innego agenta użytkownika, takiego jak wyszukiwarka, który nie zwraca plików cookie, każda strona może po prostu spowodować przekierowanie.

Inną metodą sprawdzania obsługi plików cookie jest Javascript - w ten sposób nie jest konieczne żadne przekierowanie - możesz napisać plik cookie i przeczytać go praktycznie natychmiast, aby zobaczyć jeśli był przechowywany, a następnie odzyskiwany. Minusem tego jest to, że działa on w skrypcie po stronie klienta - czyli jeśli nadal chcesz, aby Komunikat o tym, czy ciasteczka są obsługiwane, aby wrócić do serwera, to nadal musisz to zorganizować - na przykład z wywołaniem Ajax.

Dla własnej aplikacji wdrażam pewną ochronę dla ataków "Login CSRF", wariant ataków CSRF, ustawiając plik cookie zawierający losowy token na ekranie logowania przed zalogowaniem się użytkownika i sprawdzając ten token, gdy użytkownik poda swoje dane logowania. Przeczytaj więcej o logowaniu CSRF od Google. Efektem ubocznym jest to, że w momencie, gdy się zalogują, mogę sprawdzić istnienie tego pliku cookie - dodatkowe przekierowanie nie jest konieczne.

 16
Author: thomasrutter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 01:14:17

Zazwyczaj może być konieczne sprawdzenie obsługi plików cookie po podjęciu przez użytkownika pewnych działań na stronie, takich jak wysłanie formularza logowania, dodanie przedmiotu do koszyka i tak dalej.

Dla mnie obecnie sprawdzanie obsługi plików cookie idzie w parze z zapobieganiem CSRF (Cross-Site Request Forgery).

Prawdopodobnie powinieneś pójść gdzie indziej, aby przeczytać więcej o CSRF, ale idea za tym stoi, że inne witryny mogą oszukać lub Twoich użytkowników do przesłania ukrytej formy ich wybór własnej strony. Sposób obejścia tego problemu polega na ustawieniu pliku cookie, gdy widz widzi formularz, i ustaw pasujący token jako ukryty element formularza, a następnie podczas przetwarzania formularza sprawdź, czy zarówno plik cookie, jak i ukryty element formularza zostały ustawione i pasują do siebie. Jeśli jest to próba ataku CSRF, witryna nie będzie w stanie dostarczyć ukrytego pola pasującego do pliku cookie użytkownika, ponieważ plik cookie użytkownika nie będzie dla niego czytelny zgodnie z Polityką tego samego pochodzenia.

Jeśli formularz zostanie złożony nie mając pliku cookie, ale zawiera poprawny token, możesz wywnioskować z tego, że użytkownik ma wyłączone pliki cookie i wyświetli komunikat informujący, że użytkownik powinien włączyć pliki cookie i ponownie spróbować. Inną możliwością jest oczywiście to, że użytkownik jest ofiarą próby ataku CSRF. Tak więc zablokowanie użytkownika, gdy plik cookie nie pasuje, będzie miało również efekt uboczny zapobiegania temu atakowi.

 5
Author: thomasrutter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-02 04:18:30

Zawsze używałem tego:

navigator.cookieEnabled

Zgodnie z W3Schools "właściwość cookieEnabled jest obsługiwana we wszystkich głównych przeglądarkach.".

Jednak działa to dla mnie, gdy używam formularzy, w których mogę polecić przeglądarce wysyłanie dodatkowych informacji.

 4
Author: user1018130,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-08 15:35:48

Spróbuj zapisać coś w ciastku, a następnie przeczytaj. Jeśli nie otrzymasz tego, czego oczekujesz, prawdopodobnie pliki cookie są wyłączone.

 3
Author: Joonas Pulakka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 07:53:46

Sprawdź ten kod , to ci pomoże .

<?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
Author: user2511210,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-13 08:36:57

Pytanie, czy pliki cookie są "włączone", jest zbyt logiczne. Moja przeglądarka (Opera) ma ustawienia plików cookie dla poszczególnych witryn. Ponadto ustawienie to nie jest tak/nie. Najbardziej przydatną formą jest w rzeczywistości "session-only", ignorując datę wygaśnięcia serwerów. Jeśli przetestujesz go bezpośrednio po ustawieniu, będzie tam. Jutro nie będzie.

Ponadto, ponieważ jest to ustawienie, które można zmienić, nawet testowanie, czy pliki cookie pozostają, mówi tylko o ustawieniu podczas testowania . Być może zdecydowałem się na zaakceptuj to jedno ciasteczko, ręcznie. Jeśli nadal jestem spamowany, mogę (i czasami będę) po prostu wyłączyć Pliki cookie dla tej strony.

 1
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 12:41:29

Jeśli chcesz tylko sprawdzić, czy pliki cookie sesji (pliki cookie, które istnieją przez cały okres trwania sesji) są włączone, ustaw tryb sesji na autodetekcja w sieci.plik konfiguracyjny, a następnie Asp.Net framework zapisuje plik cookie do przeglądarki klienta o nazwie AspxAutoDetectCookieSupport . Następnie możesz poszukać tego pliku cookie w zapytaniu.Zbieranie plików cookie w celu sprawdzenia, czy pliki cookie sesji są włączone na kliencie.

Np. w sieci.zestaw plików konfiguracyjnych:

<sessionState cookieless="AutoDetect" />

Wtedy sprawdź, czy pliki cookie są włączone na kliencie za pomocą:

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

Sidenote: domyślnie jest to ustawione na UseDeviceProfile, który będzie próbował zapisać pliki cookie do klienta tak długo, jak klient podpory ich, nawet jeśli pliki cookie są wyłączone. Wydaje mi się nieco dziwne, że jest to opcja domyślna, ponieważ wydaje się to trochę bezcelowe-sesje nie będą działać z ciasteczkami wyłączonymi w przeglądarce klienta z ustawionym na UseDeviceProfile, a jeśli obsługujesz tryb cookieless dla klienci, którzy nie obsługują plików cookie, dlaczego nie użyć trybu automatycznego wykrywania i obsługi cookieless dla klientów, którzy mają je wyłączone...

 1
Author: magritte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-03 15:01:41

Używam znacznie bardziej uproszczonej wersji powyższej odpowiedzi "balexandre". Próbuje ustawić i odczytać plik cookie sesji wyłącznie w celu ustalenia, czy pliki cookie są włączone. I tak, wymaga to również włączonej obsługi JavaScript. Więc możesz chcieć tam metkę, jeśli chcesz ją mieć.

<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
Author: Broote,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-02 21:32:18

NodeJS-Server Side - Cookie Check Redirect Middleware-Express Session / Cookie Parser

Zależności

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()
}
 1
Author: decoder7283,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-19 06:49:04

Właściwość cookieEnabled Zwraca wartość logiczną określającą, czy pliki cookie są włączone w przeglądarce

<script>
if (navigator.cookieEnabled) {
    // Cookies are enabled
}
else {
    // Cookies are disabled
}
</script>
 0
Author: Zameer Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-06 12:10:07

Użyj nawigatora.CookieEnabled dla cookies włączone (zwróci true false) i znacznik HTML noscript. Przy okazji Nawigator.cookieEnabled to javascript, więc nie wpisuj go jako HTML

 -1
Author: MayorMonty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-10 22:41:07
<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>
 -1
Author: user3211045,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-19 18:19:38