php для аутентификации пользователя в форме входа в систему

У меня есть следующий код, предназначенный для начала сеанса и хранения данных имени пользователя / пароля, и если ничего не отправлено или данные сеанса не сохранены, перенаправляйтесь на страницу сбоя.

session_start(); if(isset($_POST['username']) || isset($_POST['password'])) { $username = $_POST['username']; $password = $_POST['password']; $_SESSION['username'] = $username; $_SESSION['password'] = $password; } if(isset($_SESSION['username']) || isset($_SESSION['password'])){ $navbar = "1"; $logindisplay = "0"; $username = $_SESSION['username']; $password = $_SESSION['password']; } else { header('Location:http://website.com/fail.php'); } $authed = auth($username, $password); if( $authed == "0" ){ header('Location:http://website.com/fail.php'); } 

Он не работает так, как должен, и перенаправляет меня на неудачу, хотя я представил свою информацию и сохранил ее в сеансе. Я делаю что-то неправильно?

ПРИМЕЧАНИЕ, функция authed работала нормально, прежде чем добавить код сеанса.

как об использовании этого для настройки сеанса

 session_start(); if( isset($_POST['username']) && isset($_POST['password']) ) { if( auth($_POST['username'], $_POST['password']) ) { // auth okay, setup session $_SESSION['user'] = $_POST['username']; // redirect to required page header( "Location: index.php" ); } else { // didn't auth go back to loginform header( "Location: loginform.html" ); } } else { // username and password not given so go back to login header( "Location: loginform.html" ); } 

и в верхней части каждой «защищенной» страницы используйте этот код:

 session_start(); session_regenerate_id(); if(!isset($_SESSION['user'])) // if there is no valid session { header("Location: loginform.html"); } 

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

 session_start(); unset($_SESSION['user']); session_destroy(); header("Location: loginform.html"); с session_start(); unset($_SESSION['user']); session_destroy(); header("Location: loginform.html"); 

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

Попробуйте следующее:

 <?php session_start(); if (isset($_POST['username']) && isset($_POST['password'])) { $username = $_POST['username']; $password = $_POST['password']; $authed = auth($username, $password); if (! $authed) { header('Location: http://website.com/fail.php'); } else { $_SESSION['username'] = $username; } } if (isset($_SESSION['username'])) { $navbar = 1; $logindisplay = 0; } else { header ('Location: http://website.com/fail.php'); } 

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

  • Не храните пароль в открытом тексте в сеансе. loggedIn = true ли пароль, затем сохраните loggedIn = true или что-то подобное в сеансе.

  • Проверьте, что пароль и имя пользователя $_POSTed , а не || (или).

  • Не переводите пароль и имя пользователя взад и вперед между $password и $_SESSION['password'] . Решите на одном месте, чтобы сохранить данные и оставить их там.

  • Вы проверили, можете ли вообще что-нибудь сохранить в сеансе? Cookies в порядке и т. Д.??

Чтобы значительно упростить код, разве это не все, что вам нужно сделать?

 if (isset($_POST['username'] && isset($_POST['password'])) { if (auth($_POST['username'], $_POST['password'])) { $_SESSION['user'] = /* userid or name or token or something */; header(/* to next page */); } else { // display "User credentials incorrect", stay on login form } } else { // optionally: display "please fill out all fields" } 

Вот несколько других вещей, которые могут или не могут помочь вам, кстати:

  • У вас есть error_reporting ? ( см. также )
  • У вас есть display_errors ?
  • Первое, что вы делаете на своей странице, является session_start ? До выхода ничего не должно быть
  • Созданы ли файлы cookie на стороне клиента?
  • заголовок Расположение указывает браузеру, что он должен перейти на другую страницу; это не останавливает выполнение скрипта PHP. Вы можете захотеть (почти всегда так или иначе) добавить «exit» после него.

Заголовки не являются функциональными вызовами. Они помещают директиву в заголовки HTTP, а последний из них – тот, который будет обработан. Скажем так, если у вас есть что-то вроде этого

 if ($bAuthed) { header("location: login.php"); } // error case header("location: error-login.php"); 

Вы всегда будете перенаправлены на error-login.php независимо от того, что произойдет. Заголовки не являются функциональными вызовами!

Решение моей конкретной проблемы выше

 session_start(); if(isset($_POST['username']) || isset($_POST['password'])){ $username = $_POST['username']; $password = $_POST['password']; $_SESSION['username'] = $username; $_SESSION['password'] = $password; } if(isset($_SESSION['username']) || isset($_SESSION['password'])){ $navbar = "1"; $logindisplay = "0"; $username = $_SESSION['username']; $password = $_SESSION['password']; $authed = auth($username, $password); if( $authed == "0" ){ header('Location:http://website.com/fail.php'); } } else { header('Location:http://website.com/fail.php'); } 

Не используйте секцию else во втором операторе if .

 session_start(); if(isset($_POST['username']) || isset($_POST['password'])) { $username = $_POST['username']; $password = $_POST['password']; $_SESSION['username'] = $username; $_SESSION['password'] = $password; } if(isset($_SESSION['username']) || isset($_SESSION['password'])){ $navbar = "1"; $logindisplay = "0"; $username = $_SESSION['username']; $password = $_SESSION['password']; } $authed = auth($username, $password); if( $authed == "0" ){ header('Location:http://website.com/fail.php'); }