2017-04-11 29 views
0

我正在建立一个注册和登录表单,我想散列我的用户密码注册和我的主要问题在这一点是如何编写查询更新密码时用户正在对他的电子邮件进行签名并第一次通过,并且我想将mysqli_insert_id()添加到查询中以跟踪每个用户的唯一标识。mysql查询用散列密码更新数据库

所以我有数据库名为testdb与users里面。

我的代码是完美的工作,直到你必须查询密码并更新它的时刻。

首先,我散列我的密码

$password = $_POST['password']; 

$hashed_password = password_hash($password, PASSWORD_BCRYPT); 

$query = "UPDATE `users` SET `password` = '$hashed_password' WHERE id = " 

正如你可以看到我有我的查询问题,应该在我的数据库更新密码。

我有这样的代码写入到这一点,所以我需要帮助,继续我的UPDATE查询

if (array_key_exists("submit", $_POST)) { 

    // connect to our db 
    $link = mysqli_connect("localhost", "root", "", "secretdi"); 
    // check for connection 
    if (mysqli_connect_error()) { 
     die("Database Connection Error"); 
    } 

    $error = ""; 

    if (!$_POST['email']) { 
     $error .= "An email address is required<br>"; 
    } 

    if (!$_POST['password']) { 
     $error .= "A password is required<br>"; 
    } 

    if ($error != "") { 
     $error = "<p>There were error(s) in your form:</p>".$error; 
    } else { 

     $query = "SELECT id FROM `users` WHERE `email` = '".mysqli_real_escape_string($link, $_POST['email'])."' LIMIT 1"; 

     $results = mysqli_query($link, $query); 

     if (mysqli_num_rows($results) > 0) { 
      $error = "That email address is taken."; 
     } else { 

      $query = "INSERT INTO `users` (`email`, `password`) VALUES('".mysqli_real_escape_string($link, $_POST['email'])."','".mysqli_real_escape_string($link, $_POST['password'])."') "; 

      if (!mysqli_query($link,$query)) { 
       $error = "<p>Could not sign you up - please try again later</p>"; 
      } else { 

       $password = $_POST['password']; 

       $hashed_password = password_hash($password, PASSWORD_BCRYPT); 


       $query = "UPDATE `users` SET `password` = '$hashed_password' WHERE id = " 


       echo "Sign up successful"; 
      } 

     } 

    } 
+1

等待,你想在登录时哈希密码?!为什么不在注册? – Vini

+0

是啊我想散列他们的注册我正要编辑我的问题 – Learno

+0

你散列密码在注册和验证hashpassword输入密码登录。我觉得你很困惑 – Akintunde007

回答

1

你不应该在任何情况下,存储在纯文本的密码。

这意味着,当您注册用户时,您应该立即散列密码并在执行插入语句时将其存储为散列格式。您当前的逻辑以纯文本形式存储密码,如果注册成功,则尝试更新密码以成为散列密码。这意味着,如果有什么不成功的话,你最终可能会在数据库中只有明文密码,并且无论哪种方式,这意味着在某个特定的点上它确实以某种给定的点的纯文本存在,对于我们的任何用户不想要。

此外,更新语句除了浪费一些额外的代码行外没有任何其他用途。

像这样的东西应该做的:

if (mysqli_num_rows($results) > 0) { 
    $error = "That email address is taken."; 
} else { 
    $password = $_POST['password']; 
    $hashed_password = password_hash($password, PASSWORD_BCRYPT); 

    $query = "INSERT INTO `users` (`email`, `password`) VALUES('".mysqli_real_escape_string($link, $_POST['email'])."','".$hashed_password."') "; 

    if (!mysqli_query($link,$query)) { 
     $error = "<p>Could not sign you up - please try again later</p>"; 
    } else { 
     echo "Sign up successful"; 
    } 
} 

如果你真的要坚持你的计划,但是,那么你可以选择刚刚创建的用户的用户ID(例如通过电子邮件标识符有希望是独一无二的),并用它来确定要更新哪个用户。请不要这样做。

注:我建议看看mysqli'sprepared statements以确保更高级别的安全性而不是转义个体变量。

+0

你不应该在任何情况下逃脱密码 –

+1

我明白你的意思感谢 – Learno

+0

@MasivuyeCokile它不是,它是正确的。如果你认为这是错误的,你有权解释为什么,而不是仅仅声明它是错误的,因为没有人知道你是谁或为什么任何人应该信任你。这个答案中唯一缺少的是使用PDO和预处理语句,但密码散列背后的机制是完全正确的。 – Mjh