PHP password_verify()未验证密码
我的PHP应用程序/数据库设置需要对密码进行哈希和去哈希处理。虽然password_hash()似乎为数据库提供了正确的输出,但使用password_verify()将存储的哈希与明文密码进行比较会得到错误的结果 基本输入表单(注册表单)或(登录表单):PHP password_verify()未验证密码,php,database,hash,Php,Database,Hash,我的PHP应用程序/数据库设置需要对密码进行哈希和去哈希处理。虽然password_hash()似乎为数据库提供了正确的输出,但使用password_verify()将存储的哈希与明文密码进行比较会得到错误的结果 基本输入表单(注册表单)或(登录表单): 散列并添加到数据库(注册\验证): $temail=trim(过滤输入(“输入”贴子、“电子邮件”、“过滤”清理字符串)); $tpword=trim(过滤器输入(输入后,“pword”,过滤器消毒字符串)); 如果(!filter\u
散列并添加到数据库(注册\验证):
$temail=trim(过滤输入(“输入”贴子、“电子邮件”、“过滤”清理字符串));
$tpword=trim(过滤器输入(输入后,“pword”,过滤器消毒字符串));
如果(!filter\u var($temail,filter\u VALIDATE\u EMAIL)){
回显“无效电子邮件地址”;
}
否则{
$link=array(“数据库”=>dbName,“UID”=>userName,“PWD”=>userPassword,“MultipleActiveResultSets”=>true);
sqlsrv_configure('warningreturnaserrors',0);
$link=sqlsrv_connect(服务器名,$link);
如果($link==false){
回显“连接失败。
”;
模具(打印错误(sqlsrv_errors(),true));
}
否则{
$hpword=password\u散列($tpword,password\u默认值);
$insertSql=“插入到卡中\u score\u storage.dbo.customer\u卡(电子邮件、密码)值(?)”;
$params=数组(&$temail,&$hpword);
$prepareStatement=sqlsrv_prepare($link、$insertSql、$params);
如果($prepareStatement==false){
echo“看起来好像出了什么问题。”;
回声“
”;
die(FormatErrors(sqlsrv_errors());
}
否则{
if(sqlsrv_execute($prepareStatement)==false){
echo“看起来好像出了什么问题。”;
回声“
”;
模具(打印错误(sqlsrv_errors(),true));
}
否则{
echo“您已成功注册电子邮件:$temail
”;
回声“;
}
用户登录后的密码验证(登录验证):
require_once'config.php';
错误报告(E_全部);
$email=trim(过滤输入(输入后,“电子邮件”,过滤净化字符串));
$pword=trim(过滤器输入(输入后置,'pword',过滤器消毒字符串));
//连接到用户数据库
$link=array(“数据库”=>dbName,“UID”=>userName,“PWD”=>userPassword,“MultipleActiveResultSets”=>true);
//检查连接错误
sqlsrv_configure('warningreturnaserrors',0);
$link=sqlsrv_connect(服务器名,$link);
如果($link==false){
回显“连接失败。
”;
模具(打印错误(sqlsrv_errors(),true));
}
否则{
睡眠(0.2);
$LoginFetchSql=“从卡\u score\u storage.dbo.customer\u卡中选择电子邮件、密码,其中电子邮件='$Email';
$stmt\u l=sqlsrv\u查询($link,$LoginFetchSql);
$getuser=sqlsrv\u fetch\u数组($stmt\u l,sqlsrv\u fetch\u ASSOC);
如果($getuser[“Email”]==NULL){
echo“您没有成功登录。
”;
会话_destroy();
}
否则{
echo$getuser[“密码”],“
”;
$verify=password\u verify($pword,$getuser[“password”]);
如果($verify){
回显“良好密码”;
}
否则{
回显“错误密码”;
}
}
}
存储散列密码的DB列是一个大小为255的NCHAR。使用直接POST值替换筛选/修剪的输入,如$\u POST[“pword”]提供相同的结果。我认为在从数据库写入/检索密码时会出现问题。我建议您在寄存器上转储密码,并在检索密码时相互比较 编辑:将
nchar
更改为varchar
应该可以解决此问题。这是因为nchar可以存储unicode数据(这可能导致验证返回false)并且具有固定长度。varchar无法存储unicode数据并且具有可变长度
如需参考,请查看此Stackoverflow问题以了解更多信息:share value of“$getuser”?使用电子邮件“test@test.com密码为“test”:数组([电子邮件]=>test@test.com[密码]=>$2y$10$f2cLGYqlLQf6gniX7JyhvOaSIQANy8qIkmLcly/0wBxdcYFLTxs8m)您确定要传递的值与存储在DB中的值相同吗?您正在检查是否正确:检查此项-我知道如果您直接将密码
测试,它将起作用:,我想您在这里遇到问题$verify=password\u verify($pword,$getuser[“password”]))
一个新的测试表明初始密码散列、存储在数据库中的值和检索到的值都是相同的。在什么情况下会出现假想的写入/检索问题?你能尝试使用VARCHAR而不是NCHAR吗?这让我很惊讶,已经解决了问题。你能猜一下问题是什么吗?我回答了你的问题在我的编辑中。你已经读过了吗?:)是的,谢谢。没有考虑到数据库格式可能是问题的根源。
<form action="sign_verify.php" method="post">
<input id="email_add" class="field" type="text" placeholder="Email" name="email"><br>
<input id="password" class="field" type="text" placeholder="Password" name="pword"><br>
<input type="submit" value="Sign Up">
</form>
$temail=trim(filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING));
$tpword=trim(filter_input(INPUT_POST, 'pword', FILTER_SANITIZE_STRING));
if (!filter_var($temail, FILTER_VALIDATE_EMAIL)) {
echo "Invalid email address";
}
else {
$link = array("Database"=>dbName, "UID"=>userName, "PWD"=>userPassword, "MultipleActiveResultSets"=>true);
sqlsrv_configure('WarningsReturnAsErrors', 0);
$link = sqlsrv_connect(serverName, $link);
if($link === false){
echo "Connection Failed.<br>";
die( print_r( sqlsrv_errors(), true));
}
else{
$hpword=password_hash($tpword, PASSWORD_DEFAULT);
$insertSql = "INSERT INTO Card_score_storage.dbo.customer_cards (Email,Password) VALUES (?,?)";
$params = array(&$temail,&$hpword);
$prepareStatement = sqlsrv_prepare($link, $insertSql, $params);
if ($prepareStatement === false) {
echo "Looks like something went wrong.";
echo "<br>";
die(FormatErrors( sqlsrv_errors() ));
}
else {
if (sqlsrv_execute($prepareStatement) === false) {
echo "Looks like something went wrong.";
echo "<br>";
die( print_r( sqlsrv_errors(), true));
}
else{
echo "You have successfully signed up with the email: $temail <br>";
echo "<a href='index.php'>Return to our main page</a>";
}
require_once 'config.php';
error_reporting(E_ALL);
$email=trim(filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING));
$pword=trim(filter_input(INPUT_POST, 'pword', FILTER_SANITIZE_STRING));
//Connect to user database
$link = array("Database"=>dbName, "UID"=>userName, "PWD"=>userPassword, "MultipleActiveResultSets"=>true);
//Check for connection error
sqlsrv_configure('WarningsReturnAsErrors', 0);
$link = sqlsrv_connect(serverName, $link);
if($link === false){
echo "Connection Failed.<br>";
die( print_r( sqlsrv_errors(), true));
}
else{
sleep(0.2);
$LoginFetchSql= "SELECT Email,Password FROM Card_score_storage.dbo.customer_cards WHERE Email = '$email'";
$stmt_l=sqlsrv_query($link,$LoginFetchSql);
$getuser = sqlsrv_fetch_array( $stmt_l, SQLSRV_FETCH_ASSOC);
if ($getuser["Email"] ==NULL) {
echo '<p style="text-align:center">You did not login successfully.</p>';
session_destroy();
}
else{
echo $getuser["Password"],"<br>";
$verify=password_verify($pword,$getuser["Password"]);
if($verify){
echo"Good password.";
}
else{
echo"Bad Password.";
}
}
}