Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
 Аватар для nfernee
3 / 3 / 1
Регистрация: 13.03.2012
Сообщений: 29

Авторизация

12.11.2012, 02:37. Показов 3812. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Я не профи в ООП, но немного всетаки знаю, еще учусь
вчера начал работать над Авторизацией и хочу чтобы вы оценили его с точки зрения професионалов и с безопасности.
сделайте замечания)))

пожалуйста кому не лень посмотрите

login.class.php
PHP
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
class login {
    
    static private $login;
    static private $password;
    static private $hash;
    
    public $error = '';
    
    private $sql_conn;
    private $sql_fetch;
    
    private function generateCode($length = 6) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRQSTUVWXYZ0123456789"; 
        $code = ""; 
        $clen = strlen($chars) - 1;   
        while (strlen($code) < $length) { 
            $code .= $chars[mt_rand(0,$clen)];   
        } 
        return $code; 
    }
    
    public function logon($loginP,$passwordP) {
 
        self::$login = mysql_real_escape_string($loginP);
        self::$password = mysql_real_escape_string($passwordP);
        
        if(self::$login != "" && self::$password != "") {
            if(preg_match("/^([a-zA-Z0-9]{4,16})$/",self::$login)) {
                
                self::$password = md5(md5(self::$password));
                
                $this->sql_conn = mysql_query("SELECT id,login,password FROM `users` WHERE `login`='".self::$login."' LIMIT 1");
                $this->sql_fetch = mysql_fetch_array($this->sql_conn);
                
                if($this->sql_fetch["login"] == self::$login && $this->sql_fetch["password"] == self::$password) {
                    
                    self::$hash = md5($this->generateCode(10));
                    mysql_query("UPDATE users SET hash='".self::$hash."' WHERE id='".$this->sql_fetch["id"]."'");
                    
                    setcookie("id", $this->sql_fetch["id"], time() + 3600 * 24 * 7);
                    setcookie("hash", self::$hash, time() + 3600 * 24 * 7);
                    
                    $_SESSION["id"] = $this->sql_fetch["id"];
                    $_SESSION["hash"] = self::$hash;
 
                    header("Location: ".SITE_URL);
                }
                else {
                    $this->error = 'ასეთი ლოგინი არ არსებობს მომხმარებელი';
                }
            }
            else {
                $this->error = 'ლოგინი ან პაროლი შედგება არაკორექტული სიმბოლოებისგან!';
            }
        }
        else {
            $this->error = 'შეცდომა ლოგინი ან აპროლი არ არის შეყვანილი!';
        }
    }
 
    public function logout() {
         setcookie('id', '', time() - 3600 * 24 * 7, '/'); 
         setcookie('hash', '', time() - 3600 * 24 * 7, '/');
         
         unset($_SESSION["id"]);
         unset($_SESSION["hash"]);
         
         header("Location: ".SITE_URL);
    }
    
    public function CookiesValid() {
        if(isset($_COOKIE["id"]) || isset($_COOKIE["hash"])) {
            require_once "template/panel.php";
        }
        else {
            require_once "template/login.php";
        }
    }
}
login.template.php
PHP
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
<?php
if(isset($_POST['loginSub'])) {
    $login = new login();
    $login->logon($_POST['username'],$_POST['password']);
    
    echo $login->error;
}
?>
<form action="" method="post">
<table width="500" height="75" border="0" align="center">
  <tr>
    <td>
      <table width="100" border="0">
      <tr>
        <td width="57">ლოგინი:</td>
        <td width="96"><input type="text" name="username" /></td>
      </tr>
      <tr>
        <td>პაროლი:</td>
        <td><input type="password" name="password" /></td>
      </tr>
      <tr>
        <td>&nbsp;</td>
        <td><input type="submit" name="loginSub" value="შესვლა"></td>
      </tr>
</table>
</form>
panel.template.php
PHP
1
2
3
4
5
6
7
8
9
10
11
Hello, World!<br>
 
<?php
if(isset($_POST["exit"])) {
    $login = new login();
    $login->logout();
}
?>
<form action="" method="post">
<input type='submit' name='exit' value='Exit'/>
</form>
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2012, 02:37
Ответы с готовыми решениями:

