2016-03-01 3 views
1

Может ли кто-нибудь направить меня, где я ошибаюсь. Хеширование паролей работает нормально и хранится в моей базе данных, но когда я пытаюсь войти в систему, используя настоящий пароль, например (123), он не регистрирует меня. Спасибо!password_hash() не работает

<?php 
     // registration script 
     if (isset($_POST['submit'])) { 

      $user_name = $_POST['username']; 
      $user_email = $_POST['email']; 
      $user_pass = $_POST['password']; 

      $query = "SELECT * FROM users where Email = '" . $_POST["email"] . "'"; 
      $result = $obj->run_query($query); 

      if ($count = mysqli_num_rows($result) == 0) { 

       $query = "INSERT INTO users (Name, Email, Pass) VALUES('" . $user_name . "', '" . $user_email . "', '" . password_hash($user_pass, PASSWORD_DEFAULT) . "')"; 
       $result = $obj->run_query($query); 

       echo "<script>alert('You have successfully Registered!')</script>"; 
       echo "<script>window.open('welcome.php','_self')</script>"; 

      } else { 

       echo "<script>alert('This user email $user_email is already exist!')</script>"; 
      } 
     } 

    // login script 
    if (isset($_POST['login'])) { 

     $name = $_POST['name']; 
     $email = $_POST['email']; 
     $password = password_hash($_POST['pass'], PASSWORD_DEFAULT); 


     $query = "SELECT * FROM users WHERE Email = '$email' AND Pass = '$password'"; 
     $result = $obj->run_query($query); 

     if ($count = mysqli_num_rows($result) > 0) { 

      $_SESSION['email'] = $email; 
      $_SESSION['name'] = $name; 

      echo "<script>window.open('welcome.php','_self')</script>"; 

     } else 

     { 
      echo "<script>alert('Your email or password is incorrect!')</script>"; 
     } 

    } 

?> 
+0

Там нет упоминания о 'password_hash()' где-нибудь в вашем коде и говорить somethng является " давая ошибки ", не сообщая нам, что ошибки бесполезны. Также читайте об атаках SQL Injection и предотвратите их. – PeeHaa

+1

Функция [password_verify()] (http://www.php.net/manual/en/function.password-verify.php) используется для сравнения пароля открытого текста пользователя с сохраненным хешированным паролем точно так же, как и описанных в Документах PHP ..... вы не используете хэш-код пользователя и не сравниваете хэши, которые просто не могут работать как password_hash(), уникально солевое значение каждый раз, когда оно вызывается –

+1

Так что ваш код проверки входа должен быть извлечен запись из таблицы 'users', используя только адрес электронной почты, а затем используя пароль_верие, чтобы сравнить введенный пользователем пароль с хэшем пароля, полученным этим SQL-запросом –

ответ

2

Вам потребуется для устранения проблем SQL-инъекции самостоятельно, это просто показать, как использовать password_verify()

// login script 
if (isset($_POST['login'])) { 

    $name = $_POST['name']; 
    $email = $_POST['email']; 
    $password = $_POST['pass']; 


    $query = "SELECT * FROM users WHERE Email = '$email'"; 
    $result = $obj->run_query($query); 

    if ($count = mysqli_num_rows($result) > 0) { 
     $row = $result->fetch_object(); 
     if (password_verify($password, $row->Pass)) { 
      $_SESSION['email'] = $email; 
      $_SESSION['name'] = $name; 

      echo "<script>window.open('welcome.php','_self')</script>"; 
     } else { 
      echo "<script>alert('Your email or password is incorrect!')</script>"; 
     } 
    } else { 
     echo "<script>alert('Your email or password is incorrect!')</script>"; 
    } 

} 
+0

Спасибо! вы решили мою проблему :) @Mark Baker –

+1

@AishaSalman Как я уже упоминал, имейте в виду, что ваш скрипт открыт для SQL-инъекции. Я мог бы легко попытаться войти в систему с каждым пользователем, не зная их адреса электронной почты, просто используя «email» ''ИЛИ 1 = 1 LIMIT 0, 1 -' для первого пользователя, 'ИЛИ ИЛИ 1 = 1 LIMIT 1, 1 - 'для второго пользователя и т. д. – h2ooooooo

+0

ОК получилось! спасибо @ h2ooooooo –

1

Это не может работать:

$query = "INSERT INTO users (Name,Email,Pass) VALUES ('$user_name','$user_email', md5('$user_pass'))"; 

Попробуйте это:

$query = "INSERT INTO users (Name, Email, Pass) VALUES('" . $user_name . "', '" . $user_email . "', '" . password_hash($user_pass, PASSWORD_DEFAULT) . "')"; 

password_hash функция дает вам хэш зашифрованную с помощью алгоритма Bcrypt. См. Здесь: http://php.net/manual/en/function.password-hash.php

Это довольно уязвимо для SQL-инъекции. Вы должны прочитать о том, как их предотвратить. Найдите «параметризованные запросы»!

+0

Эй, я сделал то же самое, но потом меня это не запустило:/@Ferhat Sayan –

+1

Посмотрите здесь: http://php.net/manual/en/function.password-verify.php –

+0

Можете ли вы исправить мой код как я не знаю, как реализовать это в моем кодировании? @Ferhat Sayan –

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