Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP password_verify()未验证密码_Php_Database_Hash - Fatal编程技术网

PHP password_verify()未验证密码

PHP password_verify()未验证密码,php,database,hash,Php,Database,Hash,我的PHP应用程序/数据库设置需要对密码进行哈希和去哈希处理。虽然password_hash()似乎为数据库提供了正确的输出,但使用password_verify()将存储的哈希与明文密码进行比较会得到错误的结果 基本输入表单(注册表单)或(登录表单): 散列并添加到数据库(注册\验证): $temail=trim(过滤输入(“输入”贴子、“电子邮件”、“过滤”清理字符串)); $tpword=trim(过滤器输入(输入后,“pword”,过滤器消毒字符串)); 如果(!filter\u

我的PHP应用程序/数据库设置需要对密码进行哈希和去哈希处理。虽然password_hash()似乎为数据库提供了正确的输出,但使用password_verify()将存储的哈希与明文密码进行比较会得到错误的结果

基本输入表单(注册表单)或(登录表单):




散列并添加到数据库(注册\验证):

$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.";
        }
    }

}