gpt4 book ai didi

php - 如何检查用户名和密码是否与数据库值匹配

转载 作者:行者123 更新时间:2023-12-04 15:48:49 25 4
gpt4 key购买 nike

如果这个问题看起来很愚蠢,我真的很抱歉。但是我几天来一直在尝试检查我的usernamepassword数据库中的内容与我在 html 中输入的内容相匹配页面...这是我的登录表单...

<form method="POST" action="Dashboard/Dashboard.php">

<div class="form-group md-form">
<!--<input type="email" class="form-control" id="email" value="" placeholder="Enter email address">-->
<i class="fa fa-user prefix grey-text"></i>
<input name="username" id="username" type="text" class="form-control" required>
<label for="defaultForm-email">Username</label>
</div>
<div class="form-group md-form">
<!--<input type="password" class="form-control" id="password" value="" placeholder="Enter password">-->
<i class="fa fa-lock prefix grey-text"></i>
<input name="password" id="password" type="password" class="form-control" required>
<label for="defaultForm-pass">Your password</label>
</div>
<div class="text-center">
<button type="reset" class="btn btn-amber btn-sm"><strong>Reset</strong></button>
<input type="submit" name="submit" id="submit" class="btn btn-green btn-sm" value="Sign in">
</div>

</form>

这是我在 php 中使用的代码( Dashboard.php)
<?php
$servername = "localhost";
$username = "root";
$password = "";
$databaseName = "test";

$conn = mysqli_connect($servername, $username, $password, $databaseName);

$un = $_POST['username'];
$pw = $_POST['password'];
print $pass . "_" . $email;

$query = mysqli_query($conn, "SELECT log_username,log_password FROM login WHERE log_username='$un' AND log_password='$pw'");

$result_can = mysqli_query($conn, $query);


while ($row = mysql_fetch_assoc($result_can)) {


$check_username = $row['username'];
$check_password = $row['password'];
}
if ($un == $check_username && $pw == $check_password) {
$message = "ok";
echo "<script type='text/javascript'>alert('$message');</script>";
header("Location: Doctors.php");
} else {
$message = "No";
echo "<script type='text/javascript'>alert('$message');</script>";
header("Location: Doctors.php");
}
?>

我真的尝试了数千次,但无法弄清楚我哪里出错了......有人可以帮助我吗?

我知道我的代码对 SQL 注入(inject)开放,但我不关心它,因为这是我需要向我的 friend 展示的示例 所以忽略那部分。

最佳答案

有几个问题,上面的评论提到了一些问题。
混合 mysql_* 与 mysqli_* API
您使用 mysqli_query() 调用查询但是您尝试使用 mysql_fetch_assoc() 获取结果.您不能混合使用这些不同的 API。 mysql_*函数不会使用您通过 mysqli_connect() 打开的连接,反之亦然。选择一个 MySQL 扩展并坚持下去。
提示:不要使用 mysql_*一点也不。它已被弃用,并已从 PHP 7.0+ 中删除
查询用户名和密码的条件
只需搜索用户名,然后获取密码。如果您同时搜索两者,则搜索将返回零行,除非使用了正确的密码。
你不想要那个。您希望避免将明文密码放在 SQL 查询中。只需搜索用户名,获取存储的密码,然后将获取的内容与用户输入的密码进行比较。
未初始化的变量
如果您从查询中获取零行,则 $check_username$check_password永远不会设置。然后在 if 语句中比较这些变量。不是致命的错误,而是糟糕的风格。
没有密码哈希
您似乎正在将用户输入(我假设是纯文本)直接与数据库中存储的内容进行比较。 You're Probably Storing Passwords Incorrectly.
相反,当您存储密码时,请使用 password_hash()第一的。
无查询参数
我知道您说过您不关心您的 SQL 注入(inject)漏洞,但这就像是一名电工并且说您不关心您的电气面板是否塞满了油腻的破布。请务必在您的 LinkedIn 个人资料上发布您对安全的漠视,以便雇主知道应该避免谁。
推荐实现

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // enable exceptions

$conn = new mysqli($servername, $mysql_username, $mysql_password, $databaseName);

$log_username = $_POST['username'];
$log_password = $_POST['password'];

$sql = "SELECT log_username, log_password_hash FROM login WHERE log_username=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $log_username);
$stmt->execute();
$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
if (password_verify($log_password, $row['log_password_hash'])) {
$message = "ok";
// header must be called before any other output
header("Location: Doctors.php");
exit();
}
}
$message = "No";
// header must be called before any other output
header("Location: Doctors.php");

关于php - 如何检查用户名和密码是否与数据库值匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46819734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com