Php 在pdo登录中添加密码哈希
我无法在注册代码中添加密码哈希。我是PDO新手,我尝试了不同的方法,但无法使用密码哈希进行有效注册! 有人能帮我吗?这是我的代码:Php 在pdo登录中添加密码哈希,php,authentication,hash,Php,Authentication,Hash,我无法在注册代码中添加密码哈希。我是PDO新手,我尝试了不同的方法,但无法使用密码哈希进行有效注册! 有人能帮我吗?这是我的代码: <?php include('header.php'); // Check if logged in if($user->is_loggedin()!="") { $user->redirect('home.php'); } $error=''; if(isset($_POST['btn-signup']))
<?php
include('header.php');
// Check if logged in
if($user->is_loggedin()!="")
{
$user->redirect('home.php');
}
$error='';
if(isset($_POST['btn-signup']))
{
// trim empty spaces on inserted data
$uname = trim($_POST['name']);
$umail = trim($_POST['email']);
$upass = trim($_POST['password']);
$repeat_password = trim($_POST['repeat_password']);
// validate username
if($uname=="") {
$error.= "provide username ! <br>";
}
// validate e-mail
else if($umail=="") {
$error.= "provide email id ! <br>";
}
else if(!filter_var($umail, FILTER_VALIDATE_EMAIL)) {
$error.= 'Please enter a valid email address ! <br>';
}
// validate password
else if($upass=="") {
$error.= "provide password ! <br>";
}
else if(strlen($upass) < 6){
$error.= "Password must be atleast 6 characters <br>";
}
else if( $upass!=$repeat_password){
$error.= "Password Does Not Match <br>";
}
else
{
// check if email is already taken
try
{
// prepare statement
$stmt = $DB_con->prepare("SELECT email FROM users WHERE email=:umail");
$stmt->execute(array(':umail'=>$umail));
$row=$stmt->fetch(PDO::FETCH_ASSOC);
if($row['email']==$umail) {
$error.= "sorry email id already taken ! <br>";
}
// if everything is validated save data
else
{
if($user->register($uname,$umail,$upass))
{
$_SESSION['success']='You have been Registered Successfully';
$user->redirect('login.php');
}
}
}
// set the error mode
catch(PDOException $e)
{
echo $e->getMessage();
}
}
}
我想首先指出几件事:
不要使用修剪到用户密码。除非您想限制用户在密码中输入空格
进行比较时使用===。它更好,因为它同时检查数据类型。例如,如果有“2”和2,并且使用==运算符,则它等于。检查数据类型是一种很好的做法,因为它可以防止很多错误的发生
至于你们想得到答案的问题是什么
您在任何时候都不使用密码\u散列函数。您只能将原始密码分配给变量,并将此变量分配给bind_param函数
$new_password = $upass;
应该是
$new_password = password_hash($upass, PASSWORD_DEFAULT);
但是,我不建议使用PASSWORD\u DEFAULT,因为使用PASSWORD\u ARGON2I可以获得更安全的哈希。您可以从中查看有关密码\u哈希的更多信息
为了给您提供更多帮助:当您想验证用户在登录时输入的密码是否正确时,您需要使用password_verify()。它将哈希值和用户输入的密码进行比较,如果正确,此函数将返回true
例如:
$login_status = password_verify($_POST['password'], $user_password_from_database);
if($login_status === true) {//set session etc...}
您可以阅读有关密码验证的更多信息“…但是pw不会保存在我的sql数据库中”-在这种情况下发生了什么?有错误吗?行是否插入了其余数据,但密码为空?您的密码列是否足够长以存储哈希字符串?我同意El_Vanja的观点。你注释掉的那行代码只会用它的散列替换密码,不会有太多的错误。我假设您在实际使用时注释掉了下一行($new\u password=$upass;
)。你要测试的第一件事是你是否真的得到了一个哈希:echo$new\u密码代码>。如果是这种情况,请检查$stmt->execute()的结果代码>。基本检查。问题:为什么返回$stmt代码>从函数寄存器()
?不应该是:$stmt->execute()代码>?
$login_status = password_verify($_POST['password'], $user_password_from_database);
if($login_status === true) {//set session etc...}