2016-04-05 5 views
1

У меня проблема с созданием паролей Bcrypt. Вместо того, чтобы вводить их вручную в хэш-переменную, и если оператор я хотел бы сгенерировать их в формах 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/en/tutorial.forms.php). – JimL

+1

Просто для того, чтобы быть технически корректным, * «Пожалуйста, введите значение для шифрования!» * Должно выглядеть больше как * «Пожалуйста, введите значение для хэша!» *. Это всего 2 разных животных ;-) –

ответ

4

Я сделаю попытку ответить на это, и если это то, о чем идет речь.

Вы можете назначить переменную массиву POST (и использовать метод post для формы), который будет передан как первый параметр для обеих функций, и проверить, не является ли он пустым и использовать isset() против именованного ввода/отправки.

N.B .: Код, указанный ниже, был написан для использования в одном файле, так как использовался action="". Если вы намереваетесь использовать это в двух отдельных файлах, то непременно измените действие на имя файла, используемое для него.

<?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> 

Sidenote: Если это предназначено для паролей, то вы должны изменить тип входного сигнала на «пароль» вместо «текст».

Если позже вы хотите использовать это в качестве системы авторизации, а затем посмотреть на один из ответов ircmaxell в https://stackoverflow.com/a/29778421/

Если используется PDO и подготовленное заявление.

Вытащил из его ответа:

Просто используйте библиотеку. Шутки в сторону. Они существуют по какой-то причине.

  • PHP 5.5+: использовать password_hash()
  • PHP 5.3.7+: использовать password-compat (пакет обеспечения совместимости для выше)
  • Все остальные: использовать phpass

Не делайте это сами , Если вы создаете свою соль, ВЫ МОЖЕТЕ НЕПРАВИЛЬНО. Вы должны использовать библиотеку, которая обрабатывает это для вас.

$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 
} 

Важно Sidenote о длине колонки:

Если и когда вы решите использовать password_hash() или пакет обеспечения совместимости (если PHP < 5.5) https://github.com/ircmaxell/password_compat/, важно отметить, что если длина текущего столбца пароля меньше, чем t han 60, его нужно будет изменить на это (или выше). В руководстве предлагается длина 255.

Вам потребуется ALTER length вашей колонки и начать с нового хэша, чтобы он вступил в силу. В противном случае MySQL будет терпеть неудачу.

Смежные вопросы