PhP crypt密码检查不起作用

时间:2014-12-20 09:28:18

标签: php mysqli passwords crypt

您好我正在学习php,我开始研究如何登录并使其安全。 我的密码登录有问题,我真的不知道如何检查我的数据库中是否有正确的密码。 我已经做到了,所以我的数据库中有一个密码,但现在我有点丢失了。我知道如何去盐,但不知道在我的代码中放置它。

<?php
if(isset($_POST['namn'])) {



$username = $_POST['namn'];
$password = $_POST['pass'];



    if($username&&$password) {




    $connect = mysqli_connect("localhost", "fredrik", "carlsson") or die("counld not connect");
    mysqli_select_db($connect, "securedb") or die("Could not connect to db");

    $query = sprintf("SELECT * FROM users WHERE namn = '%s' AND password = '%s'", $username,     $password);

    $result = mysqli_query($connect, $query) or die("error connection");



  if(mysqli_num_rows($result) !==0) {
    while($row = mysqli_fetch_assoc($result)) {
      $dbusername = $row['namn'];
      $dbpassword = $row['password'];



    } 

if($username==$dbusername){


  if(hash_equals($dbpassword, crypt($password, $dbpassword))) {
        header("Location: admin.php");
        $_SESSION['name'] = $dbusername;
   }
}     

}

}

}

?>

如果有人能给我一些提示,那会很棒。

3 个答案:

答案 0 :(得分:0)

我通过修复某些事情来解决问题。我发布它,这样你就可以看到我是如何做到的。 我确信这在很多方面都是正确的,但我刚刚开始学习,但是... ...

<?php
if(isset($_POST['namn'])) {



$username = $_POST['namn'];
$password = $_POST['pass'];



    if($username&&$password) {




    $connect = mysqli_connect("localhost", "fredrik", "carlsson") or die("counld not connect");
    mysqli_select_db($connect, "securedb") or die("Could not connect to db");

    $query = sprintf("SELECT * FROM users WHERE namn = '%s' ", $username);

    $result = mysqli_query($connect, $query) or die("error connection");



  if(mysqli_num_rows($result)){
    $row = mysqli_fetch_array($result);
      $dbusername = $row['namn'];
      $dbpassword = $row['password'];

       if($username==$dbusername && crypt($password, $dbpassword) == $dbpassword) {
      $_SESSION['name'] = $dbusername;

      header("Location: admin.php");

    }

    } 


  } 


}

?>

答案 1 :(得分:0)

我建议您使用password_hash()password_verify()而不是编写自己的代码。如果您有PHP版本&lt; 5.5.0,有一个兼容性库here

生成要存储在数据库中的初始哈希:password_hash($password, PASSWORD_DEFAULT);

并使用哈希检查密码:

if(password_verify($password, $hash) {
  header("Location: admin.php");
  $_SESSION['name'] = $dbusername;
}

请注意,您没有逃避用户输入,并且需要在使用session_start()之前添加$_SESSION来启用会话。

答案 2 :(得分:-1)

来自@Paul Crovella的建议:

<?php
$password = $_POST['pass'];

$ options [&#39; cost&#39;] = 10;     $ hashed_pwd = password_hash($ pass,PASSWORD_BCRYPT,$ options);

?>

这会创建您的密码哈希值,更新密码时应将此值输入数据库,然后检查密码:

<?php
$query = "SELECT password FROM users WHERE namn = '%s' LIMIT 1";
$output = mysqli_query($connect, $query);
$cheeckValue = mysqli_fetch_array($output);

现在,您在登录时在$ _POST [&#39;传递&#39;]中输入了密码,并且您在$ checkValue [&#39;密码&#39;]中将密码哈希保存在数据库中。

$passLogin = $_POST['pass'];
if(password_verify($passLogin,$checkValue['password'])){

print "Password is correct";
}
  else {
print "bad password"; 
}

这并没有解决SQL注入的严重问题,因此任何值都可以放入POST语句中,初始视图是运行mysql_real_escape_string AS WELL AS string_replace来查找`和&#39;字符并删除它们。

请参阅http://php.net/manual/en/function.password-hash.php

编辑: SQL INJECTION预防 (这是足够的,但如上所述, - &gt; prepare()和 - &gt; execute()处理更好。请研究。

$bad  = array("%", "_"); //replace these special characters
$good = array("\%", "\_"); //with these escaped versions. 
$username = str_ireplace($bad, $good, $_POST['namn']);
$password = str_ireplace($bad, $good, $_POST['pass']);


mysqli_set_charset($connect,"utf8"); 
$username = mysqli_real_escape_string($connect, $username);
$password = mysqli_real_escape_string($connect, $password);