Intereting Posts
PHP Soap Server: невозможно получить доступ к параметрам запроса soap в моем вызываемом классе Извлечь адрес электронной почты из строки – php Создание «значков» для моего сайта, лучший способ хранить пользовательские значки? Использование PHP PHP, обслуживающий одну страницу за раз Правила CSS не применяются к динамически генерируемым элементам Каков наилучший способ хранения переменных класса в PHP? Parsley ajax отправляет переменные сообщения PHP: Html отправлять электронную почту в формате html «Строгие стандарты: только переменные должны передаваться по ссылке» error Как удалить данные на основе значения в переменной сеанса PHP Неустранимая ошибка в mysqli_connect (); Клавиши сортировки массива PHP PHP – синтаксический анализ данных многочастной формы Как удалить теги и многое другое из строки? PHP & Javascript: Свойства описания файла изображения (вкладка «Сводка»)

Надежное создание и уничтожение сеансов входа в PHP

Это мой код для проверки подлинности на веб-сайте. Я не уверен, правильна ли моя логика. Если имя пользователя и пароль верны, произойдет следующее:

if(session_start()) { session_regenerate_id(true);//without this the session ID will always be the same $_SESSION['loggedInUser'] = $uName; echo 'You are now logged in'; } else echo 'Right password/username but session failed to start'; 

Последующие страницы проверяют, вошел ли пользователь в систему

 session_start(); if(isset($_SESSION['loggedInUser']) { //rest of page } else echo 'you must log in'; 

При выходе из системы

 session_start();//if I don't have this the next line produces an error session_unset();//destroys session variables session_destroy();//ends session 

Я не хочу вызывать session_start () при выходе из системы, но если у меня его нет, я получаю сообщение « Trying to destroy uninitialized session . Как я могу это исправить?

Рекомендовать или не создавать отпечаток пальца на основе IP-адреса и агента пользователя? Я краснею, это плохо, потому что несколько компьютеров могут использовать один и тот же IP-адрес, если они есть, например, компьютерная лаборатория, и весь трафик проходит через прокси-сервер, и тот же компьютер может изменить его IP-адрес, если он динамический. С другой стороны, как часто это происходит? Возможно, несколько заблокированных действительных применений, чтобы предотвратить захват всех сеансов.

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

5/6 ответов имеют голоса менее 0 🙁 Может ли проголосовать за проголосовавших, поэтому я знаю, на что обратить внимание?

Прежде всего, вы должны прочитать Руководство по кодированию безопасности WebAppSec Mozilla – Управление сеансом и OWASP A3-Broken Authentication и Session Management . Вы можете настроить обработчик сеанса PHP для удовлетворения этих требований.

Первым недостатком, который вы должны предотвратить, является A9-Недостаточная защита транспортного уровня . Короче говоря, вы не хотите, чтобы кто-то уговаривал сеанс с помощью инструмента, такого как Firesheep . Эта атака может быть предотвращена, заставляя браузер отправлять только идентификатор сеанса по https:

 session.cookie_secure=1 

Вы можете запретить злоумышленнику получать идентификатор сеанса с помощью XSS, установив флаг httponly :

 session.cookie_httponly=1 

Вы всегда хотите использовать файл cookie для хранения идентификатора сеанса. Если идентификатор сеанса можно передать с использованием GET или POST-переменной, злоумышленник может использовать атаку Session Fixation для захвата сеанса. Другой способ думать об этой атаке состоит в том, что вы не хотите, чтобы злоумышленник создавал сеанс для другого пользователя:

 session.use_cookies=1 session.use_only_cookies=1 

Затем вы хотите, чтобы у вас было по крайней мере 128 бит энтропии от CSPRNG. В системах * nix вы можете использовать /dev/urandom :

 session.entropy_file="/dev/urandom" session.entropy_length=16 

Обработчик сеанса – это еще не все. Вам все равно нужно беспокоиться о атаках Cross-Site Request Forgery (также называемых CSRF или «Session Riding») и Cross-Site Scripting (XSS). XSS можно использовать для защиты CSRF (даже с помощью http_only cookie!). Clickjacking также может использоваться злоумышленником для выполнения несанкционированных действий.

После того, как вы установите эти параметры конфигурации, просто вызовите session_start() . Что касается уничтожения сеанса вызова session_destroy() когда пользователь выходит из системы, это так просто!

Чтобы безопасно уничтожить сеанс, я бы использовал следующий код:

 session_start(); // Unset all session values $_SESSION = array(); // get session parameters $params = session_get_cookie_params(); // Delete the actual cookie. setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]); // Destroy session session_destroy(); 

Чтобы уничтожить сеанс, вам нужно сначала запустить его, поскольку вы обнаружили, что он не работает, если вы не включили session_start ();

Session_regenerate_id (); Функция генерирует новый идентификатор сеанса для пользователя. Если используется с true (session_regenerate_id (true);), тогда старый идентификатор сеанса удаляется с сервера, когда он генерирует новый. Причина создания нового идентификатора сеанса на каждой странице заключается в том, что он делает попытку захвата сеанса намного сложнее (почти невозможно), потому что пользователи постоянно меняют идентификатор сеанса.

(Просмотреть руководство PHP.net по session_regenerate_id (); )

При аутентификации пользователя вы всегда должны проверять что-то вроде IP-адреса или браузера, это постоянные вещи, отправленные в запросе на сервер, которые не меняются в течение срока вашей сессии, а если они это делают, вы знаете что-то изворотливое, что происходит , Я всегда создаю две переменные сеанса, которые хранят идентификатор пользователя, поэтому я могу запросить базу данных для данных, а другую, которая хранит пароль пользователя, IP-адрес и строку браузера в одном хэше (sha512).

 $user_id = $_SESSION['user_id']; $login_string = $_SESSION['login_string']; // Query Database and get hashed password $login_check = hash('sha512', $password.$ip_address.$user_browser); if($login_check == $login_string) { // Logged In!!!! return true; } else { // Not logged in return false; } 

Пароль защищен, даже если он хранится в сеансе. Это связано с тем, что пароль хэшируется (в данном случае два раза), и поскольку данные сеанса не хранятся на компьютере пользователя (например, файлы cookie), он сохраняется в файле сеанса.

Я написал статью о wikihow.com о безопасном входе в систему и аутентификации, можно найти здесь .

Вы можете просто написать:

 session_start(); // session should be started before it can be used. 

Вы можете назначить идентификатор пользователя в журнале. Для этого вы можете ввести имя пользователя и пароль из пользовательского ввода и проверить его в своем db и вернуть идентификатор пользователя. Для большей безопасности вы можете иметь строки, например. «demo» и «test» просто md5 и смешать его с userid следующим образом.

 $userid=md5("demo").$userid.md5("test");// you can set any string instead of demo and test. $_SESSION['userid']=$userid; 

Используя его на другой странице,

 session_start(); // If you are have not started it or included above code file in it. 

Как вы знаете, строки при использовании просто соответствуют ему и найти точный идентификатор пользователя из него и использовать его в вашем коде.

Для уничтожения просто используйте:

 session_unset($_SESSION['userid']); // It will only unset the session userid completely. 

Убедитесь, что перед использованием любого сеанса вам нужно его запустить. В лучшем случае вы можете начать сеанс в одном файле, скажем, init.php и включить его там, где вы хотите использовать сеанс

Вы можете сначала использовать session_id() чтобы определить, получил ли пользователь уже сеанс, а если нет, то используйте session_start() .

примеры кодов из литиевого фемеррока:

 /** * Starts the session. * * @return boolean True if session successfully started (or has already been started), * false otherwise. */ protected static function _start() { if (session_id()) { return true; } ... return session_start(); } 

После вызова _start() вы можете безопасно вызвать session_destroy()

Чтобы уничтожить сеанс без использования «start_session ()», сначала проверьте, есть ли активный сеанс, не похожий ниже

 $existingSessionId = session_id(); if ($existingSessionId != "") { // Initialize the session. session_start(); // Unset all of the session variables. $_SESSION = array(); // If it's desired to kill the session, also delete the session cookie. // Note: This will destroy the session, and not just the session data! if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // Finally, destroy the session. session_destroy(); } else { // No Active sessions } 

session_regenerate_id (true), просто замените старый идентификатор сеанса на новый, но он не отключит старый идентификатор сеанса. Это необходимо позаботиться о session_destroy и удалении cookie сеанса.

Браузер отправит cookie сеанса на сервер, когда сеанс будет уничтожен. PHP получит этот идентификатор сеанса, и когда вы запустите start_session (), он будет использовать идентификатор сеанса, отправленный браузером. Если вы удалите файл cookie сеанса, session_start сгенерирует новый идентификатор сеанса, и вам не нужно будетзывать session_regenerate_id ()