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

Является ли php-сессия неизменной от пользователя?

Я разрабатываю собственное приложение, которое требует входа пользователя в систему. Все пользователи и пароли (зашифрованные) хранятся в базе данных. Когда пользователь пытается войти в систему, он выполняет поиск в базе данных имени пользователя и пароля. Если все в порядке, я сохраняю username в $_SESSION["username"], пользователь role (admin, author и т.д.) В $_SESSION["role"] и пользователь website в $_SESSION["website"] (мне нужно, чтобы сайт хранился, потому что приложение как "multisite" - мое приложение размещено на хостинге клиента, но администрация находится на моем сервере).

Я читал это Может ли пользователь изменить значение $_SESSION в PHP?, и я не понимаю. Является ли этот метод безопасным (для хранения данных и при входе пользователя) в $_SESSION?

Может ли пользователь изменить содержимое сеанса? (например, если пользователь вошел в систему, а $_SESSION["website"] - "example.com", может ли пользователь изменить сеанс $_SESSION["website"] на "example.org", чтобы разрушить другой сайт? Если да, как избежать или что безопасно альтернатива сессии?).

И, пожалуйста, скажите мне, что такое захват сеансов и как это может повлиять на мой сайт, а также, как заставить session_id динамически меняться?

Большое вам спасибо!

4b9b3361

Ответ 1

$_ SESSION сохраняется на сервере, поэтому пользователь не может его изменить (кроме случаев захвата сеанса)

Ответ 2

Сессия() - это серверная сторона, как отмечалось в @kd0807. Для получения дополнительной информации о Session Hijacking && Фиксация:

Боковое примечание... С количеством переменных я рекомендую массив для сеанса ['user']. пример....

$_SESSION['user'] => Array(
'userid'=> '123',
'username'=> 'some_joe',
'role' => 'customer', // user, customer, admin, moderator etc.
'website' => 'http://www.example.com'
);

// reading variables from array
$userid = $_SESSION['user']['userid'];
$username = $_SESSION['user']['username'];
// etc. etc.

Вот 3 очень упрощенные функции, которые я использую.

// determine if session has started
Function HasSessionStarted() {

    $result = false; // default to false

    // Check if session has started
    IF ((session_status() == PHP_SESSION_NONE) || (session_id() == '')) { 
        $result = true; 
    }

    return $result;

}

// Set a session value
Function Set_Session($name, $value) {
    /* @params value: can be a string or an array */
    $new_session = HasSessionStarted(); // Check Session Status

    IF ((isset($name)) && (isset($value))) {
        IF ($new_session) { session_start(); }
        $_SESSION[$name] = $value;
        IF ($new_session) { session_write_close(); }
    }

}

Function Unset_Session($name) {

    $new_session = HasSessionStarted(); // Check Session Status

    IF (isset($_SESSION[$name])) {
        IF ($new_session) { session_start(); }
        unset($_SESSION[$name]);
        IF ($new_session) { session_write_close(); }
    }

}

Ответ 3

Может ли пользователь изменить содержимое сеанса? (например, если пользователь зарегистрирован, а $_SESSION [ "username" ] - "example.com", может ли пользователь изменить сеанс $_SESSION [ "username" ] на "example.org", чтобы разрушить другой сайт?

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

$_SESSION['last_website'] = isset($_SERVER['HTTP_REFERER']) 
    ? $_SERVER['HTTP_REFERER'] 
    : $_SERVER['REQUEST_URI'];

в конечном итоге переопределит $_SESSION['last_website'].

Ответ 4

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

Ответ 5

В браузере хранится файл cookie, обычно PHPSESSID, который определяет, какой сеанс сервера используется пользователем. Если пользователь смог его украсть (обычно это происходит через уязвимости XSS), пользователь может потенциально взять под контроль другой сеанс пользователя.

Сами данные сеанса хранятся на сервере и могут быть изменены только в том случае, если пользователь каким-то образом смог загрузить и запустить вредоносный script на сервере

Ответ 6

`$_SESSION` variables are stored in the server and hence cannot be modified by the user.

Одна из лучших практик заключается в том, что мы должны продолжать изменять session id с нашего конца.

Вот почему мы используем функцию под названием session_regenerate_id().

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

Чтобы ответить на ваш вопрос в комментарии:

Всякий раз, когда вы начинаете сеанс, сервер отправляет обратно файл cookie, который будет содержать session id, имя файла cookie будет PHPSESSID, которое является именем по умолчанию. Вы также можете изменить его. Таким образом, этот id - это то, что продолжает меняться при использовании функции session_regenerate_id.

ПРИЧИНА ПОЧЕМУ ИСПОЛЬЗОВАТЬ ЭТО:

Это в основном помогает предотвратить атаки session fixation. В этой атаке злоумышленник попытается исправить идентификатор сеанса (SID) другого пользователя. Если он будет успешным, пользователь получит весь доступ к исходному пользователю и сможет делать все, что может сделать законный пользователь.

Итак, если вы регенерируете session id, предыдущий old session id будет более недействительным

Вы можете получить дополнительную информацию о фиксации сеанса В ВЕБ-САЙТЕ OWASP

Ответ 7

Да пользователь не может изменять переменные сеанса...

если он взломан, он может быть изменен...

вам нужно получить идентификатор пользователя, чтобы изменить $_SESSION["website"] в вашем текущем домене и использовать строгую проверку...

В противном случае они могут взломать его....