У меня сессия формируется следующим образом:
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 раза в секунду, макс.
Я пытался не использовать его как функцию, и безуспешно помещал его в абсолютную верхнюю часть страницы.
Кажется, ошибка session_regenerate(true)
,
Эта команда генерирует новый идентификатор сеанса. Параметр удалит старый файл сеанса если оно установлено в true. В этом коде для него установлено значение true, поэтому сеанс создается как запущенный, а затем напрямую закрывается и удаляется.
Я думаю, что это появляется только несколько раз, потому что команда вызывается после вызова session_start () и вывод уже запущен.
Попробуйте изменить параметр на ложный.
Для правильного использования session_regenerate()
смотреть в этот вопрос.
Похоже, вы сбрасываете старый идентификатор сессии при каждой загрузке страницы. Это не нужно, неэффективно и вызывает поломку.
Если вы перемещаетесь дважды в быстрой последовательности, что может произойти здесь:
session_regenerate_id(true)
уничтожить старую сессиюSet-Cookie: sessionid=something
заголовок, запрашивающий браузер обновить cookie, чтобы он указывал на новый сеансSet-Cookie
заголовок не будет прослушиваться сейчасЕсли у вас есть система защиты от кросс-сайт-запроса-подделки, основанная на хранении токена синхронизатора в сеансе, то повторное генерирование идентификатора сеанса при каждой загрузке страницы также сделает все формы, которые вы используете, неработоспособными, когда в браузере открыто несколько вкладок в сайт сразу, или когда пользователь перемещается с помощью кнопки Назад.
Вы должны только session_regenerate_id
когда изменяется аутентификация, связанная с сеансом (прежде всего, когда пользователь входит в систему).
Изменение идентификаторов сеансов не мешает фиксации сеансов; это только смягчение ситуации, когда фиксация сеанса уже произошла с помощью каких-либо других средств (например, уязвимое приложение на соседнем поддомене внедряет файл cookie в общий родительский домен).
Если вы не изменили идентификатор сеанса, то злоумышленник, который уже получил фиксацию сеанса, может получить полный захват сеанса, предоставив вам идентификатор сеанса, который она уже сгенерировала и знает, и разрешив вам войти в систему, используя этот сеанс, обновив его до аутентифицированный сеанс. При изменении идентификатора сеанса на границах авторизации это невозможно; худшее, что она может сделать сейчас, — это подтолкнуть вас к сеансу, в котором вы неожиданно вошли в нее как она. Что не идеально, но в целом это гораздо менее опасная атака.