2013-04-22 3 views
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> 
+0

Функция «hasAccess», вы не должны вызывать «startSession» вместо «session_start»? – Touch

+0

Фраза «успех» не существует в вашем коде. –

+0

@Touch Я исправил это, но это не сработало. MikeB Извините, позвольте мне уточнить: я не получаю никаких ошибок – mishmomo

ответ

0

У вас есть

<?php session_start(); ?> 

в верхней части страницы index.php?

и var_dump ($ _ SESSION); чтобы узнать, какая информация у него есть

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

0

У вас есть ошибка в вашей логике. if (!session_start()) запускает сеанс, и если он не запускается, генерирует исключение. Вам нужно проверить, разрешен ли пользователь другим способом, например, с помощью $this->user->status = $status;, чтобы определить, разрешен ли пользователь.

1

За исключением того факта, что я уже указал «session_start()», который находится в середине страницы, как возможная логическая ошибка, если, как вы говорите, она исправлена, у меня плохое отношение к этой строке.

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

Одиночные кавычки могут препятствовать изменению переменных в этом пользователе this-> на реальные значения. Этого не может быть ошибка, но я больше знаком с MySQLi, еще не использовал PDO. Но я предлагаю вам попробовать изменить это на:

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

Только возможный намек. Не знаю, правда ли это.

+1

очень мало, чтобы подготовить заявление и вставить переменные непосредственно в подготовку. Либо выполните прямой запуск, либо выполните надлежащую подготовку так: имя пользователя: пароль, а затем '-> bindparam («: username », $ this-> user-> username);' и т. Д. – Dave

+0

Я бы добавил +1 (вы, кажется, заметили ошибка), но ваше предложение открывает его для SQL-инъекций. [Помните Бобби] ​​(http://xkcd.com/327/). – cwallenpoole

+0

Это правда. Я просто исправляю ошибку. Это зависит от ее безопасности. С MySQLi я бы использовал вопросительные знаки, чем bind. Но я, как я уже сказал, еще не использовал PDO. Поэтому я просто показал ей возможное решение. Это зависит от нее, чтобы позаботиться о SQL-инъекции, заменив мой код там, где это необходимо. Но я это заметил и благодарю за это. Надеюсь, она это увидит. – Touch

Смежные вопросы