У меня есть следующий код, предназначенный для начала сеанса и хранения данных имени пользователя / пароля, и если ничего не отправлено или данные сеанса не сохранены, перенаправляйтесь на страницу сбоя.
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
? До выхода ничего не должно быть Заголовки не являются функциональными вызовами. Они помещают директиву в заголовки 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'); }