用于password_hash()错误的PHP 5.3补丁

时间:2014-02-28 23:02:52

标签: php php-password-hash

处理我需要安全身份验证的第一个项目。我的主机仍在PHP 5.3.27上,所以我使用的是password_hash()兼容性补丁found here.我的问题是return password_hash($password, PASSWORD_BCRYPT, array('cost'=>$cost));错误说明$ password必须是一个字符串。为什么不是字符串?我甚至不知道从哪里开始调试。

获取密码的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的内容是password_hash()的5.3兼容性补丁*

<?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 个答案:

答案 0 :(得分:1)

在您的代码中,$password不是字符串,而是null值¹。这是因为$_POST没有名为password²的键,而这恰好是因为你的表单中没有带name="password的输入元素。

添加名称属性可以使事情有效:

<input type="password" name="password" class="form-control" id="inputpass"
       placeholder="Enter a password">

¹您可以使用var_dump($password)验证这一点。

²这将导致PHP在您进行分配的行发出E_NOTICE消息。使用error_reportingerror_reporting(E_ALL);设置为最大值会显示此消息。

答案 1 :(得分:0)

我正在阅读你的代码,你在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'] : '';

我认为这就是全部。