2016-10-29 2 views
1

Я пытаюсь понять, как form и password_hash и проверить работу. Вот простой код, который я написал. В результате я получил недопустимый парольphp password_hash и password_verify issue

Что мне не хватает?

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Untitled Document</title> 
</head> 

<body> 

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="pwd"> 
Password: 
<table> 
    <tr> 
    <td><input name="passwd" type="text"/></td> 
    </tr> 
    <tr> 
    <td align="center"><br/> 
     <input type="submit" name="submit_pwd" value="hash"/> 
    </td> 
    </tr> 
</table> 
</form> 

<?php 
$passwd = $_POST['passwd']; 

echo "Password : <BR>".$passwd."\n <BR>" ; 
echo "Hash  : <BR>".$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>"; 

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

?> 

</body> 
</html> 
+0

Какова ваша версия Php?('echo PHP_VERSION;') – Progrock

ответ

2

Позвольте мне объяснить, что происходит (и не идет) здесь.

Что делает следующее ...

$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>" 

это задание, где вы пытаетесь окрошка пароль, который также будет содержать разрыв строки, пробел и <BR> тег.

Затем, пытаясь проверить, совпадает ли введенный пароль с введенным паролем и разрыв строки, а также пробел и <BR>.

  • Это было бы очень трудно сделать, не так ли?

Вы также должны получать уведомление об неопределенном индексе о $passwd = $_POST['passwd'];, поэтому оберните весь этот код в условный оператор, используя именованный ввод.

При полном удалении . "\n <BR>" вам необходимо будет изменить код.

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

    $passwd = $_POST['passwd']; 

    echo "Password : <BR>".$passwd."\n <BR>" ; 
    echo "Hash  : <BR>".$hash = password_hash($passwd, PASSWORD_DEFAULT); 

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

Вот простой тест с использованием MD5 в качестве примера для того, чтобы доказать это, (заметьте, я не использовал password_hash() здесь, так что производит различные хэш и трудно было бы на самом деле доказать разницу); код частично заимствован от http://php.net/manual/en/function.md5.php

Имейте в виду, что MD5 производит то же значение хэша.

$str_good = 'apple'; 
$str_bad = 'apple'. "\n <BR>"; 

echo md5($str_good); // produces 1f3870be274f6c49b3e31a0c6728957f 
echo "<br>"; 
echo md5($str_bad); // produces cb2a3d3161fcc99dcf5e4ccd3bfbb14c 
echo "<br>"; 

if (md5($str_good) === '1f3870be274f6c49b3e31a0c6728957f') { 
    echo "Would you like a green or red apple?"; 
} 

Вы заметите, что назначение без дополнительных . "\n <BR>" производит другое значение, чем другие.

  • Это то же самое, что происходит с вашим кодом здесь.

"Что мне не хватает?"

  • Вопрос не о том, чего не хватает, но о том, что это слишком много.

Исправление так же просто, как просто удалить . "\n <BR>", что является «чем-то большим».

+0

Спасибо. Это о том, как PHP интерпретировать эту строку эхо
\ п
« "$ хеш = password_hash ($ PASSWD, PASSWORD_DEFAULT).."; я буду иметь в виду – Dragonet

+0

@Dragonet Вы долгожданная Если вы хотите пометить. вопрос, как решена, отметьте галочку, пока она не станет зеленой рядом с ответом. Это говорит всем, что решение вопроса найдено. –

+0

done Я только что узнал, что php интерпретирует эту строку 'code'
". $ hash = password_hash ($ passwd, PASSWORD_DEFAULT). "\ n
"; 'code' как 'code' $ hash = password_hash ($ passwd, PASSWORD_DEFAULT). "\ n
'code' not 'code' $ hash = password_hash ($ passwd, PASSWORD_DEFAULT) 'code' – Dragonet

0

$hash переменных не будет установлен правильно, когда внутри echo. Используйте это:

$passwd = $_POST['passwd']; 
$hash = password_hash($passwd, PASSWORD_DEFAULT); 
echo "Password : <BR>".$passwd."\n <BR>" ; 
echo "Hash  : <BR>".$hash. "\n <BR>"; 

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

Это не мой downvote здесь, но вы, вероятно, получили его из-за того, что не знаете об этом и/или «попробуйте это». Хотя ваш ответ действительно устраняет проблему здесь (я знаю почему), было бы хорошо для OP и всех остальных, если бы вы объяснили ответ, таким образом не будет никаких догадок, или люди спрашивают вас, что вы сделали для исправления их кода. –

+0

Спасибо @ GentlemanMax. Я только что узнал, что PHP интерпретировать эту строку 'код'
"$ хеш = password_hash ($ PASSWD, PASSWORD_DEFAULT).". \ П
«, 'код' в 'код' $ хеш = password_hash ($ passwd, PASSWORD_DEFAULT). "\ n
'Код' не 'code' $ hash = password_hash ($ passwd, PASSWORD_DEFAULT) 'code' – Dragonet

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