авторизация
здравствуйте возникла такая проблема я создал сайт с регистрацией. захожу на сайт - делаю ВЫХОД, 3акрываю браузер снова захожу на...

Авторизация
Подскажите пожалуйста с чего начать или что взять почитать. Имеется сайт на html с фреймами (так надо было преподу), теперь надо на этот...

авторизация
Натолкните на мысль. Есть сайт на drupal, c приложением на php. В базе drupal и в базе приложения есть таблица users. Как сделать, чтоб при...

15
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
12.11.2012, 04:03
В 4 утра уже спать хочется, но что сильно бросается в глаза, так это:
1) почему свойства логин и пароль статик? а функция авторизации не статик? Зачем тогда вообще класс создавать? Сделайте статик функцию и всё. Или же класс сделайте синглтон а переменные можно тогда закрытые и не статик делать.
2) зачем вы делаете выборку по логину с базы, а потом сразу проверяете совпадает ли логин, как он может не совпасть? Вы же по ниму делали выборку. В 35 строке нужно убрать сравнение логина.
3) вы не проверяете вернулся ли результат. В 35 строке нужно добавить проверку существования результата, то есть
PHP
1
if ($this->sql_fetch && $this->sql_fetch["password"] == self::$password)
4) функция CookiesValid инклудит шаблоны, это не правильно с точки зрения ООП. данный клас должен заниматься только авторизацией, он не должен решать какой шаблон подключить, это нужно решать уже основываясь на том авторизован ли юзер не изнутри класса.
5) нельзя на основании просто наличия куки считать что пользователь авторизован, никто не мешает не авторизованному юзеру установить любые куки с любыми именами у себя в браузере.
6) зачем нужны куки и hash если у вас нет не где проверки кук и авторизации если они есть, я так понимаю они нужны только для того что бы восстановить сессию.
7) после переадресации с помощью header нужно останавливать работу вашего скрпита, так как браузер не сразу начнёт переадресацию а только после того как получит заголовки, потом будет обрыв соединения, и ваш скрпит ещё многое может успеть сделать после header.

Ну и имена классов желательно писать с большой буквы, так принято
1
 Аватар для nfernee
3 / 3 / 1
Регистрация: 13.03.2012
Сообщений: 29
12.11.2012, 04:42  [ТС]
Ого не ожидал что столько замечаний будет
благодарю, + с меня)
Пойду все исправлять
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
13.11.2012, 21:39
судя по коду, скопипастили код из статьи на хабрахабре
0
 Аватар для nfernee
3 / 3 / 1
Регистрация: 13.03.2012
Сообщений: 29
15.11.2012, 10:13  [ТС]
нет. не знаю "хабрахабре" но код писал я
но до этого много статей пересмотрел))
а функсйю generateCode взял из инета
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
15.11.2012, 22:56
Цитата Сообщение от nfernee Посмотреть сообщение
но до этого много статей пересмотрел))

Не по теме:

статья на хабрахабре, и часть кода из нее :)

1
25 / 25 / 6
Регистрация: 04.07.2013
Сообщений: 260
13.10.2013, 05:43
Цитата Сообщение от nfernee Посмотреть сообщение
Здравствуйте!
Я не профи в ООП, .. професионалов и с безопасности.
сделайте замечания)))
Знакомый код)) с хабры взял?))
0
Заблокирован
18.10.2013, 08:00
Цитата Сообщение от nfernee Посмотреть сообщение
"' LIMIT 1"
Умиляет. Типа подразумевается что юзеров с такими параметрами может быть больше чем 1. Скажем 12 штук sqlnub'ов с одинаковыми паролями.

Говорят на хабре такое пишут? Ничего удивительного.

Один только вопрос. Чем отличается авторизация от заведения записи в таблицу где поле user_name поставлено ограничителем типа uni?
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
18.10.2013, 12:19
Цитата Сообщение от sqlnub Посмотреть сообщение
Типа подразумевается что юзеров с такими параметрами может быть больше чем 1.
Не видя структуры таблиц, Вы не можете утверждать обратного
А вообще, лимит 1 ставят для скорости выполнения запроса, когда у вас 1кк+ записей, с лимит 1 поиск прекратиться, как только будет найдена запись, без лимит, продолжится до конца, перебирая все записи.
1
Заблокирован
20.10.2013, 19:58
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
как только будет найдена запись, без лимит, продолжится до конца, перебирая все записи.
А может она как раз в самом конце? Я уж не говорю об отдельной проверки пароля. Типа вдруг есть такой же юзер, но с другим паролем. И тут надо структру таблицы знать чтобы оценить глубину юмора?

