Я пытаюсь предотвратить фиксацию сессии и прочитал следующее с веб-сайта owasp:
Фиксация сеанса
- Потерять значение $ _SESSION при перенаправлении
- Zend_Session: очистить $ _SESSION до начала вызова
- Загружать session_start () только в том случае, если сеанс не существует?
- Использовать переменные SESSIONS между различными файлами php
- Не работает PHP echo echo?
Идентификаторы сеансов должны генерироваться только вашим приложением. Никогда не создавайте сеанс только потому, что вы получаете идентификатор сеанса от клиента, единственным источником создания сеанса должен быть безопасный случайный генератор.
Я обрабатываю сеансы, используя:
ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. ini_set('session.entropy_file', '/dev/urandom'); // better session id's ini_set('session.entropy_length', '512'); session_start();
и проверка наличия идентификатора пользователя:
if(isset($_SESSION['user_id'])) { //act like user is logged in } else { //refer user to the login page }
Означает ли это, что единственным источником создания моего сеанса является безопасный случайный генератор?
По умолчанию PHP склонен к фиксации сеанса:
Простой сценарий атаки
Простой сценарий:
- Мэллори определил, что http://unsafe.example.com/ принимает любой идентификатор сеанса, принимает идентификаторы сеанса из строк запроса и не имеет проверки безопасности. http://unsafe.example.com/ , таким образом, не является безопасным.
- Мэллори отправляет Алисе по электронной почте: «Эй, проверьте это, в нашем банке есть замечательная новая функция подсчета аккаунтов, http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID ». Мэллори пытается зафиксировать SID на I_WILL_KNOW_THE_SID.
- Алиса заинтересована и посещает http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID . Появляется обычный экран входа в систему, и Alice входит в систему.
- Мэллори посещает http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID и теперь имеет неограниченный доступ к учетной записи Алисы.
http://en.wikipedia.org/wiki/Session_fixation
session.use_strict_mode
boolean
session.use_strict_mode
указывает, будет ли модуль использовать режим строгого сеанса. Если этот режим включен, модуль не принимает неинициализированный идентификатор сеанса. Если в браузере отправляется неинициализированный идентификатор сеанса, новый идентификатор сеанса отправляется в браузер. Приложения защищены от фиксации сеанса посредством принятия сеанса в строгом режиме. По умолчанию0
(отключено).http://php.net/manual/en/session.configuration.php#ini.session.use-strict-mode
Включение session.use_strict_mode
запрещает PHP принимать идентификаторы несуществующих сеансов и создавать их. Однако это не предотвращает другие типы фиксации сеанса:
Атака с использованием SID сервера
Заблуждение состоит в том, что серверы, которые принимают только серверные идентификаторы сеансов, безопасны от фиксации. Это неверно.
Сценарий:
- Мэллори посещает http://vulnerable.example.com/ и проверяет, какой SID возвращается. Например, сервер может ответить: Set-Cookie: SID = 0D6441FEA4496C2.
- Мэллори теперь может отправить Алисе по электронной почте: «Ознакомьтесь с этой новой замечательной функцией в нашем банке, http://vulnerable.example.com/?SID=0D6441FEA4496C2 ».
- Алиса входит в систему, с фиксированным идентификатором сеанса SID = 0D6441FEA4496C2.
- Мэллори посещает http://vulnerable.example.com/?SID=0D6441FEA4496C2 и теперь имеет неограниченный доступ к учетной записи Алисы.
Это может быть предотвращено session.use_only_cookies
, который session.use_only_cookies
по умолчанию.
Вы по-прежнему можете быть уязвимы для еще большего количества атак сеанса фиксации через XSS, что вам придется противодействовать мерам, отличным от настроек PHP ini.
Идентификаторы сеансов должны генерироваться только вашим приложением.
Эта цитата из OWASP PHP Cheat Sheet неверна. Ограничение источника идентификатора сеанса не влияет на фиксацию сеанса. Злоумышленник может перейти на ваш сайт и просто получить действительный идентификатор сеанса.
Проход был исправлен и теперь дает эффективный метод предотвращения фиксации сеанса:
Недействить идентификатор сеанса после входа пользователя (или даже после каждого запроса) с помощью session_regenerate_id () .