php - 该语句总是返回 false
问题描述
我为登录系统编写了此语句,但它不工作,获取函数正常工作,因为如果我尝试回显 $hash,它看起来很好,但是如果我尝试这个验证语句,即使输入它总是返回 false在数据库中是相同的,数据库看起来很好,它有 varchar(255),这是我的代码
<?php
if(isset($_POST['submit'])){
include 'database.php';
$uid = mysqli_real_escape_string($conn,$_POST['uid']);
$pass = mysqli_real_escape_string($conn,$_POST['pass']);
$query = "SELECT * FROM user WHERE username ='$uid'";
$tbl = mysqli_query($conn, $query);
if (mysqli_num_rows($tbl)>0){
$row = mysqli_fetch_array($tbl, MYSQLI_ASSOC);
$hash = $row['password'];
if (password_verify($pass, $hash)){
echo "success";
} else {
echo "log in error";
}
}
}
编辑
我删除了 mysqli_real_escape_string 但它仍然返回 false 这里是新代码,我从数据库中选择所有来验证用户名,所以如果输入中的用户名或密码在数据库中,用户将被重定向到错误的密码页
<?php
if(isset($_POST['submit'])){
include 'database.php';
$uid = $_POST['uid'];
$pass = $_POST['pass'];
$query = "SELECT * FROM user WHERE username ='$uid'";
$tbl = mysqli_query($conn, $query);
if (mysqli_num_rows($tbl)>0){
$row = mysqli_fetch_array($tbl, MYSQLI_ASSOC);
$hash = $row['password'];
if (password_verify($pass, $hash)){
echo "success";
}
else {
echo "log in error";
}
}
}
我有一个注册页面,这是我散列然后将其存储在数据库中的地方,这是我的代码
$sql = "SELECT * FROM 'user' WHERE username ='$uid'";
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
}
if ($resultCheck > 0) {
header("Location:.../user.add.php?the inputs are already taken");
exit();
}
else {
$hashedpass = password_hash($pwd, PASSWORD_DEFAULT);
//insert the new user to the user database
$sql = "INSERT INTO user (userID, username, password)
VALUES (NULL, '$uid', '$hashedpass');";
$result = mysqli_query($conn, $sql);
header("Location:../user.add.php?success sir");
exit();
}
解决方案
在比较密码之前,您可能会修改密码:
$pass = mysqli_real_escape_string($conn,$_POST['pass']);
在某些情况下,这不会产生影响,但在某些情况下会。
如果我尝试回显 $hash,它看起来不错
作为网页上的输出,人类可能直观地看起来很好,但这是否意味着这两个值是二进制等价的?并非总是如此,代码的结果似乎恰恰表明了这一点。
由于您没有在 SQL 查询中使用此值,因此无需转义它:
$pass = $_POST['pass'];
旁注:无论如何,您都不应该依赖转义输入来在 SQL 查询中使用。相反,首先不要在查询中使用用户可修改的值作为代码。请改用查询参数。 一个通常链接的 Stack Overflow 问题有一些很好的示例和解释可以帮助您入门。从长远来看,您的代码将更安全、更稳定、更易于调试和维护。
推荐阅读
- gradle - 找不到为 args 编译的方法
- java - 授权后如何使用 API 连接?爪哇
- android - 设置消息文本以适应 AlertDialog 的宽度
- php - Splitting txt file to new lines
- c - 我们可以将连接的结果分配给一个变量吗?
- hibernate - 关于 EntityManagerFactory 和 SessionFactory 与 Hibernate 5.3、Spring Data JPA 2.1.4 和 Spring 5.1 的混淆
- python-3.x - absl.flags._exceptions.IllegalFlagValueError: flag --trained_checkpoint_prefix=None: Flag --trained_checkpoint_prefix 必须指定
- react-native - 表单提交后清除单选按钮反应本机
- javascript - 生成随机数并检查它是否存在于数据库 JavaScript NodeJS 中
- utf-8 - 具有特殊字符(如希伯来语)的 DOMPDF 问题