Перевірте, чи активовані файли cookie


77

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

Я продумав лише кілька ідей:

  1. Вбудовування ідентифікатора сеансу у посилання та форми
  2. Попередити користувача, що він повинен увімкнути файли cookie, якщо вони відключені (потрібна буде допомога у виявленні, якщо файли cookie відключені)

Який найкращий спосіб підійти до цього? Дякую

РЕДАГУВАТИ

На основі посилань на статті, я придумав свій власний підхід і думав, що поділюсь, хтось інший зможе ним скористатися, можливо, я отримаю кілька зауважень. (Припускає, що ваші сеанси PHP зберігаються у файлі cookie з іменем PHPSESSID)

<div id="form" style="display:none">Content goes here</div>
<noscript>Sorry, but Javascript is required</noscript>
<script type="text/javascript"><!--
if(document.cookie.indexOf('PHPSESSID')!=-1)
   document.getElementById('form').style.display='';
else
   document.write('<p>Sorry, but cookies must be enabled</p>');
--></script>

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

чи не могли б ви оновити заголовок запитання на зразок: Перевірити, чи активовані файли cookie за допомогою JavaScript?
imme

Це не те, про що йшлося в запитанні, будь ласка, прочитайте все питання. JavaScript - це просто спосіб відповіді на запитання.
steveo225,

Відповіді:


88

JavaScript

У JavaScript ви просте тестування властивості cookieEnabled , яке підтримується у всіх основних браузерах. Якщо ви маєте справу зі старим браузером, ви можете встановити файл cookie та перевірити, чи він існує. (запозичено в Modernizer ):

if (navigator.cookieEnabled) return true;

// set and read cookie
document.cookie = "cookietest=1";
var ret = document.cookie.indexOf("cookietest=") != -1;

// delete cookie
document.cookie = "cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT";

return ret;

PHP

У PHP це досить "складно", оскільки вам доведеться оновити сторінку або перенаправити на інший сценарій. Тут я буду використовувати два сценарії:

somescript.php

<?php
session_start();
setcookie('foo', 'bar', time()+3600);
header("location: check.php");

check.php

<?php echo (isset($_COOKIE['foo']) && $_COOKIE['foo']=='bar') ? 'enabled' : 'disabled';

16
Було б дуже корисно, якщо б ви могли розширити свою відповідь, щоб пояснити деякі методи на інших кінцях цих посилань і залишити посилання для довідки . Якщо цього не зробити, відповідь ризикує через гниття посилань, і такі типи посилань зазвичай є тими, які раптово зникають. Дякую.
Kev

1
Переадресація не потрібна, див. Також мою відповідь нижче. Ви можете перевірити, чи ввімкнені файли cookie без `` перезавантаження ''.
Codebeat

Це зловмисне програмне забезпечення у другому посиланні? "PHP та файли cookie, хороша суміш!" Чому мене просять встановити моторошне розширення браузера?
Мігель Валенсія,

@MiguelValencia: сайт, схоже, вже не існує, я видалив посилання
Саша Гейлі

Дякуємо за чітку та просту відповідь. Modernizer тепер не рекомендує використовувати navigator.cookieenabled: github.com/Modernizr/Modernizr/blob/master/feature-detects/…
joshterrell805

17

Але щоб перевірити, чи активовані файли cookie за допомогою isset ($ _ COOKIE ["cookie"]), вам потрібно оновити. Я роблю це по-своєму (із сеансами на основі файлів cookie :)

session_start();
$a = session_id();
session_destroy();

session_start();
$b = session_id();
session_destroy();

if ($a == $b)
    echo"Cookies ON";
else
    echo"Cookies OFF";

2
Це найпростіший і найкращий приклад на даний момент! Один коментар: Спершу перевірте, чи вже розпочато сеанс, перш ніж це зробити, і залиште його включеним, коли закінчуєте тест.
Codebeat

Дивіться мій змінений та більш надійний пост Вашої відповіді на цій сторінці!
Codebeat

