Форма входа позволяет войти в систему любому пользователю с любым паролем

#php #web #login #db2 #credentials

#php #веб #аутентификация #db2 #учетные данные

Вопрос:

Я использую php и ibm db2 для создания простой страницы входа. Однако код не обеспечивает желаемых результатов, как ожидалось.

Вот мой код:

 if (isset($_POST['login'])) {
$username = ($_POST['username']);
$password = ($_POST['password']);

if (empty($username)) {
    array_push($errors, "Username is required");
}
if (empty($password)) {
    array_push($errors, "Password is required");
}

elseif (count($errors)==0) {
    //$password = md5($password);

    $query = "SELECT * FROM people WHERE username = '$username' AND password = '$password'";
    $results = db2_exec($db, $query);

    if (db2_num_rows($results)) {

        $_SESSION['username'] = $username;
        $_SESSION['success'] = "Logged in successfully";
        //echo "<script type='text/javascript'>window.location.href = 'index.php';</script>";
        header('Refresh: 0; URL=index.php', true, 301);
    }else{
        array_push($errors, "Wrong username/password combination, Please try again.");
    }
}

}
  

Комментарии:

1. Не пишите «.. не работает …». Вместо этого, пожалуйста, напишите, что вы ожидали , а также что на самом деле происходит.

2. И не храните простые пароли в db.

3. Какую ошибку вы получаете? пожалуйста, опишите ошибку

4. Вы не можете использовать db2_num_rows() для получения размера результирующего набора, это ваша ошибка. Вы должны протестировать результат действия выборки.

5. @mao ok отредактировано выше, спасибо

Ответ №1:

Вы не можете использовать db2_num_rows () для получения количества строк в результирующем наборе.

Это db2_num_rows() сообщает о количестве вставленных / обновленных / удаленных строк, на которые повлияла самая последняя инструкция insert / update / delete.

Если вы хотите проверить наличие хотя бы одной строки в результирующем наборе, используйте один из документированных методов для извлечения строки из результирующего набора. Эти функции вернут true, если есть строка, в противном случае вернут false, если строки нет или их больше нет.

Рассмотрите возможность использования подготовленной инструкции в соответствии с примерами, чтобы запрос компилировался только один раз и выполнялся много раз.

Ответ №2:

теперь запрос решен, спасибо всем вам! Я публикую работающий код здесь;

 if (isset($_POST['login'])) {
$username = ($_POST['username']);
$password = ($_POST['password']);

if (empty($username)) {
    array_push($errors, "Username is required");
}
if (empty($password)) {
    array_push($errors, "Password is required");
}

elseif (count($errors)==0) {
    $password = md5($password);

    $query = "SELECT * FROM people WHERE username = '$username' AND password = '$password'";
    $results = db2_exec($db, $query);

    $row = db2_fetch_assoc($results);

    if ($row['username']== $username amp;amp; $row['password'] == $password) {

        $_SESSION['username'] = $username;
        $_SESSION['success'] = "Logged in successfully";

        header('Refresh: 0; URL=index.php', true, 301);
    }else{
        array_push($errors, "Wrong username/password combination, Please try again.");
    }
}
  

}