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

91

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ą Set-Cookienagłówka. W tym momencie muszę wiedzieć, czy plik cookie zostanie ustawiony przez przeglądarkę klienta, czy też moje żądanie ustawienia pliku cookie zostanie zignorowane.

Alexander Yanovets
źródło
Gdzie? W przeglądarce (po stronie klienta)? Lub na serwerze? (który serwer)
Assaf Lavie
7
DETECT cookies włączone / wyłączone w kodzie po stronie serwera, tak.
Assaf Lavie
masz na myśli używanie dynamicznego języka zamiast JavaScript, pliki cookie są zawsze dodawane do przeglądarki klienta, więc ... nie ma serwera!
balexandre

Odpowiedzi:

58

Wyślij odpowiedź przekierowania z ustawionym plikiem cookie; podczas przetwarzania (specjalnego) testu przekierowanego adresu URL dla pliku cookie - jeśli jest, przekieruj do normalnego przetwarzania, w przeciwnym razie przekieruj do stanu błędu.

Pamiętaj, ż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 na wymuszenie wszystkich plików cookie w trybie „sesji”, chyba że witryna jest specjalnie dodana do listy wyjątków - takie pliki cookie zostaną odrzucone, gdy FF wyłączy się, niezależnie od wygaśnięcia określonego serwera. I to jest tryb, w którym zawsze uruchamiam FF.

Lawrence Dol
źródło
14
z wyjątkiem stackoverflow?
Simon_Weaver
9
Z wyjątkiem kilku witryn, z których jedna jest rzeczywiście tak.
Lawrence Dol
43

Aby to osiągnąć, możesz użyć Javascript

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());

Zapamiętaj

Działa to tylko wtedy, gdy włączony jest Javascript!

balexandre
źródło
23
Pytanie dotyczy tego, jak wykryć pliki cookie po stronie serwera. Twój kod działa po stronie klienta.
Adam
2
Strona serwera - ale nie sprecyzował, jakiego języka serwera używa! Ale sztuczka jest taka sama ... napisz ciasteczko i zobacz, czy tam jest ... jeśli tak, Ciasteczka włączone, jeśli nie ... Wyłączone;)
balexandre
14
Nie ma znaczenia, jakiego języka używa na serwerze. Na to pytanie można odpowiedzieć w postaci żądań / odpowiedzi HTTP.
Martijn
7
Ten kod Javascript musi działać w przeglądarce, aby wykryć, czy przeglądarka ma włączoną obsługę plików cookie. Nie może działać po stronie serwera.
Markiz Lorne
4
@Adam - chociaż OP pytał o stronę serwera, jeśli próbujesz poinformować użytkownika, że ​​strona wymaga włączenia plików cookie do pełnego działania, może to osiągnąć test plików cookie po stronie klienta (zakładając, że włączony jest JavaScript).
Chris,
18

Nie sądzę, aby można było bezpośrednio sprawdzić. Najlepszym sposobem jest przechowywanie wartości w pliku cookie i próba ich odczytania i zdecydowania, czy pliki cookie są włączone, czy nie.

Shoban
źródło
16

Typowym sposobem sprawdzenia obsługi plików cookie jest przekierowanie.

Warto to zrobić tylko wtedy, gdy użytkownik próbuje zrobić coś, co inicjuje sesję, na przykład zalogować się lub dodać coś do koszyka. W przeciwnym razie, w zależności od tego, jak sobie z tym radzisz, potencjalnie blokujesz dostęp do całej witryny użytkownikom - lub robotom - które nie obsługują plików cookie.

Najpierw serwer sprawdza dane logowania w normalny sposób - jeśli dane logowania są nieprawidłowe, użytkownik otrzymuje tę informację w normalny sposób. Jeśli to prawda, serwer natychmiast odpowiada za pomocą pliku cookie i przekierowania do strony, która jest zaprojektowana do sprawdzania tego pliku cookie - może to być po prostu ten sam adres URL, ale z pewną flagą dodaną do ciągu zapytania. Jeśli ta druga strona nie otrzyma pliku cookie, użytkownik otrzyma komunikat, że nie może się zalogować, ponieważ pliki cookie są wyłączone w jego przeglądarce.

Jeśli już stosujesz się do wzorca Post-Redirect-Get dla formularza logowania, to ustawienie i sprawdzenie pliku cookie nie powoduje dodania żadnych dodatkowych żądań - plik cookie można ustawić podczas istniejącego przekierowania i sprawdzić przez ładowane miejsce docelowe po przekierowaniu.

