безопасность — сеансы PHP не проверяются при быстрой навигации

У меня сессия формируется следующим образом:

function sec_session_start() {
$session_name = 'primary_session';
$secure = false;
$httponly = true;
if (ini_set('session.use_only_cookies', 1) === FALSE) {
header("Location: /error?e=1");
exit();
}
$cookieParams = session_get_cookie_params();
session_set_cookie_params(3600,$cookieParams["path"],$cookieParams["domain"],$secure,$httponly);
session_name($session_name);
session_start();
session_regenerate_id(true);
}

Я использую это на всей своей странице, добавив
sec_session_start();
на моей странице индекса, которая требует правильных файлов в зависимости от того, к какой странице я обращаюсь.

Он отлично работает с медленной навигацией.

Однако, когда происходят быстрые навигационные щелчки, по какой-то причине он не проверяется, и пользователь выходит из системы.
Как так?

Это кнопка, которую я быстро нажимаю. ПРИМЕЧАНИЕ: это также меняет страницу с www.example.com в www.example.com/users, а затем просто повторяется www.example.com/users пока сессия не прервана.

Пользователь вошел в систему

И это результат примерно после 2-3 быстрых кликов. Работает нормально при нажатии 1-2 раза в секунду, макс.

Пользователь вышел из системы

Я пытался не использовать его как функцию, и безуспешно помещал его в абсолютную верхнюю часть страницы.

1

Решение

Кажется, ошибка session_regenerate(true),

Эта команда генерирует новый идентификатор сеанса. Параметр удалит старый файл сеанса если оно установлено в true. В этом коде для него установлено значение true, поэтому сеанс создается как запущенный, а затем напрямую закрывается и удаляется.

Я думаю, что это появляется только несколько раз, потому что команда вызывается после вызова session_start () и вывод уже запущен.

Попробуйте изменить параметр на ложный.
Для правильного использования session_regenerate() смотреть в этот вопрос.

1

Другие решения

Похоже, вы сбрасываете старый идентификатор сессии при каждой загрузке страницы. Это не нужно, неэффективно и вызывает поломку.

Если вы перемещаетесь дважды в быстрой последовательности, что может произойти здесь:

  • первый запрос попадает на сервер и начинает выполнять ваш PHP, вызывая session_regenerate_id(true) уничтожить старую сессию
  • это приведет к тому, что ответ из скрипта PHP будет включать Set-Cookie: sessionid=something заголовок, запрашивающий браузер обновить cookie, чтобы он указывал на новый сеанс
  • но браузер еще не получил ответ от скрипта
  • вы нажимаете второй раз
  • браузер отбрасывает существующий запрос. любой Set-Cookie заголовок не будет прослушиваться сейчас
  • браузер отправляет новый запрос на ваш сервер. Браузер ничего не знает о новом сеансе, поэтому он включает в себя старый куки сеанса
  • ваш сценарий видит старый файл cookie сеанса, который ничего не указывает, поэтому пользователь должен начать новый сеанс, который не вошел в систему

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

Вы должны только session_regenerate_id когда изменяется аутентификация, связанная с сеансом (прежде всего, когда пользователь входит в систему).

Изменение идентификаторов сеансов не мешает фиксации сеансов; это только смягчение ситуации, когда фиксация сеанса уже произошла с помощью каких-либо других средств (например, уязвимое приложение на соседнем поддомене внедряет файл cookie в общий родительский домен).

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

0

По вопросам рекламы [email protected]