Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация, и снова она... 
V
    Опции темы
Рыжий
Дата 6.2.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 2
Всего: 20



Всем привет!
Написал систему регистрации/авторизации и задался вопросом: «А безопасна ли система» после долгих поисков «идеального» скрипта – решил, что «идеального» не существует. А каждый участник www видит авторизацию по-своему.

Вот что получилось у меня, что-то мне подсказывает, что тут что-то не так smile
Код


session_start();

//если сессия есть, то пользователь залогинен
if(!empty($_SESSION['login']))  $auth=true;

//если сессии нет, но есть куки - логиним пользователя
elseif(!empty($_COOKIE['login']) && !empty($_COOKIE['pass'])){
       $login=mysql_real_escape_string($_COOKIE['login']);
       $pass=mysql_real_escape_string($_COOKIE['pass']);

       mysql_connect('localhost')
       mysql_select_db('auth');
       $query='select * from '.$CONFIG["db_prefix"].'_user where login = "'.$login.'"
        and pass="'.$pass.'" limit 1';
        $result=mysql_query($query) or die(mysql_error());
         if(mysql_num_rows($result)>0){
                 $auth=true;
                 $row=mysql_fetch_array($result);

                 //устанавливаем переменные
                 $_SESSION['login']=$row['id'];
                 setcookie('login',$row['login'],time()+3600);
                 setcookie('pass',$row['pass'],time()+3600);
         } else $auth=false;

}
//а может быть человек логиниться в этот момент:
elseif(!empty($_POST['login']) && !empty($_POST['pass'])){
       $login=mysql_real_escape_string($_POST['login']);
       $pass=mysql_real_escape_string(md5($_POST['pass']));

       mysql_connect('localhost')
       mysql_select_db('auth');
       $query='select * from '.$CONFIG["db_prefix"].'_user where login = "'.$login.'"
        and pass="'.$pass.'" limit 1';
        $result=mysql_query($query) or die(mysql_error());
         if(mysql_num_rows($result)>0){
                 $auth=true;
                 $row=mysql_fetch_array($result);

                 //устанавливаем переменные
                 $_SESSION['login']=$row['id'];
                 setcookie('login',$row['login'],time()+3600);
                 setcookie('pass',$row['pass'],time()+3600);
              }
}else $auth=false; 



На остальных страницах сайта скрипт такой же, за исключением части с проверкой $_POST.
Как я понимаю – на каждой странице нужно заново переустанавливать cookies, т.к. их время истечет и они станут неактивными? 

Сув.

PS статью в факе читал, туда не посылайте! smile

Добавлено @ 00:33 
Забыл еще рассказать свои критерии:
авторизация должна быть прочной. Но не слишком запудренной. Наверное максимально приближенной к Винградовской. (например открытие сайта в 2 окнах должно поддерживаться) То есть совсем уж пользователя не зажимать!

Однако мне не хочется использовать таблицу БД, т.к. ее нужно будет чистить (cron) да и обращаться лишний раз к БД я не намерен.

Это сообщение отредактировал(а) Рыжий - 6.2.2007, 00:34
PM MAIL ICQ   Вверх
Рыжий
Дата 6.2.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 2
Всего: 20



После еще нескольких минут медитации над кодом, увидел, что $_COOKIE['pass'] не зашифрован, а должен smile
Так что в куку помещаем md5($pass)

Но если куку украдут, разве хацкеры с помощью brootforce не подберут пароль, пусть даже он в md5 ? 
PM MAIL ICQ   Вверх
Всемогущий
Дата 6.2.2007, 08:29 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 25.6.2006
Где: Челябинск

Репутация: 5
Всего: 13



Пожалуйста скажите какой вообще толк хранить логин и пароль в куках ?

сессии для того и сделаны что бы хранить в них что не попадя 

и ещё как писал Mal Hack, хранить в сессии уникальный ключ этой сессии 

допустим

Код

