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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

navigator.cookieEnabled

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

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

Ответ 6

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

Для меня в настоящее время проверка поддержки файлов cookie идет рука об руку с предотвращением CSRF (Under-Site Request Forgery).

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

Если вы хотите проверить, разрешены ли файлы 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 отключены. Мне показалось странным, что это опция по умолчанию, поскольку она кажется бесполезной: сеансы не будут работать с отключенными в браузере браузерами, установленными в UseDeviceProfile, и если вы поддерживаете режим cookieless для клиентов, которые не поддерживают файлы cookie, то почему бы не использовать AutoDetect и поддерживать режим cookieless для клиентов, которые отключили их...

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

Ответ 14

<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>