#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