2016-10-14 1 views
0

Кажется, я не могу получить password_verify для работы с кодом php PDO. Поле моего поля хранится как varchar (255). Я читал подобные вопросы, но из того, что я могу сказать, я его правильно настроил. Я все еще должен что-то пропускать. Моя страница регистрации выглядит следующим образом ..Каков правильный способ использования password_verify с PDO?

$user = $_POST['username'] 
$pass = $_POST['pass']; 
$passH = password_hash($pass, PASSWORD_DEFAULT); 
$query = $con->prepare("INSERT INTO emps (user, pass) VALUES (?, ?)"); 
$query->execute([$user, $passH]); 

Зашифрованный пароль успешно хранится в моей базе данных.

Моя страница Войти выглядит следующим образом ..

if(isset($_POST['login'])) { 
    $username = $_POST['username']; 
    $pass = trim($_POST['pass']; 
    $passH = password_hash($pass, PASSWORD_DEFAULT); 
    $sel_user = $con->prepare("SELECT id, username, pass, gid FROM emps WHERE gid!=4 AND username=?"); 
    $sel_user->execute([$username]); 
    $check_user=$sel_user->fetch(); 
    if(count($check_user)>0 && password_verify($passH, $check_user['pass'])) { 
    $_SESSION['username']=$check_user['username']; 
    header("Location: xadmin.php"); 
    exit; 
    } 
    else { 
    echo "<script>alert('Not Found')</script>"; 

Тело Странице Логина ..

<form action="login.php" method="post"> 
    <table width="100%" border="0"> 
     <tbody> 
      <tr> 
       <td bgcolor="#3B3B3B" height ="35" class="BodyTxtB" align="center">Administrator Login</td></tr> 
      <tr height="20"><td></td></tr> 
      <tr> 
       <td class="BodyTxtB" align="center">Username</td> 
      </tr> 
      <tr> 
       <td class="BodyTxtB" align="center"><input type="text" class="BodyTxtBC" name="username" required="required"/></td> 
      </tr> 
      <tr height="20"><td></td></tr> 
      <tr> 
       <td class="BodyTxtB" align="center">Password</td> 
      </tr> 
      <tr> 
       <td class="BodyTxtB" align="center"><input type="password" class="BodyTxtBC" name="pass" required="required"/></td> 
      </tr> 
      <tr height="20"><td></td></tr> 
      <tr height="35"><td align="center"><input type="image" src="images/btn_login.jpg" name="login" value="Login"/> 
      <input type="hidden" name="login" value="Login" /></td></tr> 
      <tr height="20"><td></td></tr> 
     </tbody> 
    </table> 
    </form> 

Можно ли обнаружить какие-либо ошибки?

+1

https://phpdelusions.net/pdo/password_hash –

+2

Зачем вам вводить пароль перед его проверкой? –

+2

Неправильно используется пароль_hash. Вам нужно предоставить пароль открытого текста с хешированным паролем (из базы данных). Также почему вы обрезаете пароль? –

ответ

1

Аргументы для password_verify() являются (1) unhashed пароль, который вы хотите проверить, и (2) хэшированного пароль, который вы используете в качестве ссылки. Вы хэширование первого аргумента перед сравнением:

$pass = trim($_POST['pass']; 
$passH = password_hash($pass, PASSWORD_DEFAULT); 
// ... 
if(count($check_user)>0 && password_verify($passH, $check_user['pass'])) { 

Вы должны делать password_verify($pass /** the unhashed one */, $check_user['pass'])

Кроме того, зачисткой пароля является плохой идеей. Что делать, если на самом деле пароль содержит пробелы (которые вы, , должны делать)?

+0

Спасибо, я попробовал это, но он все еще не работает. Теперь, когда я нажимаю кнопку «Отправить», форма входа исчезает, но я не перенаправляюсь на страницу и не появляется сообщение об ошибке. – craisondigital

+0

@craisondigital Проверьте свой журнал ошибок и консоль вашего браузера. Вероятность того, что вы ввели синтаксическую ошибку или плохое перенаправление в логику логина входа. –

+0

Спасибо @ Эд Коттрелл, он работает сейчас. – craisondigital

2

RTM? http://php.net/password_verify

boolean password_verify (string $password , string $hash) 

Проходите в PLAINTEXT пароль для $password. Вы не хешируете его сами. Это просто создаст новый хэш с РАЗЛИЧНОЙ солью, делая сравнения бессмысленными и невозможными.

password_verify будет извлекать правильную соль от $hash, использовать ее для хеша $password, а затем сравнить хеш-строки.

например. password_verify в основном только это:

function password_verify($pw, $hash) { 
    $salt = get_salt_from($hash); 
    $temp = password_hash($pw, $salt); 

    return ($temp == $hash); 
} 
+0

Очень забавно, как PHP упрощает все, серьезно, две функции, чтобы делать все ?, но люди все еще могут переусердствовать. $ temp === $ hash для этой дополнительной меры. –

+0

ну, 'get_salt_from()' может немного запутаться, но в остальном, да. password_verify - это просто удобство. –

+0

Спасибо @MarcB за это объяснение – craisondigital

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