11
Це працює лише після оновлення! При першому завантаженні він завжди повідомляє Cookies OFF, оскільки немає можливості перевірити, чи активовані файли cookie, не обмінюючись принаймні одним запитом з браузером. Кукі-файли є частиною інформації заголовка з кожним запитом, а маніпуляції з файлами cookie виконуються із заголовками відповідей. Тут ніяк не обійти.
Павло

11

Відповідь на старе питання, цей новий допис розміщений 4 квітня 2013 року

Щоб заповнити відповідь @misza, ось вдосконалений метод перевірки, чи ввімкнені файли cookie без перезавантаження сторінки. Проблема @misza полягає в тому, що вона не завжди працює, коли налаштування php ini session.use_cookiesне відповідає дійсності. Також рішення не перевіряє, чи вже розпочато сеанс.

Я зробив цю функцію і багато разів тестував її в різних ситуаціях, і робить свою роботу дуже добре.

    function suGetClientCookiesEnabled() // Test if browser has cookies enabled
    {
      // Avoid overhead, if already tested, return it
      if( defined( 'SU_CLIENT_COOKIES_ENABLED' ))
       { return SU_CLIENT_COOKIES_ENABLED; }

      $bIni = ini_get( 'session.use_cookies' ); 
      ini_set( 'session.use_cookies', 1 ); 

      $a = session_id();
      $bWasStarted = ( is_string( $a ) && strlen( $a ));
      if( !$bWasStarted )
      {
        @session_start();
        $a = session_id();
      }

   // Make a copy of current session data
  $aSesDat = (isset( $_SESSION ))?$_SESSION:array();
   // Now we destroy the session and we lost the data but not the session id 
   // when cookies are enabled. We restore the data later. 
  @session_destroy(); 
   // Restart it
  @session_start();

   // Restore copy
  $_SESSION = $aSesDat;

   // If no cookies are enabled, the session differs from first session start
  $b = session_id();
  if( !$bWasStarted )
   { // If not was started, write data to the session container to avoid data loss
     @session_write_close(); 
   }

   // When no cookies are enabled, $a and $b are not the same
  $b = ($a === $b);
  define( 'SU_CLIENT_COOKIES_ENABLED', $b );

  if( !$bIni )
   { @ini_set( 'session.use_cookies', 0 ); }

  //echo $b?'1':'0';
  return $b;
    }

Використання:

if( suGetClientCookiesEnabled())
 { echo 'Cookies are enabled!'; }
else { echo 'Cookies are NOT enabled!'; }

Важливе зауваження: Функція тимчасово змінює налаштування ini PHP, коли у неї немає правильних налаштувань, і відновлює її, коли її не було ввімкнено. Це лише для перевірки, чи активовані файли cookie. Це може помилитися, коли ви починаєте сеанс, а налаштування php ini session.use_cookies має неправильне значення. Щоб переконатися, що сеанс працює правильно, перевірте та / або встановіть його перед початком сеансу, наприклад:

   if( suGetClientCookiesEnabled())
     { 
       echo 'Cookies are enabled!'; 
       ini_set( 'session.use_cookies', 1 ); 
       echo 'Starting session';
       @start_session(); 

     }
    else { echo 'Cookies are NOT enabled!'; }

Erwinus, ти можеш пояснити трохи більше, що ти маєш на увазі, сказавши: "Це може піти не так, коли ви починаєте сеанс і налаштування php ini session.use_cookies має неправильне значення". Яке значення може бути неправильним? Я намагаюся реалізувати вашу ідею, але не був впевнений, що мені потрібно для встановлення мого php ini ... Дякую!
Себастьян

2
@Sebastian: Коли ви розпочали сесію ДО того, як ви збираєтесь перевірити, чи активовані файли cookie І session.use_cookies, наприклад, FALSE, він може не вдатися. Щоб бути впевненим, що працює коректно, спочатку потрібно викликати тестову функцію suGetClientCookiesEnabled () ПЕРЕД початком будь-якого сеансу. Це для вас зрозуміло / зрозуміло? Сподіваюся, це допоможе.
Codebeat

