Hash 在注册表和帐户设置中哈希密码
当我使用自己的帐户登录测试脚本时,我会遇到登录错误。你认为对密码进行两次哈希运算是一种糟糕的做法吗 我在我的网站上对用户密码进行了两次哈希运算。一次,当他们注册时,一次,当他们在帐户更新中更新密码时。另外,我正在使用bcrypt方法,bcrypt的成本在两个哈希上都是10,而我在本地主机服务器上Hash 在注册表和帐户设置中哈希密码,hash,passwords,Hash,Passwords,当我使用自己的帐户登录测试脚本时,我会遇到登录错误。你认为对密码进行两次哈希运算是一种糟糕的做法吗 我在我的网站上对用户密码进行了两次哈希运算。一次,当他们注册时,一次,当他们在帐户更新中更新密码时。另外,我正在使用bcrypt方法,bcrypt的成本在两个哈希上都是10,而我在本地主机服务器上 ///// this is the code in register.php page <?php if(isset($_POST['registeruser'
///// this is the code in register.php page
<?php
if(isset($_POST['registeruser'])) {
session_start();
$FName = $_POST['regfname'];
$LName = $_POST['reglname'];
$Email = mysqli_real_escape_string($conn, $_POST['regemail']);
$origignalpassword = preg_replace('#[^a-z0-9_]#i', '',
$_POST['regpassword']);
$Passwordw = $_POST['confirmedpassword'];
$infosql = "SELECT * FROM users WHERE useremail = '".$Email."'";
$result = mysqli_query($conn,$infosql);
if(mysqli_num_rows($result)>=1)
{
echo "Email already taken.";
}
else if(mysqli_num_rows($result) !=1 && $Passwordw ==
$origignalpassword) {
$Passwordhash = password_hash($Passwordw,
PASSWORD_BCRYPT, array('cost' => 10));
$sql = $conn->query("INSERT INTO users(firstname,
lastname, useremail, Passwordcell) Values('{$FName}',
'{$LName}','{$Email}','{$Psswordhash}')");
header('Location: login.php');
} else {
echo 'Please check your password:' . '<br>';
}
}
?>
//// Below code is the code in my update.php page
<?php session_start();
if(isset($_SESSION['user_id'])) {
} else {
header('Location: login.php');
}
$user = $_SESSION['userid'];
$myquery = "SELECT * FROM users WHERE `userid`='$user'";
$result = mysqli_query($conn, $myquery);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
$_SESSION['upd_fnames'] = $row['firstname'];
$_SESSION['upd_lnames'] = $row['Lastname'];
$_SESSION['upd_emails'] = $row['useremail'];
$_SESSION['upd_passwords'] = $row['Passwordcell'];
$_SESSION['upd_phone'] = $row['phonenum'];
$_SESSION['upd_bio'] = $row['biography'];
?>
<?php
if (isset($_POST['updateme'])) {
$updfname = $_POST['upd_fnames'];
$updlname = $_POST['upd_lnames'];
$updemail = $_POST['upd_emails'];
$updphone = $_POST['upd_phone'];
$upd_pswd = $_POST['upd_passwords'];
$biography = $_POST['update_biography'];
$Pswod = password_hash($upd_pswd, PASSWORD_BCRYPT,
array('cost' => 10));
$sql_input = $mysqli->query("UPDATE users SET firstname = '{$updfname}', Lastname = '{$updlname}', Phonenum = '{$updphone}', useremail = '{$updemail}', Passwordcell = '{$Pswod}', biography = '{$biography}' WHERE userid=$user");
header('Location: Account.php');
}
else
{
}
?>
///这是register.php页面中的代码
您的问题可能只是注册脚本中的输入错误,而不是您编写的$Passwordhash
:
"INSERT INTO users(..., Passwordcell) Values(...,'{$Psswordhash}')"
尽管如此,您的代码还有其他问题,既然您要求提供建议,我想与您分享我的想法
可能最大的问题是,您的代码容易受到SQL注入的攻击。尽快切换到prepared语句,编写代码将比像您那样构建查询更加容易,MYSQLI和PDO都支持它。这可以给你一个开始
不应对密码进行消毒。删除行$origignalpassword=preg_replace(“#[^a-z0-9#]\i',”,$\u POST['regpassword'])
,只需将输入直接传递到散列函数密码散列($\u POST['regpassword',密码默认值)
。password_hash()函数可用于任何类型的输入
在每次重定向之后放置一个出口是一个好习惯,否则脚本将继续执行<代码>标题('Location:login.php',true,303);退出代码>
你真的有理由将用户信息放入会话中吗?而不是$\u SESSION['upd\u fnames']=$row['firstname']代码>我会根据需要从数据库中获取信息。通过从数据库中获取它,您可以确保信息是实际设置的(不是空的)并且是最新的,您可以避免一种状态,从而获得更多的REST-full
最后但并非最不重要的一点是,我建议遵循一些样式规则,比如变量名的开头总是以小写字母开头。您可以避免一些愚蠢的打字错误,这会使您的代码更具可读性
您的问题可能只是注册脚本中的输入错误,而不是您编写的$Passwordhash
:
"INSERT INTO users(..., Passwordcell) Values(...,'{$Psswordhash}')"
尽管如此,您的代码还有其他问题,既然您要求提供建议,我想与您分享我的想法
可能最大的问题是,您的代码容易受到SQL注入的攻击。尽快切换到prepared语句,编写代码将比像您那样构建查询更加容易,MYSQLI和PDO都支持它。这可以给你一个开始
不应对密码进行消毒。删除行$origignalpassword=preg_replace(“#[^a-z0-9#]\i',”,$\u POST['regpassword'])
,只需将输入直接传递到散列函数密码散列($\u POST['regpassword',密码默认值)
。password_hash()函数可用于任何类型的输入
在每次重定向之后放置一个出口是一个好习惯,否则脚本将继续执行<代码>标题('Location:login.php',true,303);退出代码>
你真的有理由将用户信息放入会话中吗?而不是$\u SESSION['upd\u fnames']=$row['firstname']代码>我会根据需要从数据库中获取信息。通过从数据库中获取它,您可以确保信息是实际设置的(不是空的)并且是最新的,您可以避免一种状态,从而获得更多的REST-full
最后但并非最不重要的一点是,我建议遵循一些样式规则,比如变量名的开头总是以小写字母开头。您可以避免一些愚蠢的打字错误,这会使您的代码更具可读性
嘿,巴德,谢谢你的回答,但是你能进一步解释一下准备好的Mysqli声明吗。因为我不明白。例如,使用下面的代码,如果用户的电子邮件或密码中包含字符串、整数和字符,我如何确保电子邮件和密码是否被接受$sql=“从用户中选择*,其中useremail=?”,userpassword=?”;$statement=$conn->prepare($sql);$statement->bind_参数('ss',$u_email,$password);$sql->execute();$result=$sql->get_result()代码>谢谢。@raminkamal-无法通过查询检查密码,因为您只存储了一个盐哈希。登录脚本的必要步骤是1)按用户搜索密码哈希从_users中选择userpassword,其中useremail=?
。2) 如果找到用户,则可以读取存储在数据库中的密码哈希。3) 在最后一步中,您可以使用code$passwordIsCorrect=password\u verify($password,$existingHashFromDb)中找到的密码散列来验证输入的密码代码>。你可以在my.Hey bud上找到一个更深入的解释。谢谢你的回答,但是你能进一步解释一下准备好的Mysqli声明吗。因为我不明白。例如,使用下面的代码,如果用户的电子邮件或密码中包含字符串、整数和字符,我如何确保电子邮件和密码是否被接受$sql=“从用户中选择*,其中useremail=?”,userpassword=?”;$statement=$conn->prepare($sql);$statement->bind_参数('ss',$u_email,$password);$sql->execute();$result=$sql->get_result()代码>谢谢。@raminkamal-无法通过查询检查密码,因为您只存储了一个盐哈希。登录脚本的必要步骤是1)按用户搜索密码哈希从_users中选择userpassword,其中useremail=?
。2) 如果找到用户,则可以读取存储在数据库中的密码哈希。3) 在最后一步中,您可以使用code$passwordIsCorrect=password\u verify($password,$existingHashFromDb)中找到的密码散列来验证输入的密码代码>。一个更深刻的解释,你可以在我的