Простой PHP Многопользовательский логин, разные страницы в зависимости от пользователя - что здесь не так? - PullRequest
0 голосов
/ 22 ноября 2011

Я искал простую форму PHP-сценария +, которая перенаправляла пользователей на определенные URL-адреса на основе введенного имени пользователя и пароля.

Код в верхней части страницы:

<?php 
session_start();
$data=array("user1"=>array("url"=>"file1.php","password"=>"pass1"),
"user2"=>array("url"=>"file2.php","password"=>"pass2"));

if(isset($_POST['username']) && isset($_POST['password'])) {
    if($data[$_POST['username']]['password'] == $_POST['password']) {
        $_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
        header('Location: ' . $data[$_POST['username']]['url']);

        login('<p class="alert">Incorrect username or password.</p> ');
    }
} else {
    login();
}
?><?php
function login($response='Please enter your username and password.') {
?>

Это в теле:

<p><?=$response?></p>
<form action="" method="post">
    <table width="400" border="0" cellspacing="0" cellpadding="4">
        <tr>
            <td width="90"><label class="loginform" for="username">Username:</label></td>
            <td width="294"><input name="username" type="text" /></td>
        </tr>
        <tr>
            <td><label for="password">Password:</label></td>
            <td><input name="password" type="password"></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td><input type="submit" value="Login" /></td>
        </tr>
    </table>
</form>
<?php } ?>

Этот код работает правильно, но если пользователь вводит неправильный пароль, он перенаправляет на пустую страницу (в частности, он загружает страницу только после последней:

<?php } ?>

Я понимаю, что этот код написан плохо, так что это первая проблема. Я бы очень хотел увидеть хорошо написанную версию (просто учиться и изучать ее). Но если это невозможно, как бы я исправил этот код, чтобы неверный пароль не сломал страницу?

Это странно, потому что, если вы ничего не вводите (просто нажимаете «Отправить»), он говорит «Неверное имя пользователя или пароль», и если вы просто вводите неправильное имя пользователя без пароля, то же самое. Но с именем пользователя + неправильным паролем или только неправильным паролем, он переходит на пустую страницу.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Еще один урок, почему отступы важны.Посмотрите:

if(isset($_POST['username']) && isset($_POST['password'])) 
{
    if($data[$_POST['username']]['password'] == $_POST['password']) 
    {
        $_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
        header('Location: ' . $data[$_POST['username']]['url']);

        login('<p class="alert">Incorrect username or password.</p> ');
    }
} else {
    login();
}

Теперь вы видите.Что произойдет, если имя пользователя и пароль введены POST, но не верны?Ничего, он выйдет из обоих блоков if.

Это подойдет:

if(isset($_POST['username']) && isset($_POST['password'])) 
{
    if($data[$_POST['username']]['password'] == $_POST['password']) 
    {
        $_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
        header('Location: ' . $data[$_POST['username']]['url']);
        exit();
    }
    else
    {
        login('<p class="alert">Incorrect username or password.</p> ');
    }
} else {
    login();
}

Или, еще лучше, imho:

$warning = '';

if(isset($_POST['username']) && isset($_POST['password'])) 
{
    if($data[$_POST['username']]['password'] == $_POST['password']) 
    {
        $_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
        header('Location: ' . $data[$_POST['username']]['url']);
        exit();
    }
    else
    {
        $warning = '<p class="alert">Incorrect username or password.</p> ';
    }
}

login($warning);

И я надеюсь, что я нене должен вам сказать, что это вообще не защита, если вы не сравните $_SESSION['username'] на каждой странице после входа в систему.: -)

0 голосов
/ 22 ноября 2011

Найдите разницу ниже:)

Совет: попробуйте сделать отступ в скобках, тогда ошибка будет очевидна в первую очередь.

оригинал:

if(isset($_POST['username']) && isset($_POST['password'])) {
if($data[$_POST['username']]['password'] == $_POST['password']) {
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);

login('<p class="alert">Incorrect username or password.</p> ');

}
} else {
login();
}

исправлено:

if(isset($_POST['username']) && isset($_POST['password'])) {
if($data[$_POST['username']]['password'] == $_POST['password']) {
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);

} else {
login('<p class="alert">Incorrect username or password.</p> ');
}
} else {
login();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...