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'] : '';

Я думаю, вот и все.

Другие вопросы по тегам