session_regenerate_id - это хороший способ предотвратить хакинг сессий, потому что хайккинг обычно происходит на более позднем этапе после кражи идентификатора сессии.
Например:
- Посетите форум, на котором XSS инъекция
- Используйте клики по ссылке, и она украдет сессию
- Пользователь понимает, что это не то, что он хотел, отжимает
- Сайт восстанавливает новый идентификатор сеанса, пользователь сохраняется, фиксация сеанса не происходит, поскольку украденный идентификатор сеанса, вероятно, не сразу используется сервером.
Если по какой-либо причине фиксация становится чем-то живым и очень быстрым, например, автоматизированным процессом, то нет, вы правы, это не спасет пользователя. Вот почему вы должны полагаться не только на session_regenerate_id, но и на IP-адрес пользователя.
if(!session_id()){
session_start();
if(!isset($_SESSION['user_ip'])){
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
}
if($_SESSION['user_ip'] !== $_SERVER['REMOTE_ADDR']){
exit('highjacking detected, session terminated');
}
session_regenerate_id();
}
Очевидно, что если взлом происходит из той же сети, например с рабочего места, обнаружение ip не будет работать, поэтому вы также можете использовать проверку UserAgent. Но это становится немного излишним в зависимости от чувствительности ваших данных.
Надеюсь, это поможет ...