Как определить, отключены ли файлы cookie на стороне сервера


91

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

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


Куда? В браузере (на стороне клиента)? Или на сервере? (какой сервер)
Assaf Lavie

7
DETECT cookies включены / выключены в коде на стороне сервера, да.
Assaf Lavie,

вы имеете в виду использование динамического языка вместо Javascript, файлы cookie всегда добавляются в клиентский браузер, поэтому ... нет сервера!
balexandre

Ответы:


58

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

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


14
кроме stackoverflow?
Simon_Weaver

9
За исключением ряда сайтов, один из которых действительно SO.
Лоуренс Дол

43

Вы можете использовать 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!


23
Вопрос в том, как обнаружить куки на стороне сервера. Ваш код работает на стороне клиента.
Адам

2
На стороне сервера - но он не указал, какой серверный язык он использует! Но трюк тот же ... напиши куки и посмотри, есть ли они ... если есть, куки включены, если нет ... отключены;)
balexandre

14
Неважно, какой язык он использует на сервере. На этот вопрос можно ответить с точки зрения HTTP-запросов / ответов.
Martijn

7
Этот код Javascript должен запускаться в браузере, чтобы определить, включены ли файлы cookie в браузере. Он не может работать на стороне сервера.
Marquis of Lorne,

4
@Adam - хотя OP спрашивал о стороне сервера, если вы пытаетесь сообщить пользователю, что для полноценной работы сайту требуется, чтобы файлы cookie были включены, проверка файлов cookie на стороне клиента может достичь этого (при условии, что JavaScript включен).
Крис,

18

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


16

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

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

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

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

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

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

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


5

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

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

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

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


4

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

navigator.cookieEnabled

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

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


+1 от меня. Есть ли причина для отрицательных голосов? Это кажется разумным способом обнаружить блокировку файлов cookie в JavaScript (и для меня работает как в Chrome, так и в IE).
Милан Гардиан

6
Я считаю, что отрицательные голоса вызваны тем, что конкретно задан вопрос о том, как определить поддержку со стороны сервера. Это лучший способ проверить поддержку на стороне клиента.
TJ VanToll

3
W3Schools, по-видимому, не является надежным источником HTML / Javascript / CSS / и т. Д. Информация.
BryanH

5
Это только проверяет, поддерживает ли это браузер. Он не проверяет, включен ли он. Практически каждый браузер поддерживает его, так что это кажется бесполезным. Сожалею.
StuckOnSimpleThings

3

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


Многие сайты так делают. Невозможно (на сервере) выяснить, включены ли файлы cookie по первому запросу, но вы можете реализовать короткий шаг перенаправления, чтобы выяснить это.
Tom Lianza,

2

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

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

Вопрос о том, разрешены ли файлы cookie, слишком логический. В моем браузере (Opera) есть настройки cookie для каждого сайта. Кроме того, этот параметр не является да / нет. Фактически, наиболее полезной формой является "только сеанс", игнорируя дату истечения срока действия серверов. Если вы протестируете его сразу после настройки, он будет там. Завтра не будет.

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


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

1

Если вы хотите только проверить, включены ли файлы cookie сеанса (файлы cookie, которые существуют на протяжении всего сеанса), установите режим сеанса на AutoDetect в файле web.config, тогда инфраструктура Asp.Net запишет cookie в клиентский браузер. называется AspxAutoDetectCookieSupport . Затем вы можете найти этот файл cookie в коллекции Request.Cookies, чтобы проверить, включены ли файлы cookie сеанса на клиенте.

Например, в вашем наборе файлов web.config:

<sessionState cookieless="AutoDetect" />

Затем проверьте, включены ли файлы cookie на клиенте с помощью:

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

Sidenote: по умолчанию для этого параметра установлено значение UseDeviceProfile, который будет пытаться записывать файлы cookie клиенту, если клиент их поддерживает , даже если файлы cookie отключены. Мне кажется немного странным, что это вариант по умолчанию, поскольку он кажется бессмысленным - сеансы не будут работать с файлами cookie, отключенными в клиентском браузере, если для него установлено значение UseDeviceProfile, и если вы поддерживаете режим без файлов cookie для клиентов, которые не поддерживают файлы cookie , тогда почему бы не использовать AutoDetect и не поддерживать режим без файлов cookie для клиентов, у которых они отключены ...


1
Предполагается, что ASP.NET. Первоначальный вопрос был нейтральным с точки зрения технологии
Дэвид Мурхаус,

1

Я использую гораздо более упрощенную версию ответа "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>

1

NodeJS - сторона сервера - промежуточное ПО для перенаправления проверки файлов cookie - экспресс-сессия / анализатор файлов cookie

Зависимости

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

ПО промежуточного слоя

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

0

cookieEnabledСвойство возвращает логическое значение , которое определяет , будет ли куки в браузере включены

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

OP хотел знать, как обнаружить это на стороне сервера.
ZiggyTheHamster

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

-1

Используйте navigator.CookieEnabled для включенных файлов cookie (он вернет true или false) и noscript тега Html. Кстати, navigator.cookieEnabled - это javascript, поэтому не вводите его как HTML


1
Вопрос касается проверок на стороне сервера, а не на стороне клиента.
Evan M

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.