INI-настройки безопасности сессий

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

  • session.cookie_lifetime=0

    0 имеет особое значение. Он сообщает браузеру не сохранять cookie в постоянное хранилище. Следовательно, когда браузер закрывается, сессионные cookie сразу же удаляются. Если задать значение отличное от 0, это может позволить другим пользователям использовать эти cookie. В большинстве случаев лучше всего использовать "0".

    Если требуется функциональность автологина, реализовывайте его самостоятельно и никогда не используйте для этого долгоживущие сессии. Более подробно изложено выше в соответствующих разделах.

  • session.use_cookies=On

    session.use_only_cookies=On

    Несмотря на то, что HTTP-cookie имеют некоторые проблемы, всё же они наиболее предпочтительны для хранения идентификатора сессии. Когда это возможно, для управления идентификаторами сессий необходимо использовать "cookie". Большинство приложений должны использовать cookie для идентификатора сессии.

    Если session.use_only_cookies=Off, модуль сессии будет использовать идентификатор, установленный через GET или POST, если "cookie" не была выставлена заранее.

  • session.use_strict_mode=On

    Крайне рекомендуется включать session.use_strict_mode. По умолчанию не включено.

    Это не позволит сессионному модулю использовать неинициализированные идентификаторы сессий. Другими словами, сессионный модуль будет принимать только корректные идентификаторы, сгенерированные им же и будет игнорировать идентификаторы созданные на стороне пользователя.

    Из-за особенностей спецификации cookie, атакующий может сделать cookie с идентификатором сессии неудаляемой с помощью локальной базы cookie или JavaScript-инъекцией. session.use_strict_mode может не дать атакующему использовать этот идентификатор.

    Замечание:

    Атакующие могут инициализировать идентификатор сессии на своём устройстве и выставить его жертве. Они должны будут поддерживать сессию в активном состоянии для злоупотреблений. Атакующим понадобится совершить дополнительные действия для проведения атаки по этому сценарию. Поэтому session.use_strict_mode служит как предотвращение этому.

  • session.cookie_httponly=On

    Запрещает доступ к сессионной cookie для JavaScript. Эта опция предотвращает кражу cookie с помощью JavaScript-инъекции.

    Можно использовать сессионный ID как защитный ключ CSRF, но не рекомендуется. Например, HTML может быть сохранён и отправлен другому пользователю. Разработчик не должен записывать сессионный ID внутри страницы для повышения безопасности. Почти все приложения должны использовать атрибут httponly для сессионной cookie.

    Замечание:

    Защитный ключ CSRF должен периодически обновляться, как и идентификатор сессии.

  • session.cookie_secure=On

    Разрешает получать доступ к cookie идентификатора сессии только при использовании протокола HTTPS. Если ваш сайт использует только протокол HTTPS, вам необходимо включить эту опцию.

    Для таких сайтов нужно также рассматривать использование HSTS.

  • session.cookie_samesite="Lax" или session.cookie_samesite="Strict"

    Начиная с PHP 7.3, вы можете установить cookie-флаг "SameSite" для cookie идентификатора сессии. Этот флаг является способом смягчения атак CSRF (межсайтовая подделка запроса).

    Разница между Lax и Strict заключается в доступности cookie в запросах, исходящих из другого регистрируемого домена с использованием HTTP-метода GET. Cookie, использующие Lax, будут доступны в GET-запросе, исходящем из другого регистрируемого домена, тогда как cookie, использующие Strict, не будут.

  • session.gc_maxlifetime=[выбрать наименьший из возможных]

    session.gc_maxlifetime настройка для удаления устаревших идентификаторов сессий. Полагаться на эту опцию категорически не рекомендуется. Вы должны управлять жизненным циклом сессии самостоятельно.

    Сессионный сборщик мусора GC (garbage collection) лучше использовать с помощью session_gc(). Функцию session_gc() лучше всего запускать через планировщик, например, cron на *nix-системах.

    По умолчанию GC работает на вероятностном принципе. Эта настройка не гарантирует удаление старых сессий. Разработчику не следует полагаться на эту настройку, но всё равно, рекомендуется выставить её минимально возможным значением. Настраивайте session.gc_probability и session.gc_divisor так, чтобы устаревшие сессии удалялись достаточно часто. Если требуется функциональность автологина, реализуйте его самостоятельно и никогда не используйте для этого долгоживущие сессии.

    Замечание:

    Некоторые обработчики сохранения сессий не используют механизм устаревания сессий на основе вероятностей. Например memcached, memcache. Читайте соответствующую документацию для более полной информации.

  • session.use_trans_sid=Off

    Использование прозрачного управления сессионным ID не рекомендуется. Вы можете использовать его, если необходимо. Однако, отключение прозрачного управления повышает безопасность сессий в целом, убирая возможность инъекции сессионного ID и его кражи.

    Замечание:

    Идентификатор сессии может утечь через закладку в браузере, URL посланный по почте, сохранённый исходник HTML.

  • session.trans_sid_tags=[игнорируемые теги]

    (PHP 7.1.0 >=) Вы не должны перезаписывать ненужные HTML-теги. Значения по умолчанию должно быть достаточно для большинства случаев. Старые версии PHP для этого используют url_rewriter.tags.

  • session.trans_sid_hosts=[список хостов]

    (PHP 7.1.0 >=) Эта настройка определяет белый список хостов, для которых разрешено прозрачное управление идентификаторами сессий. Никогда не добавляйте недоверенные хосты. Если данная настройка пустая, то будет разрешено только для $_SERVER['HTTP_HOST'].

  • session.referer_check=[ваш исходный URL]

    Если session.use_trans_sid включён, то рекомендуется использовать эту опцию, если это возможно. Это уменьшает риск для инъекции сессионного ID. Если ваш сайт находится по адресу http://example.com/, то установите этой опции значение http://example.com/. Обратите внимание, что при использовании HTTPS, браузер не отправляет referrer заголовок. Таким образом, этот параметр не является достаточно надёжным показателем безопасности, но, всё же, рекомендуется его использовать.

  • session.cache_limiter=nocache

    Убедитесь, что содержимое HTTP не кешируется для аутентификационной сессии. Допускается кешировать только неконфиденциальный контент. Иначе содержимым могут воспользоваться. Можно использовать значение "private", если содержимое HTTP не содержит чувствительные к безопасности данные. Учтите, что "private" может оставлять конфиденциальные данные в общем кеше клиентов. Значение "public" можно использовать только, если HTTP-контент вообще не содержит никаких конфиденциальных данных.

  • session.sid_length="48"

    (PHP 7.1.0 >=) Чем длиннее идентификатор сессии, тем он надёжнее. Рекомендуемая длина - 32 символа и больше. В любом случае, не менее 26 символов требуется для session.sid_bits_per_character="5".

  • session.sid_bits_per_character="6"

    (PHP 7.1.0 >=) Чем больше бит используется для символов идентификатора сессии, тем более надёжные идентификаторы будут созданы для той же длины идентификатора сессии.

  • session.hash_function="sha256"

    (PHP 7.1.0 <) Более сложная хеш-функция будет создавать более сложный сессионный ID. Хотя коллизии с хешом почти не происходят и с MD5-хешом, тем не менее разработчику лучше использовать функции SHA-2 или новее. Разработчики также могут использовать сложные функции sha384 и sha512. Удостовертесь, что вы используете достаточно энтропии для этих функций.

  • session.save_path=[общедоступный каталог для чтения]

    Если установлено в общедоступный каталог для чтения всем, такой как /tmp (по умолчанию), другие пользователи на сервере могут захватить сеансы, получив список файлов в этом каталоге.

add a note add a note

User Contributed Notes 1 note

up
0
Derek Simkowiak
6 years ago
Warning: Calling `ini_set('session.use_only_cookies', 1)` returns FALSE if `session_start()` has already been called.
To Top