1

ユーザーをログインさせるためのクラスがありますが、フォームと不正な資格情報を使用してテストすると、まだ「成功」しています。誰かが私を正しい方向に向けることができますか?

include('User.datatype.php');

$usher = new Authenticator;
$usher->checkCreds();
$usher->ensureHasAccess();

Class Authenticator {
    protected $user;
    protected function getCreds() {
        if (!isset($_POST['login']))
            throw new Exception("There was an error processing your request", 1);
        else if ($_POST['username'] == '' || $_POST['password'] == '')
            throw new Exception("You must enter a username and password", 1);
        $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
        $password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);
        $this->user = new User;
        $this->user->username = $username;
        $this->user->password = $password;
    }

    public function checkCreds() {
        $this->getCreds();
        if (empty($this->user->username) || empty($this->user->password))
            throw new Exception("Error Processing Request", 1);
        include('dbconnect.php');   // Normally I'd store the db connect script outside of webroot
        $pdo = new PDO("mysql:host=$db_host;dbname=$db_name;", $db_user, $db_password);
        $stmt = $pdo->prepare('SELECT * FROM Users WHERE username = :uname AND password = :pword');
        $stmt->bindParam(':uname', $this->user->username);
        $stmt->bindParam(':pword', $this->user->password);
        $stmt->execute();
        $status = $stmt->fetch();
        $this->user->status = $status;
        print $status;
        return $this->user->status;
    }

    protected function createSessionID() {
        $seshID = mt_rand(99999, 1000000);
        return $seshID;
    }

    protected function startSession() {
        if (empty($this->user->status))
            throw new Exception("There was a problem connecting to the database", 1);
        session_start();
        $_SESSION['username'] = $this->user->username;
        $_SESSION['id'] = createSessionID();
        $secret = $_SESSION['id'];
        header('Location:index.php?' . $secret);
        return true;
    }

    protected function hasAccess() {
        $this->startSession();
        if (!startSession())
            throw new Exception("You do not have access to this page.", 1);
        return true;
    }

    public function ensureHasAccess() {
        if(!$this->hasAccess())
            throw new Exception("You are not logged in.");
        print 'Welcome, ' . $this->user->username;
    }
}

HTML フォーム:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">
    <head>
    </head>
    <body>
        <form action="authenticator.php" method="post">
            <p>username: <input type="text" name="username" /></p>
            <p>password: <input type="password" name="password" /></p>
            <p><input type="submit" name="login" /></p>
        </form>
    </body>
</html>
4

3 に答える 3

1

ページの真ん中にある「session_start()」を論理エラーの可能性としてすでに指摘したという事実を除いて、あなたが言うように修正された場合、私はこの行について悪い予感を覚えます。

 $stmt = $pdo->prepare('SELECT * FROM Users WHERE username = $this->user->username AND password = $this->user->password');

一重引用符は、$this->user の変数が実際の値に変更されるのを妨げている可能性があります。それはエラーではありませんが、私は MySQLi に精通しており、PDO はまだ使用していません。ただし、これを次のように変更することをお勧めします。

$stmt = $pdo->prepare('SELECT * FROM Users WHERE username = '.$this->user->username.' AND password = '.$this->user->password);

可能性のあるヒントにすぎません。それがそれであるかどうかはわかりませんが。

于 2013-04-22T14:04:13.813 に答える
0

手に入れましたか

<?php session_start(); ?>

あなたの index.php ページの上部に?

および var_dump($_SESSION); 保持している情報を確認する

私の知る限り、session_start(); が必要です。どのページでも、セッション情報を存在させたいと思っていました。

于 2013-04-22T13:56:47.110 に答える
0

ロジックにエラーがあります。 if (!session_start())セッションを開始し、開始に失敗した場合は例外をスローします。を使用してユーザーが承認されているかどうかを判断するなど、ユーザーが別の方法で承認されているかどうかを確認する必要があります$this->user->status = $status;

于 2013-04-22T13:57:12.243 に答える