Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > авторизация(ООП и процедура)


Автор: pr1de 26.7.2007, 13:12
есть скрипт авторизации который процедурно при вводе пароля и логина правельного пишет гуд.и есть тот же скрипт но я его переделал на ООП и при вводе правельного логина с паролем или не правельного без разницы пишет бэд!помогите пожалучта голова уже трещит.

процедурный исправный скрипт:

Код

<?php  


  include "../conf/config.php";



        $login=$_POST['login'];
        $password=$_POST['password'];
       
       
       
        $login=htmlspecialchars($login);
        $password=htmlspecialchars($password);

        $login=mysql_escape_string($login);
        $password=mysql_escape_string($password);
      
        if (isset($login) & isset($password))
        {
             $result=mysql_query("SELECT `name` FROM `conf` WHERE `admin_login`='$login' AND `admin_pass`='$password'") or die("admin error");


             if($val=mysql_num_rows($result)<1)
               {
                   print("bad");
                   
               }
             else
             {
                  print("good");

               }
}




     
        
?>



и вот ООПэшный в котором проблема(ошибку не выдает просто не правельнор фунциклирует) 

Автор: BSOD 26.7.2007, 13:44
а где нерабочий скрипт-то?

Автор: pr1de 26.7.2007, 15:01
извиняюсь че то я забородил вот он:
<?php
include "../conf/config.php";
Код

class admin
{
    var $login;
    var $password;
    var $result;
    var $val;
    
   
    function auth()
    {
        $this->login=$_POST['login'];
        $this->password=$_POST['password'];
       
        print("$this->login<br>$this->password");
       
        $this->login=htmlspecialchars($login);
        $this->password=htmlspecialchars($password);

        $this->login=mysql_escape_string($login);
        $this->password=mysql_escape_string($password);
      
        if (isset($this->login) & isset($this->password))
        {
             $this->result=mysql_query("SELECT `name` FROM `conf` WHERE `admin_login`='$this->login' AND `admin_pass`='$this->password'") or die("admin error");


             if($this->val=mysql_num_rows($this->result)<1)
               {
                   print("bad");
                   print("$this->val");
               }
             else
             {
                  print("good");

               }
        }

    }
}



?>



Автор: NightmareZ 26.7.2007, 16:02
Смысл оформлять всё это в класс?

Автор: pr1de 26.7.2007, 16:04
хочу свой форум переделать на классы,да и интересно почему не получается

Автор: Flashdown 26.7.2007, 16:06
http://phpfaq.ru/debug

Автор: NightmareZ 26.7.2007, 16:07
Цитата(pr1de @  26.7.2007,  16:04 Найти цитируемый пост)
хочу свой форум переделать на классы,да и интересно почему не получается

Какое преимущество даёт то, что ты всё завернул в класс?

Автор: Fally 26.7.2007, 16:16
По моему, надо бы вам сделать так:
Код

    function auth($log, $pwd)
    {
        $this->login = $log;
        $this->password = $pwd;
        // А дальше ваш код...
       


и соответственно вызывать:

Код

$obj->auth($_POST['login'], $_POST['password']);


Должно помочь.
NightmareZ, Хотя бы такие, что библиотеку можно будет повторно использовать (только если подредактировать, т.к. сейчас её не только повторно, но и вообще использовать нельзя ;))

Автор: Golda 26.7.2007, 22:18
Да, вариант Fally должен помочь и с точки зрения повторного использования кода он удобнее, поскольку не накладывает зависимости на источник получения login и password. А помочь он должен, поскольку обходится Ваша конкретная ошибка.

Цитата(pr1de @  26.7.2007,  15:01 Найти цитируемый пост)
        
        $this->login=$_POST['login'];
        $this->password=$_POST['password'];
       
        print("$this->login<br>$this->password");
       
        $this->login=htmlspecialchars($login);
        $this->password=htmlspecialchars($password);


Вы сначала пишете данные в поля класса $this->login, $this->password, а потом пытаетесь использовать не определенные ранее локальные переменные $login и $password. Они всегда пустые. Вот и результат всегда "bad".

P.S. Ну и к проблемам безопасности стоит отнестить внимательнее. Не стоит прямо в mysql_query() вставлять неэкранированные и нефильтрованные значения, прямо из $_POST

Автор: wolfmessing 27.7.2007, 09:12
И ещё на существование проверь  smile 

Код

$this->login=$_POST['login'];
$this->password=$_POST['password'];
        if ((empty($this->login)) || (empty($this->password))) die ('YOU ARE DEAD :)')
        print("$this->login<br>$this->password");


Ой сори извиняюсь опять не заметил 
Код

if (isset($this->login) & isset($this->password))


Тогда можно в md5 запяхнуть 
smile 
Код

$this->login = md5($_POST['login'])
$this->password=md5($_POST['password'])

 smile  ещё раз извиняюсь

Автор: pr1de 27.7.2007, 09:24
Цитата(Golda @ 26.7.2007,  22:18)
Да, вариант Fally должен помочь и с точки зрения повторного использования кода он удобнее, поскольку не накладывает зависимости на источник получения login и password. А помочь он должен, поскольку обходится Ваша конкретная ошибка.

Цитата(pr1de @  26.7.2007,  15:01 Найти цитируемый пост)
        
        $this->login=$_POST['login'];
        $this->password=$_POST['password'];
       
        print("$this->login<br>$this->password");
       
        $this->login=htmlspecialchars($login);
        $this->password=htmlspecialchars($password);


Вы сначала пишете данные в поля класса $this->login, $this->password, а потом пытаетесь использовать не определенные ранее локальные переменные $login и $password. Они всегда пустые. Вот и результат всегда "bad".

P.S. Ну и к проблемам безопасности стоит отнестить внимательнее. Не стоит прямо в mysql_query() вставлять неэкранированные и нефильтрованные значения, прямо из $_POST

разве этого не хватит для защиты ?

Код

 $this->login=htmlspecialchars($login);
        $this->password=htmlspecialchars($password);

        $this->login=mysql_escape_string($login);
        $this->password=mysql_escape_string($password);

Автор: Fally 27.7.2007, 09:46
pr1deВозможно и хватит, утверждать не буду, т.к. сам всегда использую http://php.net/mysql_real_escape_string, да и разработчиками она рекомендована. 
К тому же до сих пор не пойму 2 вещи в вашем коде:
1) зачем так обрабатывать пароль, не лучше ли его хранить в БД в виде MD5-хэша, и при сравнении его хэшировать? И SQL-injection по полю пароля вы точно не получите.
2) Поле с логином. Вопрос, а зачем вы допускаете потенциально опасные символы в логине. Мне кажется, что можно допускать для логина только символы: a-z, а-я, _, 0-9 . Всё, больше ничего не нужно. А проверить на корректность такой логин можно регулярным выражением.

Цитата

И ещё на существование проверь  smile 


Пишите проверь на существование, а проверяете пустая переменная или нет.. Определитесь с тем чего хотите и чего вы делаете ;)

Автор: pr1de 27.7.2007, 09:48
большое спасибо всем кто помогал!

Автор: wolfmessing 27.7.2007, 10:17
Цитата

проверяете пустая переменная или нет.. Определитесь с тем чего хотите и чего вы делаете ;)


ОК спосибо за замечание учту  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)