2017-08-25 18 views
1

背景 - パスワードチェック機能が突然機能しなくなった理由を知るには、過去1時間ほどかかりました。PHP password_verify false negative

使用するたびに、入力したパスワードが正しい場合を含め、falseを返します。

私は自分の入力と私のハッシュをエコーし​​ました。どちらも一致しています(テーブルのハッシュとエコーされたものを比較する)。

ただし、これらの変数をpassword_verifyに設定すると、falseの100%が返されます。

私は間違っていると思いますか? -a post from an external siteに基づいて、これは私のhashedPassword変数が解析されている方法によると思います。 2つを比較すると、変数型で何かがうまくいかず、falseが返されます。

私のコードとデータベースの外観はどうなっていますか? -

usersテーブル。他の列が含まれます。

userId | username | password 
---------------------------- 
    1 | example | temp1 

パスワードチェッカー機能を含むクラスです。あなたは以下の出力で見ることができるようにちょうどpassword_verifyを使用する前に$hashedPasswordをエコーすることにより

public function checkPasswordCorrect($username, $password) { // Returns true is the entered password is correct and false if it isn't. 

    // This creates a mysqli context to run the connection through. 
    $mysqli = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbPlusPlus); 

    // If there is an error connecting to the database, it will be printed and the process will close. 
    if (mysqli_connect_errno()) { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 

    $sql = "SELECT password FROM users WHERE username='$username'"; 
    $result = $mysqli->query($sql); 
    $row = $result->fetch_array(MYSQLI_ASSOC); 

    $hashedPassword = $row["password"]; 

    $mysqli->close(); 

    echo $password."<br>".$hashedPassword."<br>"; // The input is correct and the hash matches that in the table. 

    // We return a value of true or false, depending on the outcome of the verification. 
    if(password_verify($password, $hashedPassword)) { 
     echo "return true"; 
     return true; 
    }   
    else { 
     echo "return false"; 
     return false; 
    } 
} 

を(のtry/catchトリミングあり)、ハッシュは、それを手動でチェックすることで一致しました。

temp0022 
$2y$10$9TgjJzSaqOB 
return false 

私は何を求めていますか? -

  1. 、より具体的に、私は(これを行うためのいくつかの簡単な方法がなければならない)テーブルから情報を引っ張ってる方法を、パスワードの入力をチェックする良い方法はあります。

  2. 変数解析は責任がありますか?私が見たことのないこのトピックに利用できる資料や記事はありますか?

私は何を認識していますか? -mysqliの私の用法は衝撃的です、私はそれが初めてです。私はそこに同様の答えがあることを知っていますが、何か他の文法的な誤りに陥っているようです。

ありがとうございました。 :D私はSQLインジェクション攻撃がヒットするつもりだことを心配しているあなたの人々のすべてのために

私は以来、大規模な、このコード例 を変更したと準備、ステートメントを使用しています。 ありがとうございました:)

+0

データベースの 'password'フィールドにはいくつの文字を使用できますか?印刷するパスワードが短すぎ、切り捨てられています。生成されたパスワードハッシュ(password_verity()を使用)は、長さが約60文字です。 varcharフィールドの方が短い場合は、完全なハッシュは保存されません。 –

+0

パスワードをハッシュしても、[SQLインジェクション](http://bobby-tables.com/)を防ぐことはできません。ほとんどの場合、システムの半分だけをセキュリティで保護したいと思っています。 – GrumpyCrouton

+0

[少しBobby](http://bobby-tables.com/)は** [あなたはSQLインジェクション攻撃の危険にさらされている](https://stackoverflow.com/q/60174/)**と述べています。 [MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)の[Prepared Statements](https://en.wikipedia.org/wiki/Prepared_statement)について学んでください。 ** [文字列をエスケープする](https://stackoverflow.com/q/5741187)**でも安全ではありません!私は非常に**簡単**、非常に**クリーン**、そして方法にするために[私は[関数を書いた](http://paragoncds.com/grumpy/pdoquery/#function)の 'PDO'を勧めます**安全性**は、パラメータ化されていないクエリを使用するよりも安全です。 – GrumpyCrouton

答えて

3

テーブルの構造を確認してください。あなたのハッシュフィールドは、ハッシュ全体を保存するために、長さ60(PASSWORD_BCRYPTの場合)または255(PASSWORD_DEFAULTの場合)(ref)である必要があります。あなたがデータベースから得たものは18文字です。あなたはおそらくVARCHAR(18)としているので、保存時に切り捨てられてしまいます。これがマッチを得られない理由です。

編集:PASSWORD_DEFAULTアルゴリズムの長さを追加しました。ありがとう@ Don'tPanic。

+0

ありがとう! <3 – Will

+1

[The PHP documentation](http://php.net/manual/en/function.password-hash.php)では長さ255を推奨しています。 –

+0

@ Don'tPanic私はそれを編集するつもりですBCRYPTの長さに沿って。ありがとう! – ishegg

関連する問題