На жаль, це не працює з першого виклику сайту, наприклад, спробуйте в режимі анонімного перегляду. Після першого дзвінка на сайт ви можете очікувати встановлення $ _COOKIE ['PHPSESSID'], що підтверджує, що файли cookie увімкнені, але при першому ж виклику воно порожнє - з вашим методом ви все одно отримуєте новий ідентифікатор сеансу кожного разу , це нічого не доводить.
Роб

@Rob: Я думаю, ти робиш щось не так. Ви повинні перевірити, чи ввімкнені файли cookie ПЕРЕД тим, як розпочати будь-який інший сеанс. Див. Також коментар до Себастьяна та "важливу примітку" у відповіді. З міркувань безпеки краще перейменувати ім'я сесії: ini_set ('session.name', 'ваше ім'я') та ini_set ('session.use_only_cookies', true); та ini_set ('session.use_trans_sid', false);
Codebeat

3
@Erwinus - ти не пробував? Щоб довести те, що я сказав, спробуйте: 1. Створіть php-файл із кодом із вашої відповіді в ньому 2. Відкрийте нове вікно інкогніто в chrome 3. Перейдіть безпосередньо до тестового файлу php. Перший дзвінок говорить: "Файли cookie НЕ активовані!". Другий дзвінок говорить: "Файли cookie увімкнені!". Я просто вказував на це. На жаль, це робить ваш код трохи марною тратою часу, оскільки під час другого виклику ви можете перевірити, чи заповнений $ _COOKIE ['PHPSESSID'] - якщо це так, тоді файли cookie ввімкнені.
Роб

7

Прозорий, чистий і простий підхід, перевірка наявності файлів cookie за допомогою PHP та використання переваг прозорого перенаправлення AJAX , отже, не викликає перезавантаження сторінки . Це також не вимагає сеансів.

Клієнтський код (JavaScript)

function showCookiesMessage(cookiesEnabled) {
    if (cookiesEnabled == 'true')
        alert('Cookies enabled');
    else
        alert('Cookies disabled');
}

$(document).ready(function() {
    var jqxhr = $.get('/cookiesEnabled.php');
    jqxhr.done(showCookiesMessage);
});

(Виклик JQuery AJAX можна замінити чистим викликом AJAX JavaScript)

Серверний код (PHP)

if (isset($_COOKIE['cookieCheck'])) {
    echo 'true';
} else {
    if (isset($_GET['reload'])) {
        echo 'false';
    } else {
        setcookie('cookieCheck', '1', time() + 60);
        header('Location: ' . $_SERVER['PHP_SELF'] . '?reload');
        exit();
    }
}

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

Другий раз, при виклику шляхом переспрямування, якщо файл cookie отриманий, скрипт відповідає HTTP 200 (із рядком "true"), отже, showCookiesMessageфункція викликається.

Якщо сценарій викликається вдруге (ідентифікується параметром "reload"), а файл cookie не отримується, він відповідає HTTP 200 із рядком "false" - і showCookiesMessageфункція викликається.


1
Цей підхід буде працювати на більшості пристроїв, але збожеволіє, якщо javascript вимкнено
ppp

6

Ви не можете в наборі завантаження однієї сторінки і перевірити, чи встановлені файли cookie, потрібно виконати перезавантаження сторінки:

  • Запуск PHP на сервері;
  • файли cookie у клієнта.
  • файли cookie, що надсилаються на сервер лише під час завантаження сторінки.
  • Щойно створені файли cookie ще не надсилалися на сервер і будуть надіслані лише при наступному завантаженні сторінки.

Це можливо, див. Мою відповідь
Codebeat

Дякую Мартіне. Я просто вчусь і ціную цю конформацію. Мені здається, що вся ідея можливості встановлювати чи читати файли cookie у PHP-скрипті дуже заплутана через вашу першу думку. Щоб пройти посібник PHP, ви думаєте, що доки ви встановлюєте setcookie () до тегу <html>, вам буде негайно прочитано рядок коду пізніше, що здається майже неможливим мене, якщо я не пропускаю щось головне. Чесно кажучи, механізм, за допомогою якого відбувається ваша остання точка, для мене все ще залишається загадкою. Я хотів би знайти остаточне пояснення того, як це працює.
Ренді