$_SESSION['key']=sha1(SID.(date('l+d+').$_SERVER['HTTP_USER_AGENT']);

и так как сессии нельзя подделать хранить там цифру говорящую к какой группе пренадлежит человек 
0-->чайник=гость
10-->админ=бог



Далее чувствую будет адская критика моего поста smile  



--------------------
Цитата(smartov @  16.1.2007,  13:26 Найти цитируемый пост)
Видел я PHP код, который пишут наСильники, никогда на php не писавшие  :D  То еще зрелище. Все пытаются сделать руками и через ж (как в С привыкли). Все пытаются память освобождать итд итп. 
PM MAIL ICQ   Вверх
-=Ustas=-
Дата 6.2.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(Рыжий @  6.2.2007,  00:21 Найти цитируемый пост)
каждый участник www видит авторизацию по-своему.

Нет, все ее видят одинаково также как и сам разработчик, почти. Просто есть определеные правила защиты, которые ты можешь узнать только тогда, когда будешь знать методы воздействия на систему в качестве злоумышленника.
Цитата(Рыжий @  6.2.2007,  00:52 Найти цитируемый пост)
увидел, что $_COOKIE['pass'] не зашифрован, а должен

Его там вообще не должно быть.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
PARROT
Дата 6.2.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2339
Регистрация: 5.1.2005
Где: Спб-ЦарьГрад

Репутация: 23
Всего: 50



Цитата(Рыжий @  6.2.2007,  00:52 Найти цитируемый пост)
Но если куку украдут, разве хацкеры с помощью brootforce не подберут пароль, пусть даже он в md5 ?  

http://forum.vingrad.ru/topic-20119.html


--------------------
Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим!
PM MAIL   Вверх
Рыжий
Дата 6.2.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 2
Всего: 20



Если я не ошибаюсь Винград хранит хеш пароля и логин в куках.

Что же тогда хранить в куках? Ведь узнавать пользователя - как ни крути, а нужно!

Сув.

Это сообщение отредактировал(а) Рыжий - 6.2.2007, 11:34
PM MAIL ICQ   Вверх
mishaSL
Дата 6.2.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Цитата(Рыжий @  6.2.2007,  00:21 Найти цитируемый пост)
после долгих поисков «идеального» скрипта – решил, что «идеального» не существует


Идеального скрипта не существует, но есть хорошие и достаточно безопасные. Возьми лубой скрипт авторизации из учебника PHP или скрипты авторизации на форумах посмотри. И посмотри основные принципы. Поверь негде не хранят связку логин и пароль в cookie.

Добавлено @ 11:37 
Цитата(Рыжий @  6.2.2007,  11:34 Найти цитируемый пост)
логин в куках.

Это не пароль, это хэш в котором много чего может храниться смотря к чему привязывается программист (к примеру IP, браузер, кодировки и т.д.)


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Рыжий
Дата 6.2.2007, 17:48 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 2
Всего: 20



Помещать в cookie ip адрес - значит пользователи с динамичным ip не смогут использовать куку.
Помещать в cookie имя браузера - мне это просто не нужно, пусть люди заходят и с IE и с FF, хоть одновременно!


Это сообщение отредактировал(а) Рыжий - 6.2.2007, 18:54
PM MAIL ICQ   Вверх
mishaSL
Дата 6.2.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Цитата(Рыжий @  6.2.2007,  17:48 Найти цитируемый пост)
Помещать в cookie имя браузера - мне это просто не нужно, пусть люди заходят и с IE и с FF, хоть одновременно!


В любом случае они одновременно не зайдут после одного логина, логиниться необходимо отдельно в каждом браузере, т.к. они (браузеры) куки хранят каждый отдельно.

Смысл был не в этом, смысл в том что не надо хранить пароль в куках. Лучше хранить ID пользователя и уникальный ключ(но не пароль) пользователя и по этим данным проверять пользователя.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Рыжий
Дата 6.2.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 2
Всего: 20



Но ведь любую открытую информацию можно подделать. Например если в куках держать логин+email+icq+еще много чего, а другие юзеры видят эту инфу - подделать куку очень просто.
Что же тогда хранить в куках, чтобы узнавать пользователя?
PM MAIL ICQ   Вверх
N1k0laj_BY
Дата 6.2.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.2.2007

Репутация: нет
Всего: нет



Храни в куках уникальный индификатор пользователя не id, а случайно сгенерированую строку
PM MAIL   Вверх
Рыжий
Дата 6.2.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 2
Всего: 20



Цитата(N1k0laj_BY @  6.2.2007,  22:34 Найти цитируемый пост)
случайно сгенерированую строку 

А как я потом сгенерирую эту строку? И как я узнаю что под строчкой "sdfjkl;dsjfiofi" у меня юзер igor ? В БД мне ничего хранить не хочется smile
PM MAIL ICQ   Вверх
N1k0laj_BY
Дата 6.2.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.2.2007

Репутация: нет
Всего: нет



Цитата(Рыжий @ 6.2.2007,  23:00)
Цитата(N1k0laj_BY @  6.2.2007,  22:34 Найти цитируемый пост)
случайно сгенерированую строку 

А как я потом сгенерирую эту строку? И как я узнаю что под строчкой "sdfjkl;dsjfiofi" у меня юзер igor ? В БД мне ничего хранить не хочется smile

Один раз за сессию обратиться к БД с данным запросом я думаю можно и производительность от этого неупадет. Тем более при авторизации вы к БД обращаетесь за получением данных пользователя. Что мешает сделать следующее
$query='select * from '.$CONFIG["db_prefix"].'_user where login = "'.$login.'"
        and u_id="'.$u_id.'" limit 1';
u_id генери в зависимости от логина юзера его mail и т.д чтоб одинаковых небыло

Это сообщение отредактировал(а) N1k0laj_BY - 6.2.2007, 23:12
PM MAIL   Вверх
Рыжий
Дата 7.2.2007, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 2
Всего: 20



Решил сделать так:
Будет массив Кук:

$_COKIE['my_info'][0] = ID пользователя
$_COOKIE['my_info'][1] = md5($login.' '.$pass);

Выскажите пожалуйста свое мнение.

Алгоритм будет таким: найти юзера с ID == данному, и сравнить хеши, если все ОК - значит ставим сессию, в которую помещаем ID пользователя.

Сув.
PM MAIL ICQ   Вверх
-=Ustas=-
Дата 7.2.2007, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(Рыжий @  6.2.2007,  22:30 Найти цитируемый пост)
Но ведь любую открытую информацию можно подделать. Например если в куках держать логин+email+icq+еще много чего, а другие юзеры видят эту инфу - подделать куку очень просто.


Рыжийsmile это уже проблемы пользователя, и ты ничего с этим не поделаешь. Это равносильно, что оставлять ключи от сейфа на вешалке в коридоре. Если пользователь пускает на свою тачку всех подряд, то повторюсь - это его проблемы, а не твои.

Цитата(Рыжий @  7.2.2007,  00:01 Найти цитируемый пост)
Алгоритм будет таким: найти юзера с ID == данному, и сравнить хеши, если все ОК - значит ставим сессию, в которую помещаем ID пользователя.

Да, так и делай.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0851 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.