Як виявити на стороні сервера, чи відключені файли cookie


91

Як я можу визначити на сервері (на стороні сервера), чи відключені файли cookie у браузері? Це можливо?

Детальне пояснення: Я обробляю запит HTTP на сервері. Я хочу встановити cookie через Set-Cookieзаголовок. На той момент мені потрібно знати, чи буде файл cookie встановлений браузером клієнта, або мій запит про встановлення файлу cookie буде проігноровано.


Де? У браузері (на стороні клієнта)? Або на сервері? (який сервер)
Assaf Lavie

7
ДЕТЕКТ cookie ввімкнено / вимкнено в коді на стороні сервера, так
Assaf Lavie

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

Відповіді:


58

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

Зауважте, що це може сказати лише, що браузер дозволив встановлювати файли cookie, але не як довго. Мій FF дозволяє мені примусити всі файли cookie перейти в режим "сеансу", якщо сайт спеціально не додано до списку винятків - такі файли cookie будуть відкинуті, коли FF вимкнеться незалежно від терміну дії сервера. І в цьому режимі я завжди запускаю FF.


14
крім stackoverflow?
Simon_Weaver

9
За винятком ряду сайтів, один із яких справді ТАК.
Лоуренс Дол

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
Питання в тому, як виявити файли cookie на стороні сервера. Ваш код працює на стороні клієнта.
Адам

2
На стороні сервера - Але він не вказав, якою мовою сервера він користується! Але фокус той самий ... напишіть файл cookie і подивіться, чи є він там ... якщо він є, cookie увімкнено, якщо ні ... відключено;)
balexandre

14
Не має значення, якою мовою він користується на сервері. На це запитання можна відповісти з точки зору HTTP-запитів / відповідей.
Martijn

7
Цей код Javascript повинен запускатися у веб-переглядачі, щоб визначити, чи увімкнено в браузері файли cookie. Він не може працювати на стороні сервера.
Маркіз Лорнський,

4
@Adam - хоча ОП запитав про серверну сторону, якщо ви намагаєтеся повідомити користувача, що веб-сайт вимагає, щоб файли cookie були ввімкненими для повноцінної роботи, тестування файлів cookie на стороні клієнта може досягти цього (за умови, що JavaScript увімкнено).
Кріс,

18

Я не думаю, що є прямі способи перевірки. Найкращий спосіб - це зберегти значення у файлі cookie, спробувати прочитати їх і вирішити, чи активовані файли cookie.


16

Поширеним способом перевірки підтримки файлів cookie є переспрямування.

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

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

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

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

Інший метод перевірки підтримки файлів cookie - це Javascript - таким чином, переспрямування не потрібне - ви можете написати файл cookie та прочитати його практично відразу, щоб побачити, чи він був збережений, а потім отриманий. Недоліком цього є те, що він працює у сценарії на стороні клієнта - тобто, якщо ви все одно хочете, щоб повідомлення про те, чи підтримуються файли cookie, поверталося на сервер, вам все одно доведеться це організувати - наприклад, за допомогою виклику Ajax.

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


5

Зазвичай вам може знадобитися перевірити підтримку файлів cookie лише після того, як користувач здійснить певні дії на сайті, наприклад, подає форму для входу, додає товар у кошик тощо.

На даний момент для мене перевірка підтримки файлів cookie йде паралельно із запобіганням CSRF (Підробка міжсайтових запитів).

Можливо, вам слід піти в інше місце, щоб прочитати більше про CSRF , але ідея цього полягає в тому, що інші веб-сайти можуть обдурити або ваших користувачів подати приховану форму за власним вибором на ваш власний сайт. Шлях навколо цього - встановити файл cookie, коли переглядач бачить форму, і встановити відповідний маркер як прихований елемент форми, а потім, обробляючи форму, перевірити, щоб і файл cookie, і прихований елемент форми були встановлені та відповідали один одному. Якщо це спроба атаки CSRF, веб-сайт не зможе надати приховане поле, яке відповідає файлу cookie користувача, оскільки файл cookie користувача не буде їм читати згідно з політикою того самого походження.

Якщо форма подається без файлів 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 для цього сайту.


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

1

Якщо ви хочете лише перевірити, чи активовані файли cookie сеансу (файли cookie, які існують протягом усього періоду сеансу), встановіть для свого режиму сеансу значення Автовизначення у файлі 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) і тегу Hsml noscript. До речі, navigator.cookieEnabled є javascript, тому не вводьте його як HTML


1
Питання стосується перевірок на стороні сервера, а не на стороні клієнта.
Еван М

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.