1

从事我的第一个需要安全身份验证的项目。我的主机仍在 PHP 5.3.27 上,所以我正在使用此处找到的 password_hash() 兼容性补丁。我的问题是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;

    }   
}

?>
4

2 回答 2

1

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

添加名称属性将使事情正常进行:

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

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

E_NOTICE² 这将导致 PHP在您进行分配的行发出一条消息。用调到error_reporting最大值error_reporting(E_ALL);会使此消息出现。

于 2014-02-28T23:10:49.490 回答
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'] : '';

我想仅此而已。

于 2014-02-28T23:31:21.793 回答