Как определить, отключены ли cookie на стороне сервера - PullRequest
90 голосов
/ 10 февраля 2009

Как я могу определить на сервере (на стороне сервера), отключены ли куки в браузере? Возможно ли это?

Подробное объяснение: Я обрабатываю HTTP-запрос на сервере. Я хочу установить cookie через заголовок Set-Cookie. В то время мне нужно знать, будет ли файл cookie установлен браузером клиента, или мой запрос на установку файла cookie будет проигнорирован.

Ответы [ 15 ]

56 голосов
/ 10 февраля 2009

Отправить ответ о перенаправлении с набором cookie; при обработке (специального) теста перенаправленного URL-адреса для файла cookie - если он перенаправлен на обычную обработку, в противном случае - на состояние ошибки.

Обратите внимание, что это может сказать только то, что браузер разрешил устанавливать cookie, но не в течение какого времени. Мой FF позволяет мне перевести все куки-файлы в «сеансовый» режим, если только сайт не добавлен в список исключений - такие куки-файлы будут отбрасываться при закрытии FF независимо от срока действия, указанного сервером. И это режим, в котором я всегда запускаю FF.

45 голосов
/ 10 февраля 2009

Вы можете использовать Javascript для достижения этого

Библиотека:

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

Код для запуска:

alert(areCookiesEnabled());

Помните

Это работает, только если Javascript включен!

18 голосов
/ 10 февраля 2009

Я не думаю, что есть прямые способы проверить. Лучший способ - сохранить значение в файле cookie и попытаться прочитать их и решить, включены ли файлы cookie.

16 голосов
/ 26 февраля 2009

Обычным способом проверки поддержки файлов cookie является перенаправление.

Рекомендуется делать это только тогда, когда пользователь пытается сделать что-то, что инициирует сеанс, например, войдя в систему или добавив что-то в свою корзину. В противном случае, в зависимости от того, как вы справитесь с этим, вы потенциально блокируете доступ ко всему сайту для пользователей - или ботов - которые не поддерживают куки.

Во-первых, сервер проверяет данные для входа в систему как обычно - если данные для входа являются неправильными, пользователь получает эту обратную связь как обычно. Если это правильно, то сервер немедленно отвечает cookie-файлом и перенаправляет на страницу, которая предназначена для проверки этого cookie-файла - это может быть просто тот же URL-адрес, но с некоторым флагом, добавленным в строку запроса. Если эта вторая страница не получает cookie, то пользователь получает сообщение о том, что он не может войти в систему, потому что cookie отключены в его браузере.

Если вы уже используете шаблон Post-Redirect-Get для своей формы входа, то этот параметр и проверка файла cookie не добавляют никаких дополнительных запросов - файл cookie может быть установлен во время существующего перенаправления и проверен пункт назначения, который загружается после перенаправления.

Теперь, почему я проверяю файлы cookie только после действия, инициированного пользователем, кроме загрузки каждой страницы. Я видел, как сайты внедряют тесты cookie на каждой странице, не понимая, что это повлияет на такие вещи, как поисковые системы, пытающиеся сканировать сайт. То есть, если у пользователя включены cookie-файлы, то тестовый cookie-файл устанавливается один раз, поэтому он должен выдержать перенаправление только на первой странице, которую он запрашивает, и с тех пор перенаправлений не происходит. Однако для любого браузера или другого пользовательского агента, например поисковой системы, который не возвращает файлы cookie, каждая отдельная страница может просто привести к перенаправлению.

Еще один метод проверки поддержки файлов cookie - использование Javascript. Таким образом, перенаправление не требуется - вы можете написать файл cookie и прочитать его практически немедленно, чтобы увидеть, был ли он сохранен, а затем извлечен. Недостатком этого является то, что он запускается в сценарии на клиентской стороне - т.е. если вы все еще хотите, чтобы сообщение о том, поддерживаются ли куки, возвращаются на сервер, то вам все равно придется организовать это - например, с помощью вызов Ajax.

Для моего собственного приложения я реализую некоторую защиту от атак «Login CSRF», вариант атак CSRF, устанавливая cookie-файл со случайным токеном на экране входа в систему до входа пользователя в систему и проверяя этот токен, когда пользователь отправляет свои данные для входа. Узнайте больше о Войти CSRF от Google. Побочным эффектом этого является то, что в тот момент, когда они входят в систему, я могу проверить наличие этого cookie - дополнительная переадресация не требуется.

5 голосов
/ 02 октября 2012

Обычно вам может потребоваться проверить поддержку файлов cookie только после того, как пользователь предпримет какие-либо действия на сайте, такие как отправка формы входа в систему, добавление товара в корзину и т. Д.

Для меня в настоящее время проверка поддержки файлов cookie идет рука об руку с предотвращением CSRF (межсайтовых запросов).

Возможно, вам стоит пойти куда-нибудь, чтобы прочитать больше о CSRF , но идея заключается в том, что другие сайты могут обмануть или заставить ваших пользователей представить скрытую форму по своему выбору на ваш собственный сайт. Обходной путь - установить cookie, когда зритель видит форму, и установить соответствующий токен в качестве скрытого элемента формы, а затем при обработке формы проверить, что и cookie, и скрытый элемент формы установлены и соответствуют друг другу. Если это попытка CSRF-атаки, сайт не сможет предоставить скрытое поле, совпадающее с cookie пользователя, потому что cookie пользователя не будет доступен для чтения в соответствии с политикой того же происхождения.

Если форма отправлена ​​без файла cookie, но она содержит действительный токен, из этого можно сделать вывод, что для пользователя отключены файлы cookie, и вывести сообщение, указывающее, что пользователь должен включить файлы cookie и повторить попытку. , Другая возможность, конечно, заключается в том, что пользователь является жертвой попытки CSRF-атаки. Поэтому блокировка пользователя, когда cookie не совпадает, также будет иметь побочный эффект предотвращения этой атаки.

5 голосов
/ 08 ноября 2011

Я всегда использовал это:

navigator.cookieEnabled

Согласно w3schools"Свойство cookieEnabled поддерживается во всех основных браузерах.".

Тем не менее, это работает для меня, когда я использую формы, где я могу поручить браузеру отправлять дополнительную информацию.

3 голосов
/ 10 февраля 2009

Попробуйте сохранить что-нибудь в cookie, а затем прочитайте его. Если вы не получили ожидаемого результата, файлы cookie, вероятно, отключены.

2 голосов
/ 13 ноября 2013

проверьте этот код, он вам поможет.

<?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 голос
/ 19 июля 2018

NodeJS - сторона сервера - перенаправление проверки файлов cookie Промежуточное программное обеспечение - Экспресс-сессия / Парсер файлов cookie

* Зависимости 1006 *

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 голос
/ 03 октября 2012

Я использую гораздо более упрощенную версию ответа "balexandre" выше. Он пытается установить и прочитать сессионный cookie-файл с единственной целью определить, включены ли cookie-файлы. И да, это требует, чтобы JavaScript также был включен. Так что вы можете захотеть добавить тег, если хотите его иметь.

<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>
...