PHP 5.3 патч для password_hash() с ошибками
Работа над моим первым проектом, который требует безопасной аутентификации. Мой хостинг все еще работает на PHP 5.3.27, поэтому я использую патч совместимости password_hash(), найденный здесь. Моя проблема в том, что return password_hash($password, PASSWORD_BCRYPT, array('cost'=>$cost));
ошибки, утверждающие, что $ пароль должен быть строкой. Почему это не строка? Я даже не знаю, с чего начать отладку.
HTML, который получает пароль
<form method='post' action='register.php' name='loginform'>
<label for="inputpass">Password</label>
<input type="password" class="form-control" id="inputpass" placeholder="Enter a password">
</form>
содержимое register.php
<?php
require 'validate.php';
$password = $_POST['password'];
var_dump(validations::generate_hash($password));
?>
Содержимое validate.php *password.php - это патч совместимости 5.3 для password_hash()*
<?php
require 'plugins/password.php';
class validations {
function generate_hash($password){
$cost = 11;
return password_hash($password, PASSWORD_BCRYPT, array('cost'=>$cost));
}
function validate_pw($password, $hash){
return crypt($password, $hash)==$hash;
}
}
?>
2 ответа
В вашем коде $password
это не строка, а null
value¹. Это потому что $_POST
не имеет названного ключа password
², что, в свою очередь, происходит потому, что у вас нет элемента ввода с name="password
в твоей форме.
Добавление атрибута name заставит вещи работать:
<input type="password" name="password" class="form-control" id="inputpass"
placeholder="Enter a password">
¹ Вы можете проверить это с var_dump($password)
,
² это заставит PHP излучать E_NOTICE
сообщение в строке вы делаете назначение. Превращение error_reporting
по максимуму с error_reporting(E_ALL);
сделал бы это сообщение появиться.
Я читал ваш код, и у вас есть некоторые ошибки в форме HTML.
Во-первых, вы должны использовать "вместо" в атрибуте. Во-вторых, вы должны установить атрибут имени во входном теге.
С другой стороны, я пытался запустить ваш код на своем компьютере, но, к сожалению, у меня нет версии PHP 5.5 для запуска password_hash.
Также помните, что вы должны установить свои методы следующим образом:
public static function generate_hash($password)
{
$cost = 11;
return password_hash($password, PASSWORD_BCRYPT, array('cost' => $cost));
}
потому что ваш var_dump() это:
var_dump(validations::generate_hash($password));
Я предлагаю тоже попробовать следующую строку кода, чтобы проверить ваш $_POST
$password = isset($_POST['password']) ? $_POST['password'] : '';
Я думаю, вот и все.