Phpass Проверка хешированного пароля

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

// END FORM DATA ERROR HANDLING
// Begin Insertion of data into the database

require("php_includes/PasswordHash.php");
$hasher = new PasswordHash(8,false);
$p_hash = $hasher->HashPassword($p);
if (strlen($p_hash)>=20){

    // Add user info into the database table for the main site table
    $sql = "INSERT INTO users (username, email, password, gender, country, ip, signup, lastlogin, notescheck)       
            VALUES('$u','$e','$p_hash','$g','$c','$ip',now(),now(),now())";
    $query = mysqli_query($db_conx, $sql); 
    $uid = mysqli_insert_id($db_conx);

У меня есть небольшая проблема на моей странице входа, где у меня есть простая форма и следующий блок кода в верхней части моей страницы...

include_once("php_includes/check_login_status.php");
// If user is already logged in, header that weenis away
if($user_ok == true){
    header("location: user.php?u=".$_SESSION["username"]);
    exit();
}
// AJAX CALLS THIS LOGIN CODE TO EXECUTE
if(isset($_POST["e"])){
    // CONNECT TO THE DATABASE
    include_once("php_includes/db_conx.php");
    // GATHER THE POSTED DATA INTO LOCAL VARIABLES AND SANITIZE
    $e = mysqli_real_escape_string($db_conx, $_POST['e']);
    require('php_includes/PasswordHash.php');
    $hasher = new PasswordHash(8, FALSE);
    $hash = $hasher->HashPassword($p);
    $checked = $hasher->CheckPassword($p, $hash);
    $p = $_POST["p"];
    // GET USER IP ADDRESS
    $ip = preg_replace('#[^0-9.]#', '', getenv('REMOTE_ADDR'));
    // FORM DATA ERROR HANDLING
    if($e == "" || $p == ""){
        echo "login_failed";
        exit();
    } else {
    // END FORM DATA ERROR HANDLING
        $sql = "SELECT id, username, password FROM users WHERE email='$e' AND activated='1' LIMIT 1";
        $query = mysqli_query($db_conx, $sql);
        $row = mysqli_fetch_row($query);
        $db_id = $row[0];
        $db_username = $row[1];
        $db_pass_str = $row[2];
        if($p != $db_pass_str){
            echo "login_failed";
            exit();
        } else {
            // CREATE THEIR SESSIONS AND COOKIES
            $_SESSION['userid'] = $db_id;
            $_SESSION['username'] = $db_username;
            $_SESSION['password'] = $db_pass_str;
            setcookie("id", $db_id, strtotime( '+30 days' ), "/", "", "", TRUE);
            setcookie("user", $db_username, strtotime( '+30 days' ), "/", "", "", TRUE);
            setcookie("pass", $db_pass_str, strtotime( '+30 days' ), "/", "", "", TRUE); 
            // UPDATE THEIR "IP" AND "LASTLOGIN" FIELDS
            $sql = "UPDATE users SET ip='$ip', lastlogin=now() WHERE username='$db_username' LIMIT 1";
            $query = mysqli_query($db_conx, $sql);
            echo $db_username;
            exit();
        }
    }
    exit();
}

В основном происходит то, что я получаю сообщение об ошибке при попытке войти в систему! У кого-нибудь есть идеи?

Приветствия для ответов изменили это так...

?><?php
// AJAX CALLS THIS LOGIN CODE TO EXECUTE
if(isset($_POST["e"])){
    // CONNECT TO THE DATABASE
    include_once("php_includes/db_conx.php");
    // GATHER THE POSTED DATA INTO LOCAL VARIABLES AND SANITIZE
    $e = mysqli_real_escape_string($db_conx, $_POST['e']);
    require('php_includes/PasswordHash.php');
    $hasher = new PasswordHash(8, FALSE);
    $hash = $hasher->HashPassword($p);
    $checked = $hasher->CheckPassword($p, $hash);
    $hash = $_POST["p"];
    // GET USER IP ADDRESS
    $ip = preg_replace('#[^0-9.]#', '', getenv('REMOTE_ADDR'));
    // FORM DATA ERROR HANDLING
    if($hash != $db_pass_str){//and not $p != $dp_pass_str
       echo "login_failed";
       exit();
    } else {
    // END FORM DATA ERROR HANDLING
        $sql = "SELECT id, username, password FROM users WHERE email='$e' AND activated='1' LIMIT 1";
        $query = mysqli_query($db_conx, $sql);
        $row = mysqli_fetch_row($query);
        $db_id = $row[0];
        $db_username = $row[1];
        $db_pass_str = $row[2];
            // CREATE THEIR SESSIONS AND COOKIES
            $_SESSION['userid'] = $db_id;
            $_SESSION['username'] = $db_username;
            $_SESSION['password'] = $db_pass_str;
            setcookie("id", $db_id, strtotime( '+30 days' ), "/", "", "", TRUE);
            setcookie("user", $db_username, strtotime( '+30 days' ), "/", "", "", TRUE);
            setcookie("pass", $db_pass_str, strtotime( '+30 days' ), "/", "", "", TRUE); 
            // UPDATE THEIR "IP" AND "LASTLOGIN" FIELDS
            $sql = "UPDATE users SET ip='$ip', lastlogin=now() WHERE username='$db_username' LIMIT 1";
            $query = mysqli_query($db_conx, $sql);
            echo $db_username;
            exit();
        }
    exit();
}
?>

Но я все еще получаю ошибку входа


person Phillip Dews    schedule 09.02.2013    source источник
comment
Какое сообщение об ошибке? Ошибка БД? или только ваш Login_failed?   -  person Damien Pirsy    schedule 09.02.2013
comment
просто сообщение об ошибке входа в систему!   -  person Phillip Dews    schedule 09.02.2013
comment
Просматривая ваш код, я вижу только $p, установленный в качестве пароля, опубликованного пользователем, который вы сравниваете с предположительно хешированным паролем в db.   -  person Damien Pirsy    schedule 09.02.2013


Ответы (1)


Вы устанавливаете $p в качестве пароля POST (не хешированного)

$p = $_POST["p"];

Похоже, тогда должно быть:

 if($hash != $db_pass_str){         //and not $p != $dp_pass_str
  echo "login_failed";

то есть сравнить сохраненный хешированный пароль с введенным и хешированным паролем (чтобы сравнить два хэша)

person Damien Pirsy    schedule 09.02.2013
comment
Поменял, а радости нет! спасибо за помощь Дэмиен! - person Phillip Dews; 09.02.2013