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

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

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

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

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

Спасибо огромное!

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

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

Замечание … С количеством переменных я рекомендую массив для сеанса ['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(); } } } с // 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(); } } } 

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

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

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

 `$_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

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

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

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

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

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

если он взломан, это может измениться …

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

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