Teraz, dlaczego przeprowadzam test plików cookie tylko po akcji zainicjowanej przez użytkownika, innej niż przy każdym załadowaniu strony. Widziałem witryny wdrażające 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 zaindeksować witrynę. Oznacza to, że jeśli użytkownik ma włączoną obsługę plików cookie, to testowy plik cookie jest ustawiany tylko raz, więc musi wytrzymać przekierowanie tylko na pierwszej żądanej stronie i od tego momentu nie ma przekierowań. Jednak w przypadku dowolnej przeglądarki lub innego klienta użytkownika, takiego jak wyszukiwarka, które nie zwracają plików cookie, każda strona może po prostu skutkować przekierowaniem.

Inną metodą sprawdzenia obsługi plików cookie jest Javascript - w ten sposób przekierowanie nie jest konieczne - można zapisać plik cookie i odczytać go praktycznie natychmiast, aby sprawdzić, czy został zapisany, a następnie pobrany. Wadą tego jest to, że działa w skrypcie po stronie klienta - tj. Jeśli nadal chcesz, aby komunikat o tym, czy obsługiwane są pliki cookie, wraca do serwera, nadal musisz to zorganizować - na przykład za pomocą wywołania Ajax.

W mojej aplikacji wdrażam pewne zabezpieczenia przed atakami „Login CSRF”, wariantem 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 podaje swój login Detale. Przeczytaj więcej o logowaniu CSRF od Google. Efektem ubocznym jest to, że po zalogowaniu się mogę sprawdzić istnienie tego pliku cookie - dodatkowe przekierowanie nie jest konieczne.

thomasrutter
źródło
5

Zwykle wystarczy sprawdzić obsługę plików cookie po wykonaniu przez użytkownika jakiejś czynności w witrynie, takiej jak przesłanie formularza logowania, dodanie produktu do koszyka itd.

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

Prawdopodobnie powinieneś udać się gdzie indziej, aby przeczytać więcej o CSRF , ale idea kryjąca się za tym jest taka, że ​​inne witryny mogą oszukiwać lub nakłaniać użytkowników do przesłania wybranej przez siebie ukrytej formy do Twojej witryny. Aby obejść ten problem, należy ustawić plik cookie, gdy widz widzi formularz, i ustawić pasujący token jako ukryty element formularza, a następnie podczas przetwarzania formularza sprawdzić, 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 udostępnić ukrytego pola pasującego do pliku cookie użytkownika, ponieważ plik cookie użytkownika nie będzie dla nich czytelny zgodnie z zasadami tego samego pochodzenia.

Jeśli przesłany formularz nie zawiera plików cookie, ale zawiera poprawnie wyglądający token, można z tego wywnioskować, że użytkownik ma wyłączone pliki cookie i wyświetlić komunikat wskazujący, że użytkownik powinien włączyć obsługę plików cookie i spróbować ponownie. Inną możliwością jest oczywiście to, że użytkownik jest ofiarą próby ataku CSRF. Zatem blokowanie użytkownika, gdy plik cookie nie pasuje, będzie miało również efekt uboczny polegający na zapobieganiu temu atakowi.

thomasrutter
źródło
4

Zawsze tego używałem:

navigator.cookieEnabled

Według w3schools „Właściwość cookieEnabled jest obsługiwana we wszystkich głównych przeglądarkach”.

Jednak działa to w przypadku mnie, gdy korzystam z formularzy, w których mogę poinstruować przeglądarkę, aby przesłała dodatkowe informacje.

user1018130
źródło
+1 ode mnie. Czy jest jakiś powód do głosów przeciw? Wydaje się to rozsądnym sposobem wykrywania blokowania plików cookie w JavaScript (i działa zarówno w Chrome, jak i IE).
Milan Gardian
6
Uważam, że głosy negatywne wynikają z pytania konkretnie o to, jak wykryć wsparcie po stronie serwera. To najlepszy sposób na przetestowanie wsparcia po stronie klienta.
TJ VanToll
3
W3Schools najwyraźniej nie jest wiarygodnym źródłem HTML / Javascript / CSS / itp. Informacja.
BryanH
5
To sprawdza tylko wtedy, gdy przeglądarka go obsługuje. Nie sprawdza, czy jest włączona. Praktycznie każda przeglądarka go obsługuje, więc wydaje się to bezwartościowe. Przepraszam.
StuckOnSimpleThings
3

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

