2015-07-03 17 views
-1

У меня возникают проблемы с использованием password_verify для аутентификации пользователя с паролем. Когда я использовал md5, он работал нормально. Но он больше не работает.как аутентифицировать логин с password_verify в php

Что случилось с моим кодом (я не включил сессия):

<---php process ---> 

<?php 
$error = array(); 
$usererr = $passerr = ""; 
if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    if (!isset($_POST['username']) || empty($_POST['username'])) { 
     $error[] = 'username'; 

     $usererr = "username cannot be empty"; 
    } else { 
     $preg = $_POST['username']; 

     if (!preg_match("/^[a-zA-Z]*$/", $preg)) { 
      $error [] = 'username'; 
      $usererr = "only letters are allowed"; 
     } 
    } 
    if (!isset($_POST['password']) || empty($_POST['password'])) { 
     $error[] = 'password'; 
     $passerr = "password cannot be empty"; 
    } 

    if (empty($error)) { 
     //check to see if username and the hashed password exist there 
     $username = mysql_prep($_POST['username']); 
     $password = mysql_prep($_POST['password']); 

     //perform sql query to select all data 
     $sql = " SELECT * FROM tbl_staff WHERE username = '{$username}' "; 
     $result = mysqli_query($link, $sql); 
     confirm_query($result); //confirm query if true 
     while ($result_set = mysqli_fetch_array($result)) { 

      if (password_verify($_POST['password'], $result_set['hashed_password'])) { 
       echo $password; 
       header("location:staff.php"); 
      } else { 
       $message = "Username/password combo was not found in the database<br> Please Try again"; 
      } 
     } 
    }//end of empty 
    else { 
     if (count($error) == 1) { 
      $post_info = "There was " . count($error) . " error "; 
     } else { 

      $post_info = "There were " . count($error) . " error "; 
     } 
    }//end of empty error 
}//end of request method 
?> 
html form for login. 


<table class = "table"> 
    <tr><td class = "nav"><a href = "staff.php">Return To Menu</a></td> 
     <td class = "content"> 
      <p><?php 
if (!empty($message)) { 
    echo $message . "<br>"; 
} 
if (!empty($error)) { 

    foreach ($error as $errors) { 
     echo"<p>" . " - " . $errors . " field contains error" . "</p>"; 
    } 
} 
?></p> 
      <p class="error">*required fields</p> 
      <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post" > 
       <h1 style="font-size:36px;">Login</h1> 
       <p align="left" ><br> 
        <label>Username</label> 
        <input maxlength="30" name="username" type="text" value="<?php 
if (!empty($usererr)) { 
    echo $_POST['username']; 
}; 
?>"/> 
        <span class="error">*</span><?php echo $usererr ?></p><br> 
       <label> 
        Password</label> 
       <input name="password" maxlength="30" type="text" value=""/><span class= 
                        "error">*</span><?php echo $passerr ?> 
       </p> 
       <p>&nbsp;</p> 
       <p align="left"> 
        <input name="create" type="submit" value="Login "> 
       </p> 
      </form> 
     </td> 
    </tr> 
</table> 
?> 
+0

Измените свой код, чтобы удалить ненужные пустые строки. Нет необходимости делать это трудным для людей здесь, чтобы прокручивать через ненужные пустые разделы кода. – Anthon

+0

Если вы находитесь на PHP-версии <5.5, посмотрите на эту библиотеку: https://github.com/ircmaxell/password_compat – Stanimir

ответ

0

When i used md5 it worked fine.but not working anymore

Вы уверены, что этот пароль в базе данных не md5'ed?

BTW: Вы должны использовать md5 для обеспечения безопасности!

Edit:

For that BTW section: not really. MD5 was never meant for security. It's for validation. – Hkan

+0

Для этого * BTW * раздел: не совсем. MD5 никогда не предназначался для обеспечения безопасности. Это для проверки. – Hkan

+0

О, спасибо за исправление. – Maurize

+0

Я уверен, потому что password_hash работает нормально. Я не знаю, работает ли моя логика или проверяет проблемы. – bgreatfit

0

Если хэш пароля в базе данных в настоящее время MD5, то это будет не работать.

Ваш код выглядит правильным образом, убедитесь, что ваша версия PHP - 5.5.0 или более.

Источник: http://php.net/manual/en/function.password-verify.php

+0

Спасибо, но password_hash отлично работает при вставке в db – bgreatfit

0

Не работает, может быть из-за синтаксической ошибки:

}//end of empty 
      else{ 
       if(count($error)==1){ 
        $post_info = "There was ".count($error)." error "; 
       } 
       else { 

       $post_info = "There were ".count($error)." error ";  

       } 



       }//end of empty error 

     }//end of request method 

после окончания использования линии ?> и использовать после того, как использовать код PHP.

}//end of empty 
      else{ 
       if(count($error)==1){ 
        $post_info = "There was ".count($error)." error "; 
       } 
       else { 

       $post_info = "There were ".count($error)." error ";  

       } 



       }//end of empty error 

     }//end of request method 

    ?> // edit it !! 

Я надеюсь, что его работа!

+0

Я не получаю .. Можете ли вы уточнить свой ответ? – Makesh

+0

Ошибка синтаксиса в коде, закрыть тег php?> После строки комментария // конец пустой ошибки –

+0

@yog это не проблема синтаксиса. Я думаю, что это либо логика, либо password_verify не аутентифицируется. Password_hash работает отлично i – bgreatfit

Смежные вопросы