2

Ви можете здійснити виклик Ajax ( Примітка . Для цього рішення потрібен JQuery):

example.php

<?php
    setcookie('CookieEnabledTest', 'check', time()+3600);
?>

<script type="text/javascript">

    CookieCheck();

    function CookieCheck()
    {
        $.post
        (
            'ajax.php',
            {
                cmd: 'cookieCheck'
            },
            function (returned_data, status)
            {
                if (status === "success")
                {
                    if (returned_data === "enabled")
                    {
                        alert ("Cookies are activated.");
                    }
                    else
                    {
                        alert ("Cookies are not activated.");
                    }
                }
            }
        );
    }
</script>

ajax.php

$cmd = filter_input(INPUT_POST, "cmd");

if ( isset( $cmd ) && $cmd == "cookieCheck" )
{
    echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
}

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


1

JavaScript

Ви можете створити файл cookie за допомогою JavaScript і перевірити, чи він існує:

//Set a Cookie`
document.cookie="testcookie"`

//Check if cookie exists`
cookiesEnabled=(document.cookie.indexOf("testcookie")!=-1)? true : false`

Або ви можете використовувати плагін jQuery Cookie

//Set a Cookie`
$.cookie("testcookie", "testvalue")

//Check if cookie exists`
cookiesEnabled=( $.cookie("testcookie") ) ? true : false`

Php

setcookie("testcookie", "testvalue");

if( isset( $_COOKIE['testcookie'] ) ) {

}

Не впевнений, що Php буде працювати, оскільки я не можу його перевірити.


2
Код PHP не працюватиме. Вам потрібно перезавантажити сторінку, щоб браузер надіслав другий запит HTTP. Якщо другий запит HTTP містить файл cookie, який було встановлено з першого запиту HTTP, тоді файли cookie ввімкнено.
Dave Jarvis

0

легко визначити, чи включені файли cookie:

  1. встановити печиво.
  2. дістати печиво

якщо ви можете отримати встановлений вами файл cookie, цей параметр cookieувімкнено, інакше ні.

До речі: це погана ідея Embedding the session id in the links and forms, це погано для SEO. На мій погляд, не так часто люди не хочуть вмикати файли cookie.


1
FYI, ви насправді були б здивовані. У мене є плагін Firefox, який блокує всі файли cookie, крім доменів із білого списку, і я помітив, що багато користувачів слідують цьому прикладу. Насправді саме це підштовхнуло питання: я не міг використовувати форму і спочатку не міг зрозуміти, чому, ха-ха.
steveo225

що ви маєте на увазі під не можна використовувати форму? не можете вставити jsessionid у форму?
James.Xu

Форма є системою багаторазового надсилання, без увімкнених файлів cookie, сторінка продовжувалась заново, а не продовжуватись, оскільки сеанс ніколи не можна було встановити.
steveo225

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

0

Ось дуже корисний та легкий плагін для виконання JavaScript: js-cookie

Cookies.set('cookieName', 'Value');
      setTimeout(function(){
        var cookieValue =  Cookies.get('cookieName');
        if(cookieValue){
           console.log("Test Cookie is set!");
        } else {
           document.write('<p>Sorry, but cookies must be enabled</p>');
        }
        Cookies.remove('cookieName');
      }, 1000);

Працює у всіх браузерах, приймає будь-який символ.


0

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

Це означає, що якщо ви шукаєте рішення проблеми з файлами cookie, ви підете не так. Не використовуйте PHP, використовуйте клієнтську мову, таку як Javascript.

Чи можете ви використовувати файли cookie за допомогою PHP? Так, але вам потрібно перезавантажити, щоб зробити налаштування PHP "видимими".

Наприклад: чи можливий тест, щоб перевірити, чи може браузер встановити файли cookie з простим PHP '. Єдина правильна відповідь - "НІ".

Чи можете ви прочитати вже встановлений файл cookie: "ТАК", використовуйте заздалегідь визначений $ _COOKIE (копію налаштувань перед запуском програми PHP).

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