Я разрабатываю собственное приложение, которое требует входа пользователя в систему. Все пользователи и пароли (зашифрованные) хранятся в базе данных. Когда пользователь пытается войти в систему, он выполняет поиск в базе данных имени пользователя и пароля. Если все в порядке, то я храню 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"]
в вашем текущем домене и использовать строгую проверку …
В противном случае они могут взломать его ….