Joonas Pulakka
źródło
Robi to wiele witryn internetowych. Nie jest możliwe (na serwerze) ustalenie, czy pliki cookie są włączone przy pierwszym żądaniu, ale możesz zaimplementować krótki krok przekierowania, aby to ustalić.
Tom Lianza
2

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());
user2511210
źródło
1

Pytanie, czy pliki cookie są „włączone”, jest zbyt logiczne. Moja przeglądarka (Opera) ma ustawienia plików cookie dla poszczególnych witryn. Ponadto to ustawienie nie ma wartości tak / nie. Najbardziej użyteczną formą jest w rzeczywistości „tylko sesja”, ignorująca datę ważności serwerów. Jeśli przetestujesz go bezpośrednio po ustawieniu, będzie tam. Jutro tak się nie stanie.

Ponadto, ponieważ jest to ustawienie, które możesz zmienić, nawet sprawdzenie, czy pliki cookie pozostają, mówi tylko o ustawieniu podczas testowania . Mogłem zdecydować się ręcznie zaakceptować ten jeden plik cookie. Jeśli nadal otrzymuję spam, mogę (i czasami będę) po prostu wyłączać pliki cookie dla tej witryny.

MSalters
źródło
3
Dobra uwaga, ale muszę tylko wiedzieć, czy mój nagłówek Set-Cookie spowoduje, że następne żądanie od tego samego klienta będzie pochodziło z tym plikiem cookie, czy nie. Nie jest dla mnie ważne, czy jest trwały, czy tylko sesyjny.
Alexander Yanovets
1

Jeśli chcesz tylko sprawdzić, czy pliki cookie sesji (pliki cookie istniejące przez cały czas trwania sesji) są włączone, ustaw tryb sesji na AutoDetect w pliku web.config, a platforma Asp.Net zapisze plik cookie w przeglądarce klienta o nazwie AspxAutoDetectCookieSupport . Następnie możesz poszukać tego pliku cookie w kolekcji Request.Cookies, aby sprawdzić, czy sesyjne pliki cookie są włączone na kliencie.

Np. W zestawie plików web.config:

<sessionState cookieless="AutoDetect" />

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

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

Uwaga dodatkowa: Domyślnie jest to ustawione na UseDeviceProfile, które będzie próbowało zapisywać pliki cookie dla klienta, o ile klient je obsługuje , nawet jeśli pliki cookie są wyłączone. Uważam, że to trochę dziwne, że jest to opcja domyślna, ponieważ wydaje się trochę bezcelowa - sesje nie będą działać z wyłączonymi plikami cookie w przeglądarce klienta z ustawieniem UseDeviceProfile i jeśli obsługujesz tryb bez plików cookie dla klientów, którzy nie obsługują plików cookie , dlaczego więc nie skorzystać z funkcji AutoDetect i nie obsługiwać trybu bez plików cookie dla klientów, którzy mają je wyłączone ...

magritte
źródło
1
Zakłada, że ​​ASP.NET Pierwotne pytanie było neutralne pod względem technologii
David Moorhouse
1

Używam znacznie bardziej uproszczonej wersji odpowiedzi „balexandre” powyżej. 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ć mieć tam tag, jeśli chcesz go 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>
Broote
źródło
1

NodeJS - po stronie serwera - oprogramowanie pośredniczące przekierowania sprawdzania plików cookie - Express Session / Cookie Parser

Zależności

var express = require('express'),
    cookieParser = require('cookie-parser'),
    expressSession = require('express-session')

Oprogramowanie pośredniczące

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()
}
dekoder7283
źródło
0

cookieEnabledWłaściwość zwraca wartość logiczną, która określa, czy pliki cookie są włączone w przeglądarce

<script>
if (navigator.cookieEnabled) {
    // Cookies are enabled
}
else {
    // Cookies are disabled
}
</script>
Zameer Khan
źródło
OP chciał wiedzieć, jak wykryć to po stronie serwera.
ZiggyTheHamster
Oczywiście będziesz musiał pobrać te informacje z powrotem na serwer w sposób odpowiedni dla twojej aplikacji. Powinno być jasne, że nie można ustalić, czy przeglądarka ma włączoną obsługę plików cookie bez interakcji z przeglądarką.
Steve
-1

Użyj navigator.CookieEnabled, aby włączyć obsługę plików cookie (zwróci wartość true lub false) i tag HTML tagu noscript. Nawiasem mówiąc, navigator.cookieEnabled to javascript, więc nie wpisuj go jako HTML

MayorMonty
źródło
1
Pytanie dotyczy kontroli po stronie serwera, a nie klienta.
Evan M
-1
<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>
user3211045
źródło