2016-04-05 16 views
1

Bcryptパスワードの生成に問題があります。ハッシュ変数とif文にマニュアルを入力するのではなく、フォームHTMLでそれらを生成したいと思います。私はそれを行う方法がわかりません。動的PHPの生成

<?php 
/*in the if statment make sure that the password is the same as in hash variable*/ 
$options = array('cost' => 12); 
echo "Bcrypt: "; 
echo $hash = password_hash("yourpassword", PASSWORD_BCRYPT, $options); 
echo "<br>"; 
echo "Verify now:<br>"; 
if (password_verify('yourpassword', $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 


?> 
<p>Please enter a value to encrypt!</p> 
<form action="invite.php"> 
    Key:<br> 
    <input type="text" name="firstname"><br> 
    <input type="submit" value="Submit"> 



</form> 
+2

あなたの質問は、[PHPでフォームを使用する方法](http://php.net/manual/ja/tutorial.forms.php)についてのようです。 – JimL

+1

ちょうど技術的に正しいとは、* "暗号化する値を入力してください!" *もっと読むべきです* "ハッシュ値を入力してください!それらは2つの異なる動物です;-) –

答えて

4

私はこれに答える試みをしています。これが質問の話です。

変数をPOST配列に代入して(フォームのpostメソッドを使用して)両方の関数の最初のパラメータとして渡し、空でないかどうかをチェックし、isset()を名前付き入力/送信に対して使用できます。

N.B .:以下のコードは、action=""を使用した場合、同じファイル内で使用するように記述されています。これを2つの別々のファイルで使うつもりならば、アクションを使用するファイル名に変更してください。

<?php 

/*in the if statment make sure that the password is the same as in hash variable*/ 
$options = array('cost' => 12); 
echo "Bcrypt: "; 

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

    if(!empty($_POST['firstname'])){ 

     $their_input = $_POST['firstname']; 

      echo $hash = password_hash($their_input, PASSWORD_BCRYPT, $options); 

      echo "<br>"; 
      echo "Verify now:<br>"; 


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

    } 
    else{ 
     echo "You left this empty."; 
    } 

} 

?> 

<p>Please enter a value to hash!</p> 
<form action="" method="post"> 
    Key:<br> 
    <input type="text" name="firstname"><br> 
    <input type="submit" name="submit" value="Submit"> 

</form> 

サイドノート:パスワード用の場合は、入力タイプを「テキスト」ではなく「パスワード」に変更する必要があります。

後でログインシステムとしてこれを使用したい場合はPDOを使用して準備された文であれば、ircmaxellの答えhttps://stackoverflow.com/a/29778421/

を見ることもできます。

が彼の答えから引き出された:

ちょうどライブラリを使用しています。真剣に。彼らは理由のために存在します。

はそれを自分でしないでください 。あなた自身の塩を作るなら、あなたはそれに間違っているです。それを処理するライブラリを使用する必要があります。

$dbh = new PDO(...); 

$username = $_POST["username"]; 
$email = $_POST["email"]; 
$password = $_POST["password"]; 
$hash = password_hash($password, PASSWORD_DEFAULT); 

$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?"); 
$stmt->execute([$username, $email, $hash]); 

とログインに:列の長さについて

$sql = "SELECT * FROM users WHERE username = ?"; 
$stmt = $dbh->prepare($sql); 
$result = $stmt->execute([$_POST['username']]); 
$users = $result->fetchAll(); 
if (isset($users[0]) { 
    if (password_verify($_POST['password'], $users[0]->password) { 
     // valid login 
    } else { 
     // invalid password 
    } 
} else { 
    // invalid username 
} 

重要追記:

もし、あなたがPHP場合password_hash()または互換機能パックを(使用することを決定します< 5.5)https://github.com/ircmaxell/password_compat/の場合、現在のパスワードの列の長さが何よりも小さい場合han 60の場合は、それ以上(またはそれ以上)に変更する必要があります。このマニュアルでは255の長さが推奨されています。

有効にするには、新しいハッシュを使用して列の長さを変更し、最初からやり直す必要があります。そうしないと、MySQLは自動的に失敗します。