password_verify не правильно работает

249
02 августа 2017, 22:20
<?php
require "db.php";
$data = $_POST;
if( isset($data['do_login']) )
{
    $errors = array();
    $user = R::findOne('users', 'login = ?', array($data['login']));
    if($user)
    {
     if( password_verify( $data['password'], $user->password )) {
       //$SESSION['logged_user'] = $user;
       echo '<div style="color: green;">Ну все</div><hr>';
     } else
     {
        $errors[] = 'pass no?';
     }
      } else
     {
        $errors[] = 'no akk';
     }
 }

if( ! empty($errors) )
{
    echo '<div style="color: red;">'.array_shift($errors).'</div><hr>';
}

?>
<form action="/login.php" method="POST">

<p>
 <p><strong>Login</strong>:</p>
 <input type="text" name="login" value="<?php echo $data['login']; ?>">
 </p>
<p>
 <p><strong>pass</strong>:</p>
 <input type="password" name="password">
 </p>
 <p>
  <button type="submit" name="do_login">login</button>
 </p>

</form>

пишу логин где нет с БД. пишет no akk (логин нет на БД) пишу логин и не правильно пароль где на БД. пишет pass no (пароль не правильно) пишу логин и правильно пароль. опять пишет pass no (пароль не правильно)

object(RedBeanPHP\OODBBean)#15 (10) { ["properties":protected]=> array(5) { ["id"]=> string(2) "20" ["login"]=> string(5) "root1" ["password"]=> string(30) "$2y$10$6F****************" ["pin"]=> string(4) "1234" ["email"]=> string(3) "123" } ["__info":protected]=> array(5) { ["type"]=> string(5) "users" ["sys.id"]=> string(2) "id" ["sys.orig"]=> array(5) { ["id"]=> string(2) "20" ["login"]=> string(5) "root1" ["password"]=> string(30) "$2y$10$6***************" ["email"]=> string(3) "123" } ["tainted"]=> bool(false) ["changed"]=> bool(false) } ["beanHelper":protected]=> object(RedBeanPHP\BeanHelper\SimpleFacadeBeanHelper)#11 (0) { } ["fetchType":protected]=> NULL ["withSql":protected]=> string(0) "" ["withParams":protected]=> array(0) { } ["aliasName":protected]=> NULL ["via":protected]=> NULL ["noLoad":protected]=> bool(false) ["all":protected]=> bool(false) }

это код

var_dump($user);
Answer 1

Исходя из этой информации

["password"]=> string(30) "$2y$10$6F****************"

предположу, что длина поля password в таблице пользователей составляет 30 символов.

Этого недостаточно для хранения хеша получаемого от функции password_hash():

Use the bcrypt algorithm (default as of PHP 5.5.0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP. For that reason, the length of the result from using this identifier can change over time. Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).

Следует увеличить длину поля для хранения хеша до 255 символов и перегенерировать пароли всех пользователей с помощью функции password_hash().

P.S. Если длина поля password на данный момент >= 60 символам, вам следует найти в коде причину урезания хеша пароля до 30 символов.

Answer 2

Функция password_verify - сравнивает пароль и его хеш. В Вашем случае, думаю Вам нужно сравнивать именно совпадение паролей. Попробуйте заменить

password_verify( $data['password'], $user->password )

на

$data['password'] === $user->password
READ ALSO
Как прикрутить ReCaptha, если на form уже висит action

Как прикрутить ReCaptha, если на form уже висит action

Есть попап плагин обратной связи, форме в котором уже присвоен экшн (отправка полей формы на email)

250
Правильная обработка переносов в Markdown

Правильная обработка переносов в Markdown

Столкнулся с проблемойПростейший сайт с текстовыми статьями, бэк на Phalcon PHP Framework (не суть), фронт ни на чём, отдельные JS наподобие jQuery и иже...

188
В telegram не передается значение

В telegram не передается значение

В первый раз пишу телеграм ботаУ него есть некоторые команды

178