Подтвердить что ты не робот

Закройте сеанс и запустите новый

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

Это мой код до сих пор после множества неудачных попыток:

<?php

// Security check
if( isset($_SESSION['ip_address']) && $_SERVER['REMOTE_ADDR']!=$_SESSION['ip_address'] ){
    // Check failed: we'll start a brand new session
    session_regenerate_id(FALSE);
    $tmp = session_id();
    session_write_close();
    unset($_SESSION);
    session_id($tmp);
    session_start();
}

// First time here
if( !isset($_SESSION['ip_address']) ){
    $_SESSION['ip_address'] = $_SERVER['REMOTE_ADDR'];
    $_SESSION['start_date'] = new DateTime;
}

Официальная документация о сеансах ужасно запутанна: (

Обновление: Я публикую некоторые выводы, которые я получил через пробную версию и ошибку. Кажется, они работают:

<?php

// Load the session that we will eventually discard
session_start();

// We can only generate a new ID from an open session
session_regenerate_id();

// We store the ID because it gets lost when closing the session
$tmp = session_id();

// Close session (doesn't destroy data: $_SESSION and file remains)
session_destroy();

// Set new ID for the next session
session_id($tmp);
unset($tmp);

// Start session (uses new ID, removes values from $_SESSION and loads the new ones if applicable)
session_start();
4b9b3361

Ответ 1

Просто позвоните session_unset после session_regenerate_id до reset $_SESSION для текущего сеанса:

if (isset($_SESSION['ip_address']) && $_SERVER['REMOTE_ADDR']!=$_SESSION['ip_address']) {
    // Check failed: we'll start a brand new session
    session_regenerate_id(FALSE);
    session_unset();
}

Ответ 2

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

вот функция, которую многие используют для снятия отпечатка пальца сессии:

function fingerprint() {
    $fingerprint = $server_secure_word;
    $fingerprint .= $_SERVER['HTTP_USER_AGENT'];
    $blocks = explode('.', $_SERVER['REMOTE_ADDR']);
    for ($i=0; $i<$ip_blocks; $i++) {
        $fingerprint .= $blocks[$i] . '.';
    }
    return md5($fingerprint);
}

Ответ 3

Используйте этот

unset($_SESSION['ip_address'])

вместо 'unset ($ _ session)' Вы также можете использовать session_destroy.

Ответ 4

session_destroy будет уничтожать данные сеанса. Например,   

session_start();
$_SESSION["test"] = "test";
session_write_close();
session_start();
// now session is write to the session file
// call session_destroy() will destroy all session data in the file.
session_destroy();
// However the you can still access to $_SESSION here
print_r($_SESSION);
// But once you start the session again
session_start();
// all session data is gone as the session file is now empty
print_r($_SESSION);

выводит

array([test] => "test")array()