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

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

  • session.cookie_lifetime=0

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

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

  • session.use_cookies=On

    session.use_only_cookies=On

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

    Если session.use_only_cookies=Off, модуль сессии будет использовать идентификатор, установленный через GET/POST/URL, если "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 внутри web-страницы для повышения безопасности. Почти все приложения должны использовать аттрибут httponly для сессионной cookie.

    Замечание:

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

  • session.cookie_secure=On

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

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

  • session.gc_maxlifetime=[choose smallest possible]

    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=[limitted tags]

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

  • session.trans_sid_hosts=[limitted hosts]

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

  • session.referer_check=[your originating 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. Удостовертесь, что вы используете достаточно энтропии для этих функций.