Какое из перечисленных выражений используется чтобы определить включены ли в браузере cookies
Я работаю на странице, которая требует JavaScript и сессий. У меня уже есть код, чтобы предупредить пользователя, если JavaScript отключен. Теперь я хочу обработать случай, когда куки отключены, так как идентификатор сессии хранится в куки.
Я подумал только о паре идей:
- Встраивание идентификатора сессии в ссылки и формы
- Предупредите пользователя, что он должен включить куки, если они отключены (потребуется помощь в обнаружении, если куки отключены)
Каков наилучший способ приблизиться к этому? Спасибо
ИЗМЕНИТЬ
Основываясь на связанных статьях, я придумал свой собственный подход и подумал, что поделюсь, кто-то другой сможет его использовать, может быть, я получу несколько критических замечаний. (Предполагается, что ваши сессии PHP хранятся в файле cookie с именем PHPSESSID )
JavaScript
В JavaScript вы просто тестируете свойство cookieEnabled, которое поддерживается во всех основных браузерах. Если вы работаете со старым браузером, вы можете установить cookie и проверить, существует ли он. (заимствовано у Модернизатора):
Вы не можете в том же наборе загрузки той же страницы и проверить, установлены ли куки, вы должны выполнить перезагрузку страницы:
- PHP работает на сервере;
- куки у клиента.
- куки отправляются на сервер только при загрузке страницы.
- Только что созданные куки еще не были отправлены на сервер и будут отправлены только при следующей загрузке страницы.
Вы можете сделать Ajax Call ( Примечание : для этого решения требуется JQuery):
ajax.php
В результате появляется окно с предупреждением о том, включены ли cookie-файлы или нет. Конечно, вам не нужно показывать окно с предупреждением, отсюда вы можете предпринять другие шаги для работы с деактивированными куки.
Файлы cookie находятся на стороне клиента и не могут быть протестированы надлежащим образом с использованием PHP. Это базовый уровень, и каждое решение является решением этой проблемы.
Это значит, что если вы ищете решение проблемы с файлами cookie, значит, вы на неправильном пути. Не используйте PHP, используйте язык клиента, такой как Javascript.
Можете ли вы использовать куки с помощью PHP? Да, но вам нужно перезагрузить, чтобы сделать настройки PHP «видимыми».
Например: можно ли проверить, может ли браузер устанавливать Cookies с простым PHP '? Единственный правильный ответ - «НЕТ».
Можете ли вы прочитать уже установленный Cookie: «YES» использовать предопределенный $ _COOKIE (копия настроек до того, как вы запустили PHP-App).
Вот очень полезный и легкий плагин javascript для этого: js- печенье
Работает во всех браузерах, принимает любой символ.
Но чтобы проверить, включены ли файлы cookie с помощью isset ($ _ COOKIE ["cookie"]), необходимо обновить. Я делаю это так (с сеансами на основе куки :)
Я сделал эту функцию и много раз тестировал ее в разных ситуациях и очень хорошо справлялся с работой.
Прозрачный, чистый и простой подход, проверка доступности файлов cookie с помощью PHP и использование прозрачного перенаправления AJAX , поэтому не вызывает перезагрузку страницы . Это также не требует сессий.
Код на стороне клиента (JavaScript)
(вызов JQuery AJAX можно заменить вызовом AJAX на чистом JavaScript)
Серверный код (PHP)
Легко определить, включены ли файлы cookie:
- установить печенье.
- получить печенье
Если вы можете получить установленный вами cookie, cookie будет включен, в противном случае - нет.
Кстати, это Embedding the session id in the links and forms плохая идея, это плохо для SEO. На мой взгляд, не очень часто люди не хотят включать куки.
JavaScript
Вы можете создать cookie с помощью JavaScript и проверить, существует ли он:
В инете есть как разумные, но неполные, так и бредовые варианты. Давайте напишем небольшой сценарий testcookie.php , который постараемся сделать "универсальным".
Идея в том, что при первом входе на страницу посылается кука без указания срока хранения (временная) и кука, которой назначено жить 2 недели (постоянная). Две недели - это просто так, а вот две куки - потому что в некоторых браузерах можно сделать такую конфигурацию, что куки без даты (их ещё называют сеансовыми) принимаются, а с датой нет, ну или наоборот. Вот картинка выдачи теста из IE8:
Чтобы отличить второй вход от первого, используется условие на наличие переменной $_GET['step'] .
Вот он, этот сценарий.
На некоторых локалхостах это может не работать, где есть траблы с куками или отдельными настройками безопасности для локальных и внешних адресов, но на любом удалённом сервере работать должно.
А вот с точки зрения SEO может получиться полная фигня. Клиент или поисковый бот заходит по ссылке script.php?step=1 , скрипт проверяет наличие куки, и, видя, что её нет, решает, что куки отключены в браузере. Напрашивается идея сделать через переменную сессии, их-то, вроде бы, нигде не отключают? Как-то вот так:
Увы, на самом деле, в ряде г****браузеров, не соблюдающих никаких стандартов, например, в той же "Опере" 11.50, отключение кукизов будет означать и отключение сессий. Так что в этом случае она выдаст что-нибудь вроде циклического редиректа.
А вот в IE8, к примеру, всё сработает корректно (настройки Cookie в нём находятся так: меню Сервис, Свойства обозревателя, вкладка Конфиденциальность, кнопка Дополнительно).
Массу способов можно придумать с применением Javascript, но он-то тоже может быть отключён.
В общем, если знаете способ надёжней и кроссбраузерней приведённого - пишите :) А на практике, конечно, проще всего исходить из того, что 99% пользователей ничего про отключение кукизов не знают и никогда их не отключают.
Вот совсем короткий код для проверки того, включены ли в браузере cookie-файлы, проверенный в PHP 7.4.2 (XAMPP).
Вы когда-нибудь работали с куки? Казалось ли вам при этом, что их использование организовано просто и понятно? Полагаю, что в работе с куки есть множество нюансов, о которых стоит знать новичкам.
Свойство document.cookie
Взглянем на классический способ работы с куки. Соответствующая спецификация существует, благодаря Netscape, с 1994 года. Компания Netscape реализовала свойство document.cookie в Netscape Navigator в 1996 году. Вот определение куки из тех времён:
Главу про document.cookie даже можно найти во втором издании книги «Javascript. The Definitive Guide», которое вышло в январе 1997 года. Это было 24 года тому назад. И мы всё ещё пользуемся тем же старым способом работы с куки ради обратной совместимости.
Как же это выглядит?
Получение куки
Да, именно так всё и делается. В нашем распоряжении оказывается строка со всеми значениями, хранящимися в куки-файле, разделёнными точкой с запятой.
Как вытащить из этой строки отдельное значение? Если вам кажется, что для этого надо самостоятельно разбить строку на части — знайте, что так оно и есть:
Как узнать о том, когда истекает срок действия какого-нибудь из куки? Да, в общем-то, никак.
А как узнать домен, с которого установлен какой-нибудь куки? Тоже никак.
Установка куки
Вышеприведённая команда позволяет создать куки с именем theme , значением которого является dark . Хорошо. Значит ли это, что document.cookie — это строка. Нет, не значит. Это — сеттер.
Эта команда не перезапишет куки с именем theme . Она создаст новый куки с именем mozilla . Теперь у нас имеются два куки.
По умолчанию срок действия куки, созданного так, как показано выше, истекает после закрытия браузера. Но при создании куки можно указать срок его действия:
Да. Это — как раз то, что мне нужно — подбирать дату и время истечения срока действия куки в формате GMT каждый раз, когда нужно установить куки. Ладно, давайте воспользуемся для решения этой задачи JavaScript-кодом:
Но, к счастью, у нас есть и другой способ установки момента истечения срока действия куки:
Свойство max-age представляет собой срок «жизни» куки в секундах. Соответствующее значение имеет более высокий приоритет, чем то, которое задано с помощью свойства expires .
И не надо забывать о свойствах path и domain . По умолчанию куки устанавливаются для текущего расположения и текущего хоста. Если надо установить куки для всего домена — надо будет добавить к команде установки куки конструкцию такого вида:
Удаление куки
Для удаления куки надо установить дату и время истечения срока действия куки на какой-нибудь момент из прошлого. Для того чтобы всё точно сработало бы — тут рекомендуется использовать начало эпохи Unix.
Работа с куки в сервис-воркерах
Это просто невозможно. Дело в том, что работа с document.cookie — это синхронная операция, в результате воспользоваться ей в сервис-воркере нельзя.
Cookie Store API
Существует черновик стандарта одного замечательного API, направленного на работу с куки, который способен значительно облегчить нам жизнь в будущем.
Во-первых — это асинхронный API, а значит — пользоваться им можно, не блокируя главный поток. Применять его можно и в сервис-воркерах.
Во-вторых — этот API устроен гораздо понятнее, чем существующий механизм работы с куки.
▍Получение куки
Метод getAll возвращает массив, а не строку. Именно этого я и жду, когда пытаюсь получить некий список.
А вот — приятная неожиданность. Можно узнать и дату истечения срока действия куки, и сведения о домене и пути, и при этом не пользоваться никакими хаками.
▍Установка куки
Мне очень нравится этот синтаксис!
▍Удаление куки
Или можно, как раньше, установить дату истечения срока действия куки на некий момент в прошлом, но не вижу причины поступать именно так.
▍События куки
Как видите, теперь у нас есть возможность подписываться на изменения куки, не занимаясь опросом document.cookie , блокирующим главный поток. Фантастика!
▍Сервис-воркеры
Можно ли пользоваться этим API прямо сейчас?
Хотя этим API уже можно пользоваться, но тут надо проявлять осторожность. Cookie Store API работоспособно в Chrome 87+ (Edge 87+, Opera 73+). В других браузерах можно воспользоваться полифиллом, который, правда, не возвращает полной информации о куки, как это сделано в настоящем API. Прогрессивные улучшения — это вещь.
И учитывайте, что спецификация этого API всё ещё находится в статусе «Draft Community Group Report». Но если в вашем проекте важен хороший «опыт разработчика» — попробуйте современный способ работы с куки.
Как я могу определить на сервере (на стороне сервера), отключены ли файлы cookie в браузере? Является ли это возможным?
вы имеете в виду использование динамического языка вместо Javascript, файлы cookie всегда добавляются в клиентский браузер, поэтому . нет сервера!
Обратите внимание, что это может только сказать вам, что браузер разрешил установку файла cookie, но не на срок. Мой FF позволяет мне принудительно перевести все файлы cookie в «сеансовый» режим, если сайт специально не добавлен в список исключений - такие файлы cookie будут отброшены при завершении работы FF, независимо от срока, указанного на сервере. И это режим, в котором я всегда запускаю FF.
Вы можете использовать Javascript для этого
Библиотека:
Код для запуска:
Помнить
Это работает, только если включен Javascript!
На стороне сервера - но он не указал, какой серверный язык он использует! Но трюк тот же . напиши куки и посмотри, есть ли они . если есть, куки включены, если нет . отключены;)
Этот код Javascript должен запускаться в браузере, чтобы определить, включены ли файлы cookie в браузере. Он не может работать на стороне сервера.
@Adam - хотя OP спрашивал о стороне сервера, если вы пытаетесь сообщить пользователю, что для полноценной работы сайту требуется, чтобы файлы cookie были включены, проверка файлов cookie на стороне клиента может достичь этого (при условии, что JavaScript включен).
Я не думаю, что есть прямые способы проверить. Лучший способ - сохранить значение в куки-файлах и попытаться прочитать их и решить, включены ли куки-файлы или нет.
Обычный способ проверки поддержки файлов cookie - перенаправление.
Это хорошая идея делать это только тогда, когда пользователь пытается сделать что-то, что инициирует сеанс, например, войти в систему или добавить что-то в свою корзину. В противном случае, в зависимости от того, как вы с этим справитесь, вы потенциально блокируете доступ ко всему сайту для пользователей или ботов, которые не поддерживают файлы cookie.
Если вы уже используете шаблон Post-Redirect-Get для своей формы входа, то этот параметр и проверка файла cookie не добавляют никаких дополнительных запросов - файл cookie может быть установлен во время существующего перенаправления и проверяться местом назначения, которое загружает после перенаправления.
Теперь о том, почему я провожу тест cookie только после действия, инициированного пользователем, а не при каждой загрузке страницы. Я видел, как сайты внедряют тест cookie на каждой странице, не понимая, что это повлияет на такие вещи, как поисковые системы, пытающиеся сканировать сайт. То есть, если у пользователя включены файлы cookie, тогда тестовый файл cookie устанавливается один раз, поэтому ему нужно перенести перенаправление только на первую запрашиваемую страницу, и с этого момента перенаправления не будут. Однако для любого браузера или другого пользовательского агента, такого как поисковая система, которая не возвращает файлы cookie, каждая страница может просто привести к перенаправлению.
Для моего собственного приложения я реализую некоторую защиту от атак CSRF входа в систему, варианта атак CSRF, путем установки файла cookie, содержащего случайный токен, на экране входа в систему до входа пользователя в систему и проверки этого токена, когда пользователь отправляет свой логин. Детали. Узнайте больше о Login CSRF от Google. Побочным эффектом этого является то, что в момент входа в систему я могу проверить наличие этого файла cookie - дополнительное перенаправление не требуется.
Я подумал только о нескольких идеях:
- включение идентификатора сессии в ссылки и формы
- предупредите пользователя, что они должны включить куки, если они отключены (потребуется помощь в обнаружении, если куки отключено)
каков наилучший способ подойти к этому? Спасибо
редактировать
основываясь на связанных статьях, я придумал свой собственный подход и подумал, что я поделюсь, кто-то еще может использовать его, может быть, я получу несколько критических замечаний. (Предполагается, что ваш сеанс PHP хранится в файле cookie с именем PHPSESSID )
JavaScript
в JavaScript вы простой тест для cookieEnabled свойство, которое поддерживается во всех основных браузерах. Если вы имеете дело со старым браузером, вы можете установить cookie и проверить, существует ли он. (заимствовано из модернизатор):
прозрачный, чистый и простой подход, проверка доступности куки с PHP и воспользовавшись AJAX прозрачное перенаправление, следовательно не запускает перезагрузку страницы. Для этого также не требуются сеансы.
клиентский код (JavaScript)
(вызов jQuery AJAX может быть заменен чистым вызовом JavaScript AJAX)
серверный код (PHP)
во второй раз, когда вызывается перенаправлением, если cookie получен, скрипт отвечает HTTP 200 (со строкой "true"), следовательно, showCookiesMessage вызывается функция.
если скрипт вызывается во второй раз (идентифицируется параметром "reload") и cookie не получен, он отвечает HTTP 200 со строкой "false" -и showCookiesMessage функция вызывается.
вы не можете в наборе загрузки той же страницы и проверить, установлены ли куки, вы должны выполнить перезагрузку страницы:
JavaScript
вы можете создать файл cookie с помощью JavaScript и проверить, существует ли он:
или вы можете использовать jQuery Cookie плагин
Php
не уверен, что Php будет работать, поскольку я не могу его проверить.
Вы можете сделать вызов Ajax (Примечание: для этого решения требуется JQuery):
пример.в PHP
"Аякса".в PHP
в результате появляется окно предупреждения, которое показывает, включены или нет куки-файлы. Конечно, вам не нужно показывать окно предупреждения, отсюда вы можете предпринять другие шаги для борьбы с деактивированными куки.
Если вы можете сделать печенье, тем cookie включено, в противном случае не.
вот очень полезный и легкий плагин javascript для выполнения этого:Яш-печенье
работает во всех браузерах, можно любого персонажа.
Cookies являются клиентскими и не могут быть протестированы должным образом с помощью PHP. Это базовая линия, и каждое решение является оберточной для этой проблемы.
значение если вы ищете решение для своей проблемы с cookie, вы находитесь на неправильном пути. Не используйте PHP, используйте клиентский язык, например Javascript.
например: возможен ли тест, чтобы увидеть, если браузер можно установить Cookies с помощью простого PHP'. Единственный правильный ответ - "нет".
можете ли вы прочитать уже установленный Cookie: "да" используйте предопределенную $_COOKIE (копию настроек перед запуском PHP-приложения).
Читайте также: