2017-08-11 69 views
-6

不幸的是,我沒有找到解決問題的方法,我是一個初學者,我不知道爲什麼這個函數不起作用,我將如何使用它。如果有人給我寫解決方案,請理解代碼和問題。 (PS:DSL只是谷歌翻譯)password_verify()不起作用

(//Really 20 hours I try. No solution...(page login) 
    if (isset($_POST['connexion'])) 
{ $pseudoconnect=htmlspecialchars($_POST['pseudoconnect']); 
$passwordconnect=htmlspecialchars($_POST['passwordconnect']); 
if (!empty('$pseudoconnect') AND !empty('$passwordconnect')) 
{ 
$pseudoconnectlenght=strlen($pseudoconnect) ; 
$passwordconnectlenght=strlen($passwordconnect) ; 
if ($pseudoconnectlenght<3 || $pseudoconnectlenght>10 || $passwordconnectlenght<3 || $passwordconnectlenght >10) 
{    
echo "remplis tous les infos exacte"; 
} 
else 
{      
$repnom = $connect->prepare("SELECT password FROM membres WHERE pseudo=? "); 
$repnom->execute(array($passwordconnect)); 
$userinfo= $repnom->fetch(); 
$_SESSION['password']= $userinfo['password']; 
if (password_verify($_POST['passwordconnect'], $userinfo['password'])) 
{ 
echo "valid"; 
} else { 
echo "pas valid";}}} 

(頁面登記工作正常)我用password_hash其功能以及.. PS:DSL只是谷歌翻譯)

if (isset($_POST['envoyer'])) 
     { 


      if (!empty($_POST['pseudo']) AND !empty($_POST['password'])) 
      { 
        $pseudo=htmlspecialchars($_POST['pseudo']); 
        $password=htmlspecialchars($_POST['password']); 
        //$password=password_hash('password',PASSWORD_DEFAULT,['cost'=>12]); 

         $pseudolenght=strlen($pseudo); 
         $passwordlenght=strlen($password); 
         /*verifier les champs */ 
         if ($pseudolenght<4 ||$pseudolenght>10 || $passwordlenght<4 || $passwordlenght> 10) 
          { 

              echo "pass ou pseudo pas correct"; 
          }  
           else //enregistrement et verifier pseudo 
            { 

             $repetepseudo = $connect->prepare("SELECT * FROM membres WHERE pseudo=?"); 
             $repetepseudo->execute(array($pseudo)); 
             $existpseudo = $repetepseudo->rowCount(); 
             //verifier pseudo si déja existe 
               if ($existpseudo == 0) 
                { 
                 //hasher password 

                 $hash=password_hash($password,PASSWORD_DEFAULT,['cost'=>12]); 

                 $sql = "INSERT INTO membres (pseudo,password) VALUES (?,?)"; 
                 $query = $connect->prepare($sql); 
                 $query->execute(array($pseudo,$hash)); 





                  echo "enregistrement valide"; 
                  //header('location: html.php'); 

                } 

                 else 
                  { 
                   echo "déja utiliser"; 
                } 
                } 


                  } //if empty 
                    else { 

                       echo "remplir tous les champs "; 
                      } 





                           }//if isset eenvoyer 
+0

對不起創建代碼不爲我 –

+2

過去的代碼在這裏工作,沒有圖片... – Rasclatt

+0

還什麼不起作用,這是一個廣泛的聲明 – Rasclatt

回答

1

您需要從與用戶名匹配的數據庫中檢索密碼。

SELECT password FROM members WHERE psuedo = ? 

然後驗證提供的與用戶名匹配的密碼。

if (password_verify($_POST['password'], $userInfo['password'])) { 
    //... valid user 
} else { 
    //... invalid user 
} 

如果返回true,這意味着用戶名和密碼進入數據庫中的用戶相匹配。

如果您的pseudo列不是唯一的(我看到您檢查),則需要遍歷所有用戶以查找通過password_verify的密碼。

原因是password_hash每次調用時都會生成一個獨特的鹽,導致生成的哈希密碼不同。無法查詢存儲在數據庫中的密碼。

所以這是行不通的

var_dump(password_hash('test', \PASSWORD_DEFAULT) === password_hash('test', \PASSWORD_DEFAULT)); //false 

結果:https://3v4l.org/jM4YH

此外,您需要將您的password_hash用法更改爲:

$hash = password_hash($password, \PASSWORD_DEFAULT, ['cost' => 12]); 

按目前,每個用戶的密碼會請輸入password,而不是他們提供的密碼。


作爲一個說明,你也應該利用password_needs_rehash覈實後,它的成功登錄的一個例子是在頁面上。這將確保密碼保持由PHP發佈的安全更新。


更新

有了修改,以符合我的建議的問題。

您需要通過將用戶與所提供的用戶進行匹配來從數據庫中檢索密碼。

$repnom = $connect->prepare("SELECT password FROM membres WHERE pseudo = ?"); 
$repnom->execute(array($passwordconnect)); 

應該發送pseudo PARAM,而不是password PARAM

$repnom->execute(array($pseudoconnect)); 

而且因爲你保存在數據庫中的密碼運行htmlspecialchars,你應該使用相同的password_verify

$passwordconnect = htmlspecialchars($_POST['passwordconnect']); 

//... 

password_verify($passwordconnect, $userinfo['password']); 
-1

您需要驗證反對散列的密碼從password_hash