Функция password_verify () возвращает false, когда должна вернуть true - PullRequest
0 голосов
/ 29 марта 2019

Я создаю проект для конкурса в моей школе. Я правильно выполнил регистрационную часть. Когда дело доходит до части входа в систему, я не могу понять это правильно. Я пытался найти проблему во многих других сайты, но не могут его найти. Функции возвращают false, даже когда я ввожу пароль в функцию.

Я попытался хэшировать с паролем _BCRYPT пароль, полученный от $ _POST ['password'], а затем сравнить его с паролем в базе данных с помощью hash_equals (), но он не работал

Это логин.php РЕДАКТИРОВАТЬ: я забыл добавить register.php и файл_db.php. Извините!

<?php
require "file_db.php";
$email= $mysqli->escape_string($_POST['email']);
echo $_POST['email'];
$result= $mysqli->query("SELECT *FROM users WHERE email='$email'");
if($result->num_rows == 0) {
    $SESSION['message']="Nu exista niciun utilizator cu acel email";
    header("location:error.php");
} else {
    $user=$result->fetch_assoc();
    $hash=substr($user['password'],0,60);
    if(password_verify($_POST['password'],$hash)) {
        $_SESSION['email']=$user['email'];
        $_SESSION['firstname']=$user['firstname'];
        $_SESSION['lastname']=$user['lastname'];
        $_SESSION['active']=$user['active'];
        $_SESSION['loggedin']=true;
        echo $_SESSION['loggedin'];
        echo 1;
    } else{
        $_SESSION['message']="Ai introdus o parola gresita!";
    }
}
?>
<?php
require "file_db.php";

$firstname = $mysqli->escape_string($_POST['firstname']);
$lastname = $mysqli->escape_string($_POST['lastname']);
$email = $mysqli->escape_string($_POST['email']);
$password =$mysqli->escape_string(password_hash($_POST['password'],PASSWORD_BCRYPT));
$hash = $mysqli->escape_string(md5(rand(0,1000) ) );

$_SESSION['email']=$_POST['email'];
$_SESSION['firstname']=$_POST['firstname'];
$_SESSION['lastname']=$_POST['lastname'];

$result = $mysqli->query("SELECT * FROM users WHERE email ='$email' ") or die($mysqli->error());

if($result->num_rows > 0)
{
    $_SESSION['message']='Exista un utilizator cu acest email deja!';
    header("location:error.php");
}
else{
    $sql="INSERT INTO users (firstname,lastname,email,password,hash)".
        "VALUES('$firstname','$lastname','$email','$password','$hash')";
    if( $mysqli->query($sql) )
    {
        $_SESSION['active']=0;
        $_SESSION['message']="Link  de confirmare a fost trimis la $email, te rugam sa iti verifici contul accesand link-ul trimis in email!";

        $to = $email;
        $subject='Account Verification';
        $messageb='
        Salut'.$firstname.',
        Multumim pentru ca te-ai inscris!
        Apasa pe acest link pentru a-ti activa contul:
        https://localhost/aWEBDEVFII/verify.php?email='.$email.'&hash'.$hash;
        mail($to, $subject, $messageb);

        header("location:success.php");
    }
    else{
        $_SESSION['message']='Inregistrarea a intampinat o eroare!';
        header("location: error.php");
    }
}
?>
``````




<?php
session_start();
$host='localhost';
$user='root';
$pass='';
$db='filesdb';
$mysqli= new mysqli($host,$user,$pass,$db) or die($mysqli->error);
?>

1 Ответ

0 голосов
/ 29 марта 2019

Сначала, почему вы применяете функцию substr() к хешированному паролю

Функция substr() используется для вырезания части строки из строки, начиная с указанной позиции и т. Д.

Если вы хотите проверить длину введенного пароля, вы должны использовать strlen(), а затем вернуть пользователю сообщение, если длина пароля превышает 60

if (strlen($password)<60) {
  echo "less than 60";
}
else
if (strlen($password)>40) {
  echo "more than 60";
}
else {
  echo "exactly 60";
}

Чтобы иметь возможность использовать password_verify(), вам следуетиметь возможность сначала хешировать пароль пользователя во время регистрации через функцию password_hash().Например,

 $password ='nancymore12344444';
 $options = array("cost"=>4);
 $hashPassword = password_hash($password,PASSWORD_BCRYPT,$options);

Опять они будут проблемой в вашем сценарии входа в систему, потому что я не видел, чтобы вы инициализировали сеанс с помощью session_start ()

Попробуйте код ниже, покаобеспечение ввода учетных данных базы данных и всех столбцов таблицы.у вас все будет в порядке

, поэтому ваш php регистрации будет выглядеть примерно так:

<?php
//require "file_db.php"; 
$conn = mysqli_connect("localhost","root","","demo");

if(!$conn){
    die("Connection error: " . mysqli_connect_error()); 
}

if(isset($_POST['submit'])){
        $firstName = mysqli_real_escape_string($conn,$_POST['first_name']);
        $surName = mysqli_real_escape_string($conn,$_POST['surname']);
        $email  = mysqli_real_escape_string($conn,$_POST['email']);
        $password = mysqli_real_escape_string($conn,$_POST['password']);

        $options = array("cost"=>4);
        $hashPassword = password_hash($password,PASSWORD_BCRYPT,$options);

        $sql = "insert into users (first_name, last_name,email, password) value('".$firstName."', '".$surName."', '".$email."','".$hashPassword."')";
        $result = mysqli_query($conn, $sql);
        if($result)
        {
            echo "Registration successfully";
        }
    }
?>

ваш логин

<?php 
//require "file_db.php";
$conn = mysqli_connect("localhost","root","","demo");

if(!$conn){
    die("Connection error: " . mysqli_connect_error()); 
}
if(isset($_POST['submit'])){
    $email = mysqli_real_escape_string($conn,$_POST['email']);
    $password = mysqli_real_escape_string($conn,$_POST['password']);

    $sql = "select * from users where email = '".$email."'";
    $rs = mysqli_query($conn,$sql);
    $numRows = mysqli_num_rows($rs);

    if($numRows  == 1){
        $row = mysqli_fetch_assoc($rs);
        if(password_verify($password,$row['password'])){
            echo "Password verified and ok";

// initialize session if things where ok.


session_start();
session_regenerate_id();

$_SESSION['surname'] = $row['surname'];
$_SESSION['first_name'] = $row['first_name'];
$_SESSION['email'] = $row['email'];

// take me to welcome.php page
header('Location: welcome.php');

        }
        else{
            echo "Wrong Password details";
        }
    }
    else{
        echo "User does not exist";
    }
}

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...