Почему моя функция fetch() не возвращает всю строку?

#php #mysql

#php #mysql

Вопрос:

Я довольно новичок в PHP, и я не могу понять, почему функция fetch() не возвращает всю строку и почему я не могу ссылаться на пароль из запроса в моем login.php досье. Этот веб-сайт намеренно уязвим, чтобы я мог использовать его в качестве целевой практики для моих инструментов python. Я обнаружил проблему при попытке сравнить введенный пользователем пароль и пароль, соответствующий имени пользователя в базе данных. В конце концов, я просто хочу иметь возможность извлечь правильный пароль из базы данных и сравнить его с паролем, который пользователь ввел в поле пароля. Любая помощь приветствуется.

Если это поможет, я использовал эту статью в качестве руководства: https://dzone.com/articles/ceate-a-login-system-using-html-php-and-mysql

Прямо сейчас $row[‘password’] = «», когда в базе данных он должен быть равен «badpassword».

config.php

 <?php
define('DBSERVER', 'localhost');
define('DBUSERNAME', 'root');
define('DBPASSWORD', 'toor');
define('DBNAME', 'userlogin');

$db = mysqli_connect(DBSERVER, DBUSERNAME, DBPASSWORD, DBNAME);

if($db == false){
  die("Error: connection error." . mysqli_connect_error());
}
?>
  

session.php

 <?php
session_start();

if (isset($_SESSION["userid"]) amp;amp; $_SESSION["userid"] == true) {
  header("location: welcome.html");
  exit;
}
?>
  

login.php

 <?php
require_once "config.php";
require_once "session.php";
if($_SERVER["REQUEST_METHOD"] == "POST" amp;amp; isset($_POST['submit'])) {
  $username = trim($_POST['username']);
  $password = trim($_POST['password']);
  if(empty($username)) {
    echo "<h1>Please enter your username.</h1>";
  }
  if(empty($password)) {
    echo "<h1>Please enter your password.</h1>";
  }
  if(empty($error)) {
    if($query = $db->prepare("SELECT * FROM user WHERE username = ?")){
      $query->bind_param('s', $username);
      $query->execute();
      $row = $query->fetch();
      if($row){
        if($password == $row['password']){
          $_SESSION["userid"] = $row['id'];
          $_SESSION["user"] = $row;
          header("location: welcome.html");
          exit;
        } else {
          echo "<h1>The password is not valid.</h1>";
        }
      } else {
        echo "<h1>No user exists with that username.</h1>";
      }
    }
    $query->close();
  }
  mysqli_close($db);
}
?>
  

login.html

 <!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="styles.css">
  <title>Login</title>
</head>
<body>
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="about.html">About</a></li>
    <li><a href="news.html">News</a></li>
    <li style="float:right"><a class="active" href="login.html">Login</a></li>
  </ul>
  <form class="box" action="login.php" method="POST">
    <h1>Login</h1>
    <input type="text" name="username" placeholder="Username">
    <input type="password" name="password" placeholder="Password">
    <input type="submit" name="submit" value="Login">
    <br>
    <a href="register.html">Register</a>
  </form>
</body>
</html>
  

База данных

 CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  `username` varchar(25) NOT NULL,
  `password` varchar(25) NOT NULL,
  PRIMARY KEY (`id`)
  UNIQUE KEY `username` (`username`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
  

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

1. Если вы хотите использовать fetch() , то, похоже, вы также должны использовать bind_result() php.net/manual/en/mysqli-stmt.fetch.php Я сам не использую mysqli, поэтому я не уверен, является ли это проблемой или нет. Что происходит, $row когда вы var_dump это делаете?

2. Более того, кажется, что вы храните пароли в виде обычного текста. Не делайте этого — используйте password_hash() для их хранения и password_verify() сравнения. Вам также нужно будет расширить столбец, в котором вы храните пароль, поскольку хэшированный пароль намного длиннее 25 символов. В статье, на которую вы ссылаетесь, используются эти функции, но вы, похоже, пропустили этот момент.

3. @droopsnoot Не использует хэшированные пароли намеренно. Я создаю целенаправленно уязвимый веб-сайт, который я могу использовать в качестве целевой практики для своих инструментов python.

4. Пожалуйста, используйте CHARSET=utf8mb4 в любом современном проекте

5. @droopsnoot хммм var_dump($row) == bool(true)

Ответ №1:

вы можете использовать $query->get_result() и fetch_assoc() для извлечения строки :

 $username = trim($_POST['username']);
if ($query = $db->prepare("SELECT * FROM user WHERE username = ?") ) {
    $query->bind_param('s', $username);
    $query->execute();
    $res = $query->get_result();
    $row = $res->fetch_assoc();
    print_r( $row );
}
$query->close();
  

login.php может выглядеть так :

  • примечание 1. заголовок изменен на echo только для отображения, а не для перенаправления.
  • примечание 2. $query-> close(); и mysqli_close($db); добавлены перед выходом.
 
$error = '';
if($_SERVER["REQUEST_METHOD"] == "POST" amp;amp; isset($_POST['submit'])) {
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);

    if(empty($username)) {
        echo "<h1>Please enter your username.</h1>";
    }

    if(empty($password)) {
        echo "<h1>Please enter your password.</h1>";
    }

    if(empty($error)) {
        if ($query = $db->prepare("SELECT * FROM user WHERE username = ?") ) {

            $query->bind_param('s', $username);
            $query->execute();
            $res = $query->get_result();
            $row = $res->fetch_assoc();
            
            if($row){
                if($password == $row['password']){
                  $_SESSION["userid"] = $row['id'];
                  $_SESSION["user"] = $row;
                  echo("location: welcome.html");
                  $query->close();
                  mysqli_close($db);
                  exit;
                } else {
                  echo "<h1>The password is not valid.</h1>";
                }
            } else {
                echo "<h1>No user exists with that username.</h1>";
            }
        }
        $query->close();
    } // empty($error)
    mysqli_close($db);
} // server