PHP - проверка password_hash () - PullRequest
       6

PHP - проверка password_hash ()

0 голосов
/ 22 ноября 2018

Следующий код должен быть прямым и простым, вставка в базу данных db on создает хеш, но позже, когда я пытаюсь войти с тем же паролем, создаваемый хеш не совпадает с тем, что находится вбаза данных (у меня был print_r повсюду, чтобы проверить).Может кто-нибудь увидеть, не вижу ли я что-то глупое?

session_start();
require_once("login.php");
$error = "";
$email = "";
$password = "";

if (isset($_GET['logout'])) {
    unset($_SESSION['id']);
    setcookie('id', '', time() - 60*60);
    $_COOKIE['id'] = "";
} else {
    if (isset($_SESSION['id']) or isset($_COOKIE['id'])) {
        header("Location: loggedinpage.php");
    }
}

if (isset($_POST["submit"])) {
    $link = mysqli_connect($hn, $un,$pw,$db);
    if($link->connect_error) die("Fatal Errror.");
    if (!$_POST["email"]) {
        $error .="An email address is required<br>";
    }
    if (!$_POST["password"]) {
        $error .="A password address is required<br>";
    }
    if ($error != "") {
        $error= "<p>There were error(s) in your form:</p>".$error;
    } else {
        if ($_POST['signup'] == 1) {
            $email = mysqli_real_escape_string($link, $_POST['email']);
            $password = mysqli_real_escape_string($link,$_POST['password']);
            $query = "SELECT id FROM `users` WHERE email = '".$email."' LIMIT 1";
            $result=$link->query($query);
            if (mysqli_num_rows($result) > 0) {
                $error = "That email address is taken.";
            } else {
                $hashedPassword = password_hash($password, PASSWORD_DEFAULT);
                $query = "INSERT INTO `users`(`email`,`password`) VALUES ('".$email."', '".$hashedPassword."')";

                if (!mysqli_query($link,$query)) {
                    $error = "<p>Could not sign you up, please try again later</p>";
                } else {
                    $_SESSION['id'] = mysqli_insert_id($link);
                    if(isset($_POST['stayLoggedIn']) and $_POST['stayLoggedIn'] == 1) {
                        setcookie('id', mysqli_insert_id($link), time()+60*60*24);
                    }
                    header("Location: loggedinpage.php");
                }
            }
        } else {
            $email = mysqli_real_escape_string($link, $_POST['email']);
            $password = mysqli_real_escape_string($link, $_POST['password']);
            $hashedPassword = password_hash($password,PASSWORD_DEFAULT);
            $query = "SELECT * FROM users WHERE email = '".$email."' LIMIT 1";
            $result = $link->query($query);
            if ($result->num_rows > 0) {
                $row = $result->fetch_array(MYSQLI_ASSOC);
                if ($email == $row['email'] and password_verify($password,$row['password'])) {
                    if (isset($_POST['stayLoggedIn']) and $_POST['stayLoggedIn'] == 1) {
                        setcookie('id', $row['id'], time()+60*60*24);
                        header("Location: loggedinpage.php");
                    }  
                } else {
                    $error = "Incorrect Username/Password combination";
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Несмотря на то, что он спрятан в конце абзаца, Документация PHP действительно говорит, что "рекомендуется сохранить результат в столбце базы данных, который может расширяться за пределы 60 символов (было бы неплохо 255 символов)choice). "

Текущий алгоритм по умолчанию, bcrypt, генерирует хэши длиной 60 символов.Если столбец вашей базы данных не может содержать хотя бы столько символов, ваши хэши будут обрезаны и проверка не будет выполнена.


У вас также есть несколько других проблем:

  • Вы изменяете пароль перед генерацией хэша (с помощью mysqli_real_escape_string())
  • Вы не используете подготовленные заявления
  • Вы, похоже, полагаетесь на файлы cookie дляаутентификация.Файлы cookie - это данные, созданные пользователями, им нельзя доверять!Вот почему PHP обеспечивает поддержку сеанса, потому что данные хранятся на сервере.
  • Вы не должны проверять существующий адрес электронной почты с помощью запроса, вместо этого вы должны иметь уникальный индекс для столбца электронной почты вбаза данных.
0 голосов
/ 22 ноября 2018

try

  if(password_verify($password, (string)$row->password)){
             //Your Code
            }

, поскольку функция password_verify возвращает только логическое значение true или false

И

$hashedPassword = password_hash($password,PASSWORD_DEFAULT);

Добавляется только один раз при вставке вSql (новый пользователь)

...