我正在尝试创建一个注册页面,并且在尝试使用PASSWORD_BCRYPT与mysqli散列我的密码时遇到麻烦。有人能解释什么是错误的我的代码下面?
<?php
if(isset($_POST['Register'])) { // checking that form is submitted
session_start(); //creating variables for form entries
$FName = $_POST['First_Name'];
$LName = $_POST['Last_Name'];
$Email = $_POST['Email'];
$PW = $_POST['Password'];
$StorePassword = password_hash($PW, PASSWORD_BCRYPT, array('cost' => 10));
$sql = $con->query("INSERT INTO users (Fname, Lname, Email, Password)Values('{$FName}', '{$LName}', '{$Email}', '{$PW}')");
header('Location: Login.php');
首先,您在查询中使用了错误的密码变量$PW
,而不是您在顶部使用它的预期$StorePassword
变量,然后将其传递给哈希函数。
您的密码被存储为"rasmuslerdorf"而不是"$2y$10$"。vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a "
如果仍然不起作用,则该功能可能无法使用,需要使用密码兼容性包
- (if PHP <5.5) https://github.com/ircmaxell/password_compat/
将错误报告添加到文件的顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:显示错误应该只在登台时显示,而不应该在生产中显示。
参考以下链接
- http://php.net/manual/en/mysqli.error.php
- http://php.net/manual/en/function.error-reporting.php
并将其应用到您的代码中。
你可能在你的查询中有错误,但是你没有检查它们。
另外,既然您没有发布HTML表单,请确保它使用post方法,并且所有输入都具有正确的名称属性。
仅供讨论;您发布的代码缺少右括号
}
也添加
exit;
后头,应该有更多的代码之后。否则,您的代码可能需要继续执行。确保你确实成功连接使用相同的MySQL API,因为你正在使用查询,是
mysqli_
。这对我们来说是未知的。- 不同的api如
mysql_
和PDO不能与mysqli_
混合,反之亦然。
- 不同的api如
确保你没有在标题前使用
session_start();
在它现在所在的地方输出;它看起来好像在开始PHP标记之前有一个空格,这被认为是输出。错误报告也会告诉你。
你现在的代码是开放的SQL注入。使用预处理语句,或者使用PDO与预处理语句, 它们更安全。
脚注:
确保密码列的长度足以存储散列。为了适应未来,PHP.net建议使用VARCHAR(255)
和。对于所有列和正确的长度/类型都是一样的。
- http://php.net/manual/en/function.password-hash.php
"注意,这个常数被设计为随着时间的推移,新的和更强的算法被添加到PHP。因此,使用此标识符产生的结果的长度可能会随时间变化。因此,建议将结果存储在可以扩展超过60个字符的数据库列中(255个字符将是一个不错的选择)。"