Поэтому такие поля индексируют, а поскольку двух одинаковых юзеров быть не может, то индексируют уникально. Что одновременно ставит и в ряд ограничителей нарушения целостности.

Тем не менее LIMIT 1 признаю.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
20.10.2013, 22:29
Зачем оценивать глубину номера? Из 1кк пользователей, в 999 999 случаях запись будет не в самом конце
Пароль тут вообще не при чём. Разговор о выборке с использованием именно LIMIT 1 при условии что запись и так будет только 1. Вообщем на сколько это будет быстрей, я не знаю, я не спец по MySQL, но я думаю хуже не должно от этого быть, иначе такие фв как Yii, RoR, Django... не делали бы так.
0
Заблокирован
21.10.2013, 06:13
Разговор о лимите 1 закончился когда я признал что лимит полезен. Отдельный запрос на пароль при том.
0
363 / 334 / 38
Регистрация: 29.03.2011
Сообщений: 838
24.10.2013, 20:14
DrobyshevAlex, если есть индекс по полю, поиска не будет не зависимо от наличия/отсутствия LIMIT 1 (№ записи возьмётся из индекса и по ней уже БД проверит остальные условия), если индекса нет - кто-то сам себе злой буратино, но LIMIT 1 будет скрывать эту проблему до поры до времени (пока в БД < 10к записей будет работать шустро). Потом владельцы удивляются, что сайт через год притормаживать начал..
За Yii не скажу, но в Django - не встречал, чтобы Limit добавлялся куда-то неявно (в запрос с Limit 1 превращается срез по 1му полю, например: MyModel.objects.filter(my_field=my_value )[0], но тут не выборка по unique и Limit НУЖЕН - и это явная запись, просто в ORM-нотации; при запросе MyModel.objects.get(my_id) никаких лимитов в SQL вы не увидите, более того, джанго будет ругаться, если найдёт больше одной записи)
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
24.10.2013, 21:42
Ну я на джанго делал всего 1 проект да и то года 2+ назад, особо не помню
Но точно помню что find в Yii и в RoR добавляют limit 1.

Я не спец в бд, так что я даже не могу сказать точно даст ли это без индексов прироста, я знаю лишь что я читал из "умных" статей на хабре, туда же типа не пускают с плохими статьями.
И вот тут немного инфы.
0
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
25.10.2013, 07:32
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
я знаю лишь что я читал из "умных" статей на хабре, туда же типа не пускают с плохими статьями.
Там море таких статей.

Цитата Сообщение от nfernee Посмотреть сообщение
чера начал работать над Авторизацией и хочу чтобы вы оценили его с точки зрения професионалов и с безопасности.
Дурно. Код не ООП, но классы используются.
0
Заблокирован
25.10.2013, 14:02
LIMIT 1 безусловно полезен. Без него богатая счетами бд начнет тормозить. И индексы тут не при чем. Они очень даже будут на месте, но 99 процентов читателей, точнее писателей, демонстрируют вот такой ломовой прием:

PHP
1
where user_id = '$user_id'";
Им сказано - инъекции, и добавлено - кавычки. Раз и навсегда.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2013, 14:02
Помогаю со студенческими работами здесь

Re: авторизация
Друзья подскажите что хочет клиент ?программа клиент пробует соедениться с серваком апатчем но не может ! установлен на серваке связка...

Авторизация
Какой,по вашему мнению, самый лучший метод авторизации?

Авторизация
Приветствую всех! Коль уж решил разбираться в ООП, то хотелось бы услышать про авторизацию. Сейчас пытаюсь написать приложение с MVC и...

Авторизация и куки
всем здрасти. Подскажите пожалуйста, почему если пытаться авторизоваться с http://localhost/domain/index.php - ничего не происходит и не...

Сессия. Авторизация
Доброго времени суток, форумчане. Сразу же перейду к вопросу. Создал авторизацию, по принципу hash ключа, который сохраняется в сессии...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru