Вот код.Это простая операция, чтобы проверить, что идентификатор сеанса не был подделан путем проверки IP-адреса:
session_start();
$session_ip_address = $_SERVER['REMOTE_ADDR'];
if((!isset($_SESSION['SESSION_IP_ADDRESS'])) || !$_SESSION['SESSION_IP_ADDRESS']) {
$_SESSION['SESSION_IP_ADDRESS'] = $session_ip_address;
}
if($_SESSION['SESSION_IP_ADDRESS'] != $_SERVER['REMOTE_ADDR']) {
session_destroy();
$_SESSION['security_error'] = true;
}
Если я вставлю var_dump($_SESSION)
сразу после session_start()
и снова в конце сценария,затем в самый первый раз, когда я запускаю код (без набора файлов cookie сеанса), я вижу, что сначала массив пуст, затем ему назначен мой IP-адрес для ключа 'SESSION_IP_ADDRESS'.Все идет нормально.Но когда я снова запускаю код, теперь он показывает, что «SESSION_IP_ADDRESS» сохраняется как ссылка сразу после начала сеанса (я могу определить это по амперсанду, добавленному к строке).Когда я запускаю его в третий раз, я вижу, что SESSION_IP_ADDRESS теперь является пустой ссылкой ('SESSION_IP_ADDRESS' => &null
) сразу после начала сеанса.Что происходит?!
Повторим, это вывод в первый раз:
array(0) {
}
array(1) {
["SESSION_IP_ADDRESS"]=>
string(11) "xx.xx.xxx.x"
}
Это вывод во второй раз:
array(1) {
["SESSION_IP_ADDRESS"]=>
&string(11) "xx.xx.xxx.x"
}
array(1) {
["SESSION_IP_ADDRESS"]=>
&string(11) "xx.xx.xxx.x"
}
Ив третий раз и каждый раз с тех пор:
array(1) {
["SESSION_IP_ADDRESS"]=>
&NULL
}
array(1) {
["SESSION_IP_ADDRESS"]=>
&string(11) "xx.xx.xxx.x"
}