当我对密码进行哈希处理时,我使用了password_hash($ password,PASSWORD_ARGON2I)。
现在,我要针对存储在我的sql服务器中的哈希密码来验证我的登录密码。但是,即使我提供了正确的密码,password_verify仍然返回false。有人可以帮忙吗?
我尝试在google和stackoverflow上搜索解决方案,但无济于事
if(isset($_POST['login'])) {
$username = strip_tags(trim($_POST["username"]));
$password = $_POST["password"];
$query = "SELECT * FROM USERNAME WHERE user_id= '".$username."' ";
$params = array();
$stmt = sqlsrv_query($conn, $query);
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
$hash_password = $row['password'];
$new = password_verify($password, $hash_password);
if(var_dump(password_verify($password, $hash_password))){
$msg = "Login Success";
}else{
$msg = "Login failure";
}
echo $msg;
}
输出返回“登录失败”
答案 0 :(得分:1)
缺少输入很危险,如果您使用准备好的查询,则可能会使用strip_tags来影响userid
的内容,而不必要地使用它。
在此行var_dump()
中使用if(var_dump(password_verify($password, $hash_password))){
会一直导致错误,因为var_dump()
返回NULL。
向sqlsrv_
调用中添加一些错误检查也是一个好主意。
所以建议修改代码
if(isset($_POST['login'])) {
//$username = strip_tags(trim($_POST["username"]));
//$password = $_POST["password"];
$query = "SELECT * FROM USERNAME WHERE user_id= ?";
$params = array($_POST["username"]);
$stmt = sqlsrv_prepare($conn, $query, $params);
if( !$stmt ) {
print_r( sqlsrv_errors(), true);
exit;
}
if( sqlsrv_execute( $stmt ) === false ) {
print_r( sqlsrv_errors(), true);
exit;
}
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
//$hash_password = $row['password'];
//$new = password_verify($password, $hash_password);
//if(password_verify($password, $hash_password)){
if(password_verify($_POST["username"], $row['password']))){
$msg = "Login Success";
}else{
$msg = "Login failure";
}
echo $msg;
}
当然,要检查的另一件事是密码的散列正确工作,如果失败,您将永远无法进行验证。
答案 1 :(得分:0)
var_dump()始终返回“ void”。 password_verify()返回“布尔”。因此,您必须直接检查password_verify()。
!警告!
您的代码对SQL注入开放!我不建议使用您的代码。 但是,由于您特别要求一件事,所以这可能有效:
if(password_verify($password, $hash_password)){
$msg = "Login Success";
} else {
$msg = "Login failure";
}
答案 2 :(得分:0)
在解决RiggsFolly SQL注入问题时,我重做了我的代码,如下所示。希望这是正确的方法。
WebTestClient.bindToApplicationContext(context).configureClient()
.filter(documentationConfiguration(this.restDocumentation))
// alwaysDo?
.build();