Почему эта страница входа не обнаруживает правильный пароль? - PullRequest
3 голосов
/ 19 мая 2011

Я делаю администратора для входа в PHP. Я следовал двум урокам на Youtube, и все комментарии говорят, что это работает. Но это не работает для меня.

Если я введу неправильный пароль, я получу «неправильное имя пользователя и пароль», как и ожидалось. Но если я введу правильный пароль, я также получу «неправильное имя пользователя и пароль». Соединение с базой данных, кажется, в порядке.

index.htm (основной логин):


<form method="POST" action="checklogin.php" name="form1">

<label for="username" class="label">Username:</label><input class="inputstyle2w" type="text" name="username">

<br>

<label for="password" class="label">Password:</label><input class="inputstyle22" type="password" name="password">   
<input type="submit" value="Login" name="submit">

</form> 

Это checklogin.php:

<?
$host = "cpanel1";
$username = "trekking_test";
$password = "testtest";
$db_name = "trekking_test";
$tbl_name = "members";

mysql_connect($host, $username, $password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error_db());

$myusername = $_POST['myusername'];
$mypassword = $_POST['mypassword'];

$sql = "SELECT * FROM $tbl_name WHERE username='$myusername' and password='mypassword'";
$result = mysql_query($sql);

$count = mysql_num_rows($result);

if($count==1) {
    session_register("myusername");
    session_register("mypassword");
    header("location:control.php");
    }
    else {
        echo "Wrong Username or Password";
        }

?>

И, наконец, страница администратора (control.php):

<?
session_start();
if(!session_is_registered(myusername)) {
    header("location:index.htm");
}
?>


<!doctype html>

<html lang="en" class="no-js">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE-edge; chrome=1">
        <meta name="description" content="Tower 2.0 vefumsjónarkerfi">
        <meta name="author" content="Nicejob">
        <link rel="stylesheet" type="text/css" href="css/adminstyle.css">

        <title>Tower 2.0 - you update your website by yourself!</title>

    </head>

    <body>
blah blah - you are not suppost to see this unless you are logged in
    </body>     

</html>

Ответы [ 7 ]

5 голосов
/ 19 мая 2011

Разве ваши входные данные не должны называться myusername и mypassword?Это то, что вы ищете с вашим $ _POST ['myusername']; ...

Я бы поспорил, если вы отобразите $ myusername и $ mypassword сразу после того, как вы установите их в PHP, вы обнаружите, что онипусто, потому что вы не публикуете «myusername», просто «username».

4 голосов
/ 19 мая 2011

Вы забыли «$» перед «mypassword» в своем запросе SQL.

И ваши поля ввода в HTML-форме называются «username» и «password», но вы ищете «myusername» и «mypassword "в массиве $ _POST.

Также ознакомьтесь с SQL-инъекцией.Ваш код уязвим.

2 голосов
/ 19 мая 2011

Это не ответ на ваш вопрос. Вот почему учебники YouTube не являются идеальным средством обучения.

  1. Вам необходимо санировать входные данные, чтобы предотвратить SQL-инъекцию. Проверьте ссылку, которую Пекка разместил в комментариях , для хорошей информации о том, что вы защищаете. Для MySQL вам понадобится функция mysql_real_escape_string, но помните, что вы не можете вызывать ее, пока не подключитесь к базе данных, так что имейте это в виду.
  2. Пароли должны никогда храниться в виде простого текста. Лучше всего использовать односторонний алгоритм хеширования. Это, конечно, имеет две свои оговорки:

    а. Убедитесь, что вы выбрали подходящий алгоритм. MD5 и SHA1 являются не соответствующими. Некоторые методы поиска: Eksblowfish (также известный как bcrypt, не путать с blowfish, блочным шифром с 2-сторонним шифрованием), Tiger, SHA-256, SHA-512 и Whirlpool

    б. Вы можете подумать, что для ваших целей это выходит за рамки, но чем больше вы будете практиковать практик , тем более естественными они станут для вас, и тем лучше вы станете программистом. Вы должны использовать вращающуюся соль, которая называется nonce , чтобы сделать пароли более безопасными. Соль - это строка, добавленная к паролю перед его шифрованием или хэшированием, так что pass_hash_actual = hash_function(salt + password).

    • Бесстыдный плагин блога : эта статья расскажет вам о конкретной реализации PHP для bcrypt, но я прежде всего буду ссылаться на нее для статей, на которые она ссылается, что даст Вы получите отличный обзор того, как и зачем использовать одноразовые номера с вашими паролями.

Я собирался написать здесь руководство по внедрению, но руководство onteria_ дает вам все необходимое в этом отделе, , поэтому убедитесь, что вы внимательно его прочитали . Удачного кодирования!

2 голосов
/ 19 мая 2011

Хорошо, это нормально:

$host = "cpanel1";
$username = "trekking_test";
$password = "testtest";
$db_name = "trekking_test";

Тебе это не нужно, твой SQL будет сбивать с толку чтением

$tbl_name = "members";

Отлично.

mysql_connect($host, $username, $password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error_db());

Нет, не плохо. Всегда экранируйте введенные пользователем данные РЕДАКТИРОВАТЬ , а имена форм не совпадают:

$myusername = $_POST['username'];
$mypassword = $_POST['password'];

Это должно быть:

$myusername = mysql_real_escape_string($_POST['username']);
$mypassword = mysql_real_escape_string($_POST['password']);

Вам не нужны все столбцы, поскольку вы просто проверяете счет, а mypassword имеет неправильный формат

$sql = "SELECT * FROM $tbl_name WHERE username='$myusername' and password='mypassword'";

Должно быть:

$sql = "SELECT `username` FROM `members` WHERE `username`='$myusername' and `password`='$mypassword'";

Вы предполагаете, что запрос выполнен успешно. Вы должны всегда обрабатывать случай, когда это не так:

$result = mysql_query($sql);
if(!$result) {
   // Let the user know something went wrong
}

session_register приведет в замешательство людей, незнакомых с традиционным синтаксисом $_SESSION['name'] = 'value', вместо этого используйте более традиционную форму. Вы просто хотите знать, что они вошли в систему, и session_start() не был вызван:

if($count==1) {
    session_start();
    $_SESSION['logged_in'] = true;
    // The correct format is "Location: control.php"
    header("Location: control.php");
    exit; //Always exit after sending Location headers
}
else {
    echo "Wrong Username or Password";
}

Тогда на вашей странице:

session_start();
if(!isset($_SESSION['logged_in'])) {
    // Once again, Location: 
    header("Location: index.htm");
    exit; // exit after redirect
}
1 голос
/ 19 мая 2011
if($count>0) {

Запрос вернет набор результатов с одной строкой, если данные для входа верны, и нулевыми строками, если данные для входа неверны.Используйте mysql_num_rows, чтобы узнать количество строк в наборе результатов и, следовательно, определить, были ли правильные данные для входа в систему или нет.

1 голос
/ 19 мая 2011

У вас есть несколько строк в таблице, которые соответствуют запросу?Поскольку вы используете:

if($count==1) {

, вы получите сообщение об ошибке, если найдено два или более совпадений.

1 голос
/ 19 мая 2011

Хорошо, с одной стороны, session_is_registered устарело

Сделайте это вместо:

if(!isset($_SESSION['myusername'])){...}

и добавьте что-нибудь для вывода ошибок mysql, например:

$result = mysql_query($sql) or die(mysql_error());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...