PHP сессии для аутентификации пользователя в форме входа - PullRequest
7 голосов
/ 07 августа 2009

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

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 работала нормально, прежде чем я добавил код сеанса.

Ответы [ 7 ]

20 голосов
/ 07 августа 2009

как насчет использования этого для установки сеанса

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");
}

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

session_start();
unset($_SESSION['user']);
session_destroy();
header("Location: loginform.html");
9 голосов
/ 07 августа 2009

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

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

<?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');
}
3 голосов
/ 07 августа 2009

Только некоторые случайные точки, даже если они не имеют отношения к проблеме:

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

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

  • Не передавайте пароль и имя пользователя взад-вперед между $password и $_SESSION['password']. Выберите одно место для хранения данных и оставьте его там.

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

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

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"
}
1 голос
/ 07 августа 2009

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

if ($bAuthed)
{
     header("location: login.php");
}

// error case
header("location: error-login.php");

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

1 голос
/ 07 августа 2009

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

  • Есть ли у вас error_reporting? ( см. Также )
  • У вас есть display_errors?
  • session_start первое, что вы делаете на своей странице? Должно быть Ничего Вывод до
  • Файлы cookie создаются на стороне клиента?
  • заголовок Location указывает браузеру, что он должен перейти на другую страницу; это не останавливает выполнение скрипта PHP. Возможно, вы захотите (почти всегда в любом случае) добавить «выход» после него.
0 голосов
/ 16 ноября 2017

Не использовать 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');

}
0 голосов
/ 07 августа 2009

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

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');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...