处理我需要安全身份验证的第一个项目。我的主机仍在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;
}
}
?>
答案 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_reporting
将error_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'] : '';
我认为这就是全部。