<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/session.security.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'session.security.ini.php',
    1 => 'INI-настройки безопасности сессий',
    2 => 'INI-настройки безопасности сессий',
  ),
  'up' => 
  array (
    0 => 'session.security.php',
    1 => 'Безопасность сессий',
  ),
  'prev' => 
  array (
    0 => 'features.session.security.management.php',
    1 => 'Базовые принципы управления сессиями',
  ),
  'next' => 
  array (
    0 => 'ref.session.php',
    1 => 'Функции для работы с сессиями',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/session/security.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="session.security.ini" class="sect1">
  <h2 class="title">INI-настройки безопасности сессий</h2>

  <p class="para">
   Предоставляя INI-настройки, связанные с сессиями,
   вы можете улучшить безопасность сессий. Некоторые важные настройки безопасности
   не имеют рекомендованных значений. Вы сами ответственны за выбор необходимых значений.
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-lifetime" class="link">session.cookie_lifetime</a>=0
    </p>
    <p class="para">
     <code class="literal">0</code> имеет особое значение. Он сообщает браузеру не сохранять
     cookie в постоянное хранилище. Следовательно, когда браузер закрывается,
     сессионные cookie сразу же удаляются. Если задать значение отличное
     от 0, это может позволить другим пользователям использовать эти cookie.
     В большинстве случаев лучше всего использовать &quot;<code class="literal">0</code>&quot;.
    </p>
    <p class="para">
     Если требуется функциональность автологина, реализовывайте его самостоятельно и
     никогда не используйте для этого долгоживущие сессии.
     Более подробно изложено выше в соответствующих разделах.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.use-cookies" class="link">session.use_cookies</a>=On
    </p>
    <p class="para">
     <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>=On
    </p>
    <p class="para">
     Несмотря на то, что HTTP-cookie имеют некоторые проблемы, всё же они
     наиболее предпочтительны для хранения идентификатора сессии. Когда это
     возможно, для управления идентификаторами сессий необходимо использовать
     &quot;cookie&quot;. Большинство приложений должны использовать cookie для идентификатора сессии.
    </p>
    <p class="para">
     Если <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>=Off,
     модуль сессии будет использовать идентификатор, установленный
     через GET или POST, если &quot;cookie&quot; не была выставлена заранее.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>=On
    </p>
    <p class="para">
     Крайне рекомендуется включать
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>. По умолчанию не включено.
    </p>
    <p class="para">
     Это не позволит сессионному модулю использовать неинициализированные
     идентификаторы сессий. Другими словами, сессионный модуль будет
     принимать только корректные идентификаторы, сгенерированные им же и
     будет игнорировать идентификаторы созданные на стороне пользователя.
    </p>
    <p class="para">
     Из-за особенностей спецификации cookie, атакующий может сделать
     cookie с идентификатором сессии неудаляемой с помощью локальной
     базы cookie или JavaScript-инъекцией.
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a> может не дать
     атакующему использовать этот идентификатор.
    </p>
    <blockquote class="note"><p><strong class="note">Замечание</strong>: 
     <p class="para">
      Атакующие могут инициализировать идентификатор сессии на своём устройстве
      и выставить его жертве. Они должны будут поддерживать сессию в активном
      состоянии для злоупотреблений. Атакующим понадобится совершить
      дополнительные действия для проведения атаки по этому сценарию.
      Поэтому <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
      служит как предотвращение этому.
     </p>
    </p></blockquote>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-httponly" class="link">session.cookie_httponly</a>=On
    </p>
    <p class="para">
     Запрещает доступ к сессионной cookie для JavaScript. Эта опция
     предотвращает кражу cookie с помощью JavaScript-инъекции.
    </p>
    <p class="para">
     Можно использовать сессионный ID как защитный ключ CSRF, но не рекомендуется.
     Например, HTML может быть сохранён и отправлен другому пользователю.
     Разработчик не должен записывать сессионный ID внутри страницы для повышения безопасности.
     Почти все приложения должны использовать атрибут httponly для сессионной cookie.
    </p>
    <blockquote class="note"><p><strong class="note">Замечание</strong>: 
     <p class="para">
      Защитный ключ CSRF должен периодически обновляться, как и идентификатор сессии.
     </p>
    </p></blockquote>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-secure" class="link">session.cookie_secure</a>=On
    </p>
    <p class="para">
     Разрешает получать доступ к cookie идентификатора сессии только при использовании протокола HTTPS.
     Если ваш сайт использует только протокол HTTPS, вам необходимо включить эту опцию.
    </p>
    <p class="para">
     Для таких сайтов нужно также рассматривать использование HSTS.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-samesite" class="link">session.cookie_samesite</a>=&quot;Lax&quot; или
     <a href="session.configuration.php#ini.session.cookie-samesite" class="link">session.cookie_samesite</a>=&quot;Strict&quot;
    </p>
    <p class="para">
     Начиная с PHP 7.3, вы можете установить cookie-флаг <code class="literal">&quot;SameSite&quot;</code> для
     cookie идентификатора сессии. Этот флаг является способом смягчения атак CSRF (межсайтовая подделка запроса).
    </p>
    <p class="para">
     Разница между Lax и Strict заключается в доступности cookie в запросах,
     исходящих из другого регистрируемого домена с использованием HTTP-метода GET.
     Cookie, использующие Lax, будут доступны в GET-запросе, исходящем из другого регистрируемого домена,
     тогда как cookie, использующие Strict, не будут.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>=[выбрать наименьший из возможных]
    </p>
    <p class="para">
     <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a> настройка для удаления устаревших
     идентификаторов сессий. Полагаться на эту опцию категорически
     <em>не</em> рекомендуется.
     Вы должны управлять жизненным циклом сессии самостоятельно.
    </p>
    <p class="para">
     Сессионный сборщик мусора GC (garbage collection) лучше использовать с помощью <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span>.
     Функцию <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span> лучше всего запускать через планировщик,
     например, cron на *nix-системах.
    </p>
    <p class="para">
     По умолчанию GC работает на вероятностном принципе. Эта настройка
     <em>не</em> гарантирует удаление старых сессий. Разработчику не следует
     полагаться на эту настройку, но всё равно, рекомендуется выставить её
     минимально возможным значением. Настраивайте <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a>
     и <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a> так,
     чтобы устаревшие сессии удалялись достаточно часто.
     Если требуется функциональность автологина, реализуйте его самостоятельно и
     никогда не используйте для этого долгоживущие сессии.
    </p>
    <blockquote class="note"><p><strong class="note">Замечание</strong>: 
     <p class="para">
      Некоторые обработчики сохранения сессий не используют
      механизм устаревания сессий на основе вероятностей.
      Например memcached, memcache. Читайте соответствующую
      документацию для более полной информации.
     </p>
    </p></blockquote>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>=Off
    </p>
    <p class="para">
     Использование прозрачного управления сессионным ID не рекомендуется.
     Вы можете использовать его, если необходимо. Однако, отключение прозрачного
     управления повышает безопасность сессий в целом, убирая возможность
     инъекции сессионного ID и его кражи.
    </p>
    <blockquote class="note"><p><strong class="note">Замечание</strong>: 
     <p class="para">
      Идентификатор сессии может утечь через закладку в браузере, URL посланный по почте,
      сохранённый исходник HTML.
     </p>
    </p></blockquote>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.trans-sid-tags" class="link">session.trans_sid_tags</a>=[игнорируемые теги]
    </p>
    <p class="para">
     (PHP 7.1.0 &gt;=) Вы не должны перезаписывать ненужные HTML-теги.
     Значения по умолчанию должно быть достаточно для большинства случаев. Старые версии PHP
     для этого используют <a href="outcontrol.configuration.php#ini.url-rewriter.tags" class="link">url_rewriter.tags</a>.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.trans-sid-hosts" class="link">session.trans_sid_hosts</a>=[список хостов]
    </p>
    <p class="para">
     (PHP 7.1.0 &gt;=) Эта настройка определяет белый список хостов, для которых
     разрешено прозрачное управление идентификаторами сессий. Никогда не добавляйте
     недоверенные хосты. Если данная настройка пустая, то будет разрешено только для $_SERVER[&#039;HTTP_HOST&#039;].
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.referer-check" class="link">session.referer_check</a>=[ваш исходный URL]
    </p>
    <p class="para">
     Если <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
     включён, то рекомендуется использовать эту опцию, если это возможно.
     Это уменьшает риск для инъекции сессионного ID. Если ваш сайт
     находится по адресу <code class="literal">http://example.com/</code>, то установите этой опции значение <code class="literal">http://example.com/</code>.
     Обратите внимание, что при использовании HTTPS, браузер не отправляет
     referrer заголовок. Таким образом, этот параметр не является достаточно
     надёжным показателем безопасности, но, всё же, рекомендуется его использовать.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cache-limiter" class="link">session.cache_limiter</a>=nocache
    </p>
    <p class="para">
     Убедитесь, что содержимое HTTP не кешируется для аутентификационной сессии.
     Допускается кешировать только неконфиденциальный контент. Иначе
     содержимым могут воспользоваться. Можно использовать значение <code class="literal">&quot;private&quot;</code>,
     если содержимое HTTP не содержит чувствительные к безопасности данные. Учтите, что
     <code class="literal">&quot;private&quot;</code> может оставлять конфиденциальные данные в общем кеше клиентов.
     Значение <code class="literal">&quot;public&quot;</code> можно использовать только, если HTTP-контент вообще не содержит
     никаких конфиденциальных данных.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.hash-function" class="link">session.hash_function</a>=&quot;sha256&quot;
    </p>
    <p class="para">
     (PHP 7.1.0 &lt;) Более сложная хеш-функция будет создавать более сложный сессионный ID.
     Хотя коллизии с хешом почти не происходят и с MD5-хешом, тем не менее
     разработчику лучше использовать функции SHA-2 или новее. Разработчики
     также могут использовать сложные функции sha384 и sha512. Удостовертесь, что вы используете
     достаточно <a href="session.configuration.php#ini.session.entropy-length" class="link">энтропии</a> для этих функций.
    </p>
   </li>

   <li class="listitem">
     <p class="para">
      <a href="session.configuration.php#ini.session.save-path" class="link">session.save_path</a>=[общедоступный каталог для чтения]
     </p>
     <p class="para">
      Если установлено в общедоступный каталог для чтения всем, такой как
      <var class="filename">/tmp</var> (по умолчанию), другие пользователи на
      сервере могут захватить сеансы, получив список
      файлов в этом каталоге.
     </p>
    </li>

  </ul>
 </div><?php manual_footer($setup); ?>