我为登录系统编写了此语句,但该语句不起作用,获取功能正常运行,因为如果我尝试回显$ 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();
}
答案 0 :(得分:2)
您可能在比较之前修改了密码:
$pass = mysqli_real_escape_string($conn,$_POST['pass']);
在某些情况下,这不会有所作为,但在某些情况下会有所不同。
如果我尝试回显$ hash,看起来不错
对于人类来说,在网页上输出看起来可能直观上不错,但这是否意味着两个值是二进制等效的?并非总是如此,代码的结果似乎恰好表明了这一点。
由于您不在SQL查询中使用此值,因此无需转义它:
$pass = $_POST['pass'];
侧面说明:无论如何,您都不应依赖转义输入来在SQL查询中使用。相反,请不要在查询中首先使用用户可修改的值作为代码。请改用query parameters。 A commonly linked Stack Overflow question提供了一些出色的示例和说明,可以帮助您入门。从长远来看,您的代码将更安全,更稳定,更易于调试和维护。