2016-09-30 21 views
0

password_verify()を有効にしようとすると、一晩中50以上のリンクを真剣に過ごしたので、私はこの質問を軽視しませんでした。PHP password_verify()

1-ハッシュは100%正しいです。
2プレーンテキストVerisonは100%正解です。
3ハッシュ長さは事実上60.
4試したPassword_DefaultとPassword_Bcrypt
5パスワードをデータベースから引き出しました。

しかし

if(password_verify($answer,$secAnswer)){ } IS ALWAYS false. 

ここに私のコードです。

function anti_injection_login($sql, $formUse = true){ 
$sql = preg_replace("/(from|select|insert|delete|where|drop table|show tables|,|'|#|\*|--|\\\\)/i","",$sql); 
$sql = trim($sql); 
$sql = strip_tags($sql); 
if(!$formUse || !get_magic_quotes_gpc()) 
    $sql = addslashes($sql); 
return $sql; 
} 


    $email = anti_injection_login($_POST['email']); 
    $answer = anti_injection_login($_POST['answer']); 
    $queryAccount = mysqli_query($conn, "SELECT * FROM Accounts where email= '$email'"); 
    $count = mysqli_num_rows($queryAccount); 
    if($count == 1){ 
    $rows = mysqli_fetch_array($queryAccount); 
    $secAnswer = $rows['secretkey']; 

    if(password_verify($answer,$secAnswer)){ 
     echo "Successful"; 
    }else{ 
     echo "Try Again"; 
    } 
    } 

anti_injection_loginは、人に注射を停止させるだけです。 これは問題ではありません。
$ secAnswerと$ answerでエコーをどこに置いても、私はそれがいつも正しいと思います。

私には恋人がいませんか? 私は今これに真剣に困惑しています。

(はい、これはスクリプト全体です)。だから私は何も残していません。 しかし、前述したように、それは正常にハッシュを引っ張っています(そして正しい)。

私がハッシュに使用した単語は、同じです(大文字と小文字の両方を試してみました)。

+3

準備文を使用してください。あなたは自分の衛生設備を転がす必要はありません。 –

+1

'$ rows ['secretkey']'には何が含まれていますか(例を示します)。 'secretkey'ハッシュをどのように生成するかを示します。パスワードが 'aliform_at_insert'のようなものであれば、あなたの' anti_injection_login'は私のログインを壊すでしょう – Justinas

+2

申し訳ありません、 'anti_injection_login()'はあなたのサイトをハックするよう求めています。準備文はあなたが必要とするものです*。 – alex

答えて

1

PHP Manualは非常に明確な例与える:すべての

<?php 
// See the password_hash() example to see where this came from. 
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; 

if (password_verify('rasmuslerdorf', $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 
?> 

まず、パスワードのハッシュは、ユーザーが登録したときpassword_hash()機能で作成する必要があります。

ログイン時に、フォームからパスワードをデータベースの保存されたハッシュとともにpassword_verify()に渡します。

しかし、あなたのコードはフォームデータをanti_injection_login()に渡します。このデータは、任意の入力でwho-know-whatを実行しています。パスワードをpassword_verify()に直接渡す場合は、パスワードを守る必要はありません。データベースからハッシュを取得するために準備文を使用し、$_POST['answer']をそのままpassword_verify()に渡すことを強くお勧めします。

関連する問題