Установка и настройка PHPBB3.

Cookie domain в настройках PhpBB и не только

alex » 14 июн 2013, 00:56

Очень часто после установки форума PhpBB начинают появляться вопросы типа:
"А как избавиться от sid, цепляемого к url-адресам конференции"
или
"Периодически приходится логиниться заново, что-то не так с cookie, по всей видимости."
и т. п.
Вообще, если порыться в интернете, то можно найти примерные ответы на вопрос: "как же правильно сконфигурировать cookie ?"
Вот одно из руководств:
Размещение конференции: http://www.example.com/board/
Настройки cookies должны быть такие:

  • Домен cookie: .example.com (обратите внимание на точку спереди; домен cookie всегда должен содержать две точки).
  • Путь cookie: /board (это путь к конференции без закрывающего слеша).
  • Имя cookie: example_cookie (имя можно ввести любое, но без точек и пробелов).

Размещение конференции: http://forums.example.net/
Настройки cookies должны быть такие:

  • Домен cookie: forums.example.net (две точки уже присутствуют, следовательно точка спереди не нужна).
  • Путь cookie: / (это путь к конференции без закрывающего слеша).
  • Имя cookie: example_cookie (имя можно ввести любое, но без точек и пробелов).

Размещение конференции: http://www.example.co.uk/phpBB3/
Настройки cookies должны быть такие:

  • Домен cookie: example.co.uk (две точки уже присутствую, следовательно точка спереди не нужна).
  • Путь cookie: /phpBB3 (это путь к конференции без закрывающего слеша)
  • Имя cookie: example_cookie (имя можно ввести любое, но без точек и пробелов).


А меня всегда интриговало, что это за требование такое к наличию двух точек в доменном имени.
Посветив 2 дня разбирательству, я понял, насколько все запущено :cry: с кроссдоменной политикой cookie, кроссбраузерностью в плане их интерпретации стандартов RFC 6265 и предшествующего RFC 2965.
Не претендуя на какой-то научный подход, я решил, что полезно для себя и других изложить ряд фактов относительно cookies в PhpBB в частности сначала, и затем в общем относительно реализации cookies производителями браузеров.
Эту статью я планирую со временем дополнять по мере очередных просветлений, и также буду очень рад если кто-то из светлых голов присоединится в комментариях чтобы добавить ясности.

Итак, поехали..
Что касаемо PhpBB3
Иногда, особенно, когда задают вопросы при установке на локальныю машину, то даются советы типа писать в настройках cookie "Домен cookie":
localhost или просто site-name или еще что.
Вот ответ, вносящий некую ясность.
Сканируем исходники PhpBB3 утилитой grep например, на предмет содержания строки "cookie_domain".
Имеем на выходе 2 файла includes/functions.php и includes/session.php.

В includes/functions.php видим:
Код: Выделить всё
      'A_COOKIE_SETTINGS'     => addslashes('; path=' . $config['cookie_path'] . ((!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain']) . ((!$config['cookie_secure']) ? '' : '; secure')),
   ));


В includes/session.php видим:
Код: Выделить всё
   function set_cookie($name, $cookiedata, $cookietime)
   {
      global $config;

      $name_data = rawurlencode($config['cookie_name'] . '_' . $name) . '=' . rawurlencode($cookiedata);
      $expire = gmdate('D, d-M-Y H:i:s \\G\\M\\T', $cookietime);
      $domain = (!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain'];

      header('Set-Cookie: ' . $name_data . (($cookietime) ? '; expires=' . $expire : '') . '; path=' . $config['cookie_path'] . $domain . ((!$config['cookie_secure']) ? '' : '; secure') . '; HttpOnly', false);
   }

Вопросы по установке cookie конкретно в PhpBB еще есть? ;)
Правильно, что нет. Потому что дальше начинается вторая, самая интересная часть..

С чем мы, веб-разработчики имеем дело?
А имеем мы дело с наследством от реализации браузеров до "April 2011" в соответствии с RFC 2965 и его вариациями и с вариациями нового RFC 6265.

В общем, изучив RFC 6265
RFC 6265 4.1.2.3
RFC 6265 5.1.3
RFC 6265 5.3.6
и ряд обсуждений в русском и английском интернете и немного потестировав сам, у меня вырисовалась следующая картина:

    1. Если атрибут "domain" не установлен, то cookie видны только установившему их хосту.
    2. Если атрибут "domain" установлен и совпадает с именем устанавливающего хоста, то cookie видны установившему их хосту и всем его поддоменам.
    3. Атрибут "domain" в любом случае должен быть суффиксом для доменного имени устанавливающего его хоста.
      Т. е. поддомен может установить cookie для родительского домена, и может видеть все cookie родительского домена.
    4. Так же действует ограничение "public suffix" на установку cookie для корневых доменов типа (com, co.uk и т. п.).
    5. Если атрибут "domain" начинается с точки, то согласно последней спецификации, она не учитывается, но лучше её ставить.
  • В разных браузерах возможны варианты, особенно, если еще задействуются атрибуты Path, Secure, HttpOnly. Поэтому, планируя политику cookie для своих проектов лучше рассчитывать на наиболее простые решения, проводить кроссбраузерное тестирование и быть готовым к проблемам с новыми и старыми не протестированными клиентами и серверами.
alex
Администратор
 
Сообщения: 56
Зарегистрирован: 17 апр 2010, 00:45

Вернуться в Форум PHPBB (PHP Bulleting Board)