Автор Тема: Авторизация  (Прочитано 15822 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Rodent

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 133
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unimix.ru
Авторизация
« : 12 Марта 2004, 00:02:31 »
Доброе время суток.

Мне хотелось бы спросить совета и узнать насколько правильна моя система авторизации (плюсы и минусы). А если есть возможность объяснить в чем моя ошибка или как улучшить.

Итак структура:

файл admin.php

$users["demo"]=md5("demo");

global $userName, $userPass;
session_start();

$userName=trim($_POST["user"]);
$userPass=trim($_POST["pass"]);
$userEnter=$_POST["submit"];

if ($userEnter=="Войти"):
   if ($userName=="") $error[]="Не заполнено поле \\"Имя\\"";
   if ($userPass=="") $error[]="Не заполнено поле \\"Пароль\\"";
   if ($users[$userName]!=md5($userPass)) $error[]="Неверный пароль";
   if (!isset($error)) {
   session_register("userName");
   session_register("userPass");
   $enter=1;
   }
   else $enter=0;
endif;

if (isset($error) && $error!=""):
   echo "Ошибка";
   foreach ($error as $value) echo "
  • $value
  • ";
    endif;

    if ($enter==0):
    ?>
    " method="post">

    Username:

    Password:



    elseif ($enter==1):
       echo "Вошли !!!";
    endif;
    ?>

    ну а дальше во все файлы где требуется авторизация я require данный файл. При этом содержимое файлов примерно такое:

    $enter=0;
    require ("admin.php");
    if ($enter==1):
     // а тут уже все что угодно
    endif;
    ?>

    Вот вроде все...
    С уважением, Николай
    « Последнее редактирование: 12 Марта 2004, 01:12:26 от Rodent »

    Оффлайн Rodent

    • Фанат форума
    • Постоялец
    • ***
    • Сообщений: 133
    • +0/-0
    • 0
      • Просмотр профиля
      • http://www.unimix.ru
    Авторизация
    « Ответ #1 : 12 Марта 2004, 01:04:46 »
    Народ я тут инфу накопал по своему вопросу и сейчас в ней разбераюсь, но все равно оцените (на плюсы и минусы) данный код, и как его сделать более правильным без использования БД но с использованием и куки и сессии.

    - http://forums.webscript.ru/showthread.php?s=&threadid=6822
    - http://phpclub.ru/talk/showthread.php?old=1&threadid=32810

    Оффлайн Макс

    • vir magni ingenii
    • Глобальный модератор
    • Ветеран
    • *****
    • Сообщений: 3534
    • +0/-0
    • 2
      • Просмотр профиля
    Авторизация
    « Ответ #2 : 12 Марта 2004, 01:24:54 »
    Цитировать
    Rodent:
    но все равно оцените (на плюсы и минусы) данный код

    если пхп работает с register_globals = On то взломать можно (вроде).
    Например замени свою форму на такую:
    " method="post">

    Username:

    Password:




    и введи в поля логин/пароль - new_user/1
    c4ca4238a0b923820dcc509a6f75849b - это md5("1");
    First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

    Оффлайн Rodent

    • Фанат форума
    • Постоялец
    • ***
    • Сообщений: 133
    • +0/-0
    • 0
      • Просмотр профиля
      • http://www.unimix.ru
    Авторизация
    « Ответ #3 : 12 Марта 2004, 13:50:01 »
    Так мой сервак, просто так переменные из формы брать не будет их надо сначала объявить типа
    $users[]=$_POST["users"];
    и тому подобное...
    Хотя я могу и заблуждаться...

    Оффлайн Neter

    • Жустер
    • Старожил
    • ****
    • Сообщений: 324
    • +0/-0
    • 2
      • Просмотр профиля
    Авторизация
    « Ответ #4 : 12 Марта 2004, 14:23:18 »
    Цитировать
    Rodent:
    global $userName, $userPass;


    Что ты этим хочешь сказать?

    Цитировать
    Rodent:
    if (!isset($error)) {
    session_register("userName");
    session_register("userPass");
    $enter=1;
    }
    else $enter=0;
    endif;

    Красиво написано :) Ты уж опредились как-нибудь.
    Цитировать
    Rodent:
    if (isset($error) && $error!=""):

    Ну кто же так делает? Ай-ай-ай.. :(

    Обьяви $error как пустой массив в начале скрипта. И проверяй:
    if (count($error))
    Мне тормоз послужил толчком...

    Оффлайн Макс

    • vir magni ingenii
    • Глобальный модератор
    • Ветеран
    • *****
    • Сообщений: 3534
    • +0/-0
    • 2
      • Просмотр профиля
    Авторизация
    « Ответ #5 : 12 Марта 2004, 16:15:08 »
    Цитировать
    Rodent:
    Так мой сервак, просто так переменные из формы брать не будет их надо сначала объявить типа

     я же написал, что эта дыра только при register_globals = on
    First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

    Оффлайн Rodent

    • Фанат форума
    • Постоялец
    • ***
    • Сообщений: 133
    • +0/-0
    • 0
      • Просмотр профиля
      • http://www.unimix.ru
    Авторизация
    « Ответ #6 : 12 Марта 2004, 16:31:19 »
    Neter
    1. я их глобализировал , т.к. мой сервак начинал ругаться. выдавал типа Warning: Unknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0"
    2. с этим я не понял с чем мне надо определиться???
    3. опять не понял в чем моя ошибка?

    Оффлайн Neter

    • Жустер
    • Старожил
    • ****
    • Сообщений: 324
    • +0/-0
    • 2
      • Просмотр профиля
    Авторизация
    « Ответ #7 : 12 Марта 2004, 17:32:17 »
    Rodent Переменные "глобализируют" только внутри функций, какая версия РНР?.

    2.
    Либо ты пишешь так if (expr){  }
    Либо if (expr):
    endif;

    3. Добавь в начало $error = array();
    И проверяй как if (count($array))

    Почему? Потому что так - правильно.

    [OFF]Люди зацените часть сырца РНРшного сайта http://www.php.net/include/site.inc[/OFF]
    Мне тормоз послужил толчком...

    Оффлайн Rodent

    • Фанат форума
    • Постоялец
    • ***
    • Сообщений: 133
    • +0/-0
    • 0
      • Просмотр профиля
      • http://www.unimix.ru
    Авторизация
    « Ответ #8 : 12 Марта 2004, 18:06:36 »
    Neter
    1. Apache 1.3.26 PHP 4.3.3
    2. C этим тоже разобрался, спасибо что уточнил
    3. Ну добавлю я $error=array();
    Проверю if (count($array)), но чо мне это даст? каков будет ответ?
    что вообще эта за структура count ($array) и что она мне дает?

    Оффлайн Neter

    • Жустер
    • Старожил
    • ****
    • Сообщений: 324
    • +0/-0
    • 2
      • Просмотр профиля
    Авторизация
    « Ответ #9 : 12 Марта 2004, 18:13:04 »
    Rodent Тьфу ты, не $array а $error, count($error) возвратит количество элементов массива, так правильней чем сначала искать есть ли эта переменная а потом сравнивать массив со строкой.
    Мне тормоз послужил толчком...

    Оффлайн Rodent

    • Фанат форума
    • Постоялец
    • ***
    • Сообщений: 133
    • +0/-0
    • 0
      • Просмотр профиля
      • http://www.unimix.ru
    Авторизация
    « Ответ #10 : 12 Марта 2004, 18:17:23 »
    Neter
    То есть если count($error) мне выдает 0, то можно продолжать работать?

    Всем
    Ладно я не много отвлекся от темы. может кто-нить еще даст советы по оптимизации данного вида авторизации. Или то что есть нормально?

    Оффлайн Rodent

    • Фанат форума
    • Постоялец
    • ***
    • Сообщений: 133
    • +0/-0
    • 0
      • Просмотр профиля
      • http://www.unimix.ru
    Авторизация
    « Ответ #11 : 12 Марта 2004, 20:43:53 »
    Я под конец совсем запулся с сессиями.
    как я понял, для того чтобы зарегистрировать переменную нужно написать
    session_start();
    session_register("user");
    После этого данная переменная появляется в в сессии, но она пока без значения, теперь мы ей присваиваем значение
    $user="admin";
    по идее в сессии теперь находиться переменная user со значением admin. правильно???
    Теперь. как мне добыть данную переменную на других страницах сайта???
    Опять открыть сессию и зарегить переменную
    session_start();
    session_register("user");
    теперь, по идее опять же, если написать
    echo $user;
    мне браузер должен вывести admin.
    Я прав или нет??? сама схема работы сессии мной понята правильно???

    Оффлайн Rodent

    • Фанат форума
    • Постоялец
    • ***
    • Сообщений: 133
    • +0/-0
    • 0
      • Просмотр профиля
      • http://www.unimix.ru
    Авторизация
    « Ответ #12 : 12 Марта 2004, 20:48:46 »
    И еще мне не совсем нравиться моя авторизация на других страницах сайта

    $enter=0;
    require ("admin.php");
    if ($enter==1):
    // а тут уже все что угодно
    endif;
    ?>

    Ситуация такая. что я допустим нормально зарегился на страничке авторизаторе, перехожу на другие защищенный странички где вставлена ссылка
    reqiure (auth.php);
    и допустим что авторизация не прошла. Тогда скрипт должен тут же прекратить долнейший вывод странички и перенаправить пользователя еще раз зарегиться.

    Оффлайн Rodent

    • Фанат форума
    • Постоялец
    • ***
    • Сообщений: 133
    • +0/-0
    • 0
      • Просмотр профиля
      • http://www.unimix.ru
    Авторизация
    « Ответ #13 : 12 Марта 2004, 20:50:57 »
    Я не слишком много вопросов задаю???
    я новичок в пхп, но я стараюсь, перед тем как задавать вопросы проникнуться данной проблемой.
    Ну а в общем данный форум, мне кажется, для того и существует чтобы помогать таким как мне и делиться опытом.
    Или я опять же не прав???

    Оффлайн Neter

    • Жустер
    • Старожил
    • ****
    • Сообщений: 324
    • +0/-0
    • 2
      • Просмотр профиля
    Авторизация
    « Ответ #14 : 12 Марта 2004, 21:56:39 »
    Rodent После товарища под ником "хах" твои вопросы как бальзам на душу :)

    Я несколько подправил твой код.

    auth.php
    <?
    $users["demo"]=md5("demo");

    session_start();

    $error = array(); // Типа так надо :)
    $_SESSION[\'username\'] = "";
    $_SESSION[\'userpass\'] = "";

    if (@$_POST["logon"]){ // @ Нужна для подавления ошибок . т.е. если человек не жмакнул кнопку
            $userName = trim(@$_POST["user"]);
            $userPass = trim(@$_POST["pass"]);
            if ($userName=="") { $error[]="Не заполнено поле \\"Имя\\""; }
            if ($userPass=="") { $error[]="Не заполнено поле \\"Пароль\\""; }
            if (array_key_exists($username, $users) && $users[$userName]!=md5($userPass)) { $error[]="Неверный пароль"; } // @ тут нужна потому что если индекса с логином не окажется чтобы РНР не ругался.
            if (!count($error)) {
                    $_SESSION[\'username\'] = $userName; // С переменными сесси гораздо удобней работать как с суперглобальным массивом.
                    $_SESSION[\'userpass\'] = $userPass;
            }
    }

    if (count($error)){ // Если $error не пуст покажем его содержимое.
            echo "Ошибка";
            foreach ($error as $value) { echo "<li>$value</li>"; }
    }

    if (!$_SESSION[\'username\']){
    ?>
    <form action="<?=$_SERVER[\'PHP_SELF\'];?>" method="post">

    Username: <input name="user" type="Text" size="10">

    Password: <input name="pass" type="Password" size="10">

    <input name="logon" type="submit" value="Войти">
    </form>
    <?
    exit; // Вывести форму и закончить выполнение скрипта.
    }
    ?>


    test.php
    <? 
    require(
    "auth.php");
    ?>
    А вот тут уже что угодно :)
    « Последнее редактирование: 13 Марта 2004, 10:23:58 от Neter »
    Мне тормоз послужил толчком...

     

    Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28