背景 - パスワードチェック機能が突然機能しなくなった理由を知るには、過去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
私は何を求めていますか? -
、より具体的に、私は(これを行うためのいくつかの簡単な方法がなければならない)テーブルから情報を引っ張ってる方法を、パスワードの入力をチェックする良い方法はあります。
変数解析は責任がありますか?私が見たことのないこのトピックに利用できる資料や記事はありますか?
私は何を認識していますか? -mysqli
の私の用法は衝撃的です、私はそれが初めてです。私はそこに同様の答えがあることを知っていますが、何か他の文法的な誤りに陥っているようです。
ありがとうございました。 :D私はSQLインジェクション攻撃がヒットするつもりだことを心配しているあなたの人々のすべてのために
:私は以来、大規模な、このコード例 を変更したと準備、ステートメントを使用しています。 ありがとうございました:)
データベースの 'password'フィールドにはいくつの文字を使用できますか?印刷するパスワードが短すぎ、切り捨てられています。生成されたパスワードハッシュ(password_verity()を使用)は、長さが約60文字です。 varcharフィールドの方が短い場合は、完全なハッシュは保存されません。 –
パスワードをハッシュしても、[SQLインジェクション](http://bobby-tables.com/)を防ぐことはできません。ほとんどの場合、システムの半分だけをセキュリティで保護したいと思っています。 – GrumpyCrouton
[少し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