0

たまたまログインフォームに問題がありました。パスワードの一部が正しい場合はログインできるようです。

次のユーザーを作成する場合:

ユーザー名: へへへへへ

パスワード: へへへへへ

「hehehehe」「hehehehehe11111」などのパスワードでログインできます。完全に間違って書くと機能しません。

ログイン.php

if (empty($_POST) === false) {

$username = trim($_POST['username']);
$password = trim($_POST['password']);

if (empty($username) === true || empty($password) === true) {
    $errors[] = 'Sorry, but we need your username and password.';
} else if ($users->user_exists($username) === false) {
    $errors[] = 'Sorry that username doesn\'t exists.';
// } else if ($users->email_confirmed($username) === false) {
    // $errors[] = 'Sorry, but you need to activate your account. 
                 // Please check your email.';

} else {
    if (strlen($password) > 18) {
        $errors[] = 'The password should be less than 18 characters, without spacing.';
    }
    $login = $users->login($username, $password);
    if ($login === false) {
        $errors[] = 'Sorry, that username/password is invalid';
    }else {
        $_SESSION['id'] =  $login;
        header('Location: home.php');
        exit();
    }
}

}

User.class.php

public function login($username, $password) {

    global $bcrypt;

    $query = $this->db->prepare("SELECT `password`, `user_id` FROM `users` WHERE `username` = ?");
    $query->bindValue(1, $username);

    try{

        $query->execute();
        $data               = $query->fetch();
        $stored_password    = $data['password']; 
        $id                 = $data['user_id']; 

        if($bcrypt->verify($password, $stored_password) === true){ 
            return $id;
        }else{
            return false;   
        }

    }catch(PDOException $e){
        die($e->getMessage());
    }

}

Bcrypt.class.php

class Bcrypt {
private $rounds;
public function __construct($rounds = 12) {
    if(CRYPT_BLOWFISH != 1) {
        throw new Exception("Bcrypt is not supported on this server, please see the following to learn more: http://php.net/crypt");
    }
    $this->rounds = $rounds;
}

private function genSalt() {

    $string = str_shuffle(mt_rand());
    $salt   = uniqid($string ,true);

    return $salt;
}


public function genHash($password) {

    $hash = crypt($password, '$2y$' . $this->rounds . '$' . $this->genSalt());
    return $hash;
}


public function verify($password, $existingHash) {

    $hash = crypt($password, $existingHash);


    if($hash === $existingHash) {
        return true;
    } else {
        return false;
    }
}

}

何か案は?

登録プロセスでできると思われる場合は、お知らせください。登録コードもアップロードします。私が理解できないのは、パスワードの一部だけが正しい場合でも機能する理由です。これまでに経験したことがありません。

4

1 に答える 1

1

クリプトはフグではなくハッシュにDESを使用しているようです: http://php.net/manual/en/function.crypt.php

標準の DES ベースの crypt() は、ソルトを出力の最初の 2 文字として返します。また、str の最初の 8 文字のみを使用するため、同じ 8 文字で始まる長い文字列は同じ結果を生成します (同じソルトが使用されている場合)。

コードを使用して、最初の 8 文字だけでログインしてみてください。

また、データベースに保存されている保存済みハッシュを調べて、blowfish を使用しているか DES を使用しているかを確認してください。フグを使用している場合は、使用した $2y$ 署名が必要です。

于 2013-08-03T15:57:12.987 に答える