Реализация аутентификации пользователя

krafty

new Exception
Реализация аутентификации пользователя

Я только начал изучать PHP. Раньше программил на Delphi. Сейчас работаю над созданием системы новостей с закрытой панелью администрирования. Хочу предложить на ваш суд проект аутентификации на PHP.
Вобщем есть файлы:
index.php - страница ввода пароля и логина
auth.php - введенные пароль и логин сравниваются с существующими в БД MySQL.
admin.php - главная страница администрирования со ссылочками на другие скрипты.
В БД есть таблицы: собственно новости, юзеры и юзеры в онлайне.
Защита такая: скрипт auth.php сравнивает логин и пароль; далее смотрит, есть ли такой юзер уже в онлайне (если нет заносим его в таблицу).
Создаем сессионную переменную
PHP:
session_register("logged_user");
В скрипте admin.php делаем так:
PHP:
unset($logged_user); /*чтобы не передали через урл типа ?logged_user=hacker*/
session_start();
session_register($logged_user);
if (!isset($logged_user))
{
  echo "Доступ запрещен";
  die;
}
else
{
//этот кусок пока не работает, но суть такая
 $res=mysql_query("SELECT * FROM users_online WHERE login LIKE '".$logged_user."'");
  for ($i=0; $i<mysql_num_rows($res); $i++);
    $f=mysql_fetch_assoc($res);
  $date_db=$f[online_since];
  $curr_date=date("Y-m-d H:i:s");
  $id=$f[id];
/* потом проверяем, если разница с текущим временем более 3-х часов - пшел вон
 */
//ссылки формируются так:
a href="edit.php?<? echo "id=$id" ?>">Правка</a><br>
      <a href="add.php?<? echo "id=$id" ?>">Добавление</a><br>
	  <a href="tools.php?<? echo "id=$id" ?>">Настройки</a> 
}
В каждом из дополнительных скриптов (edit.php, ...) проверки такие же, как и в admin.php.
В файле auth.php думаю еще нашкрябать запросик удаления всех записей из users_online, где время по сравнению с текущим меньше более чем на 3 часа.
Скажите ваше мнение об идее вообще и о безопасности в часности. И может какие-то советы.
 

sakon

П..и.н..ок
Re: Реализация аутентификации пользователя

Автор оригинала: krafty
...и о безопасности в часности. И может какие-то советы.
register_globals лучше установить в off и вместо session_register использовать $_SESSION

PHP:
unset($logged_user); /*чтобы не передали через урл типа ?logged_user=hacker*/ 
session_start(); 
session_register($logged_user);
Чушь. Сначала убиваешь переменную, а потом ее регистрируешь. Да и не совсем понятно, откуда ты ее получаешь. Если через $_GET, то и используй $_GET['logged_user']


PHP:
if (!isset($logged_user)) 
{ 
  echo "Доступ запрещен"; 
  die; 
}
Может лучше отправить на index.php?

href="edit.php?<? echo "id=$id" ?>" можно записать так
href="edit.php?id=<?=$id;?>"
 

SiMM

Новичок
> зачем тут использовать DIE() ??
А зачем для неавторизованного клиента отрабатывать остальную логику? Или даже выдавать "посторонний" контент?
 

Фанат

oncle terrible
Команда форума
krafty
а зачем тебе таблица users_online?
а, самое главное - зачем передавать Id юзера по ссылке?!
 

krafty

new Exception
Re: Re: Реализация аутентификации пользователя

Автор оригинала: sakon
PHP:
unset($logged_user); /*чтобы не передали через урл типа ?logged_user=hacker*/ 
session_start(); 
session_register($logged_user);
Чушь. Сначала убиваешь переменную, а потом ее регистрируешь. Да и не совсем понятно, откуда ты ее получаешь. Если через $_GET, то и используй $_GET['logged_user']
Я сначала уничтожаю переменную, которую кто-то может передать через урл. А потом уже работаю с сессионной переменной
 

Фанат

oncle terrible
Команда форума
если сначала стартовать сессию, а потом проверять элемент массива $_SESSION , то такой ансет не нужен
 

krafty

new Exception
Автор оригинала: Фанат
krafty
а зачем тебе таблица users_online?
а, самое главное - зачем передавать Id юзера по ссылке?!
Таблица нужна для защиты закрытой части сиситемы. Т. е. в каждом закрытом для общего доступа скрипте реализуется проверка наличия юзера в таблице - т.е. вошел он в систему через index.php или же кто-то просто-так пытается запустить скрипт из адресной строки. В связи с этим собственно и нужна передача id (или самого lоgin'a) по ссылке. Надо же что-то сравнивать с записями в таблице.

-~{}~ 10.08.05 13:42:

Короче это альтернатива сессиям. Еще с помощью таблицы можно ограничивать доступ по времени. Например не более 3 часов.
 

Фанат

oncle terrible
Команда форума
в каждом закрытом для общего доступа скрипте реализуется проверка наличия юзера в таблице
нафига тебе таблица, если у тебя есть этот же юзер в сессии?

-~{}~ 10.08.05 14:44:

что значит - альтернатива? альтернатива - это когда не берут одно, а берут другое.
а ты, насколько я вижу, сессиями пользуешься.

альтернативу ищут, если не устраивает стандартное решение.
чем тебя таки сессии не устроили?
 

krafty

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

Фанат

oncle terrible
Команда форума
Насчет сессий согласен. При таком подходе можно их не использовать.
Ух ты. Как интересно.
Не расскажешь, кратенько, в пару строк, как у тебя будет работать система без сессий?
как я понял, ты пишешь в базу логин при авторизации, а потом, при просмотре закрытой страницы, лезешь в этй таблицу, достаёшь из неё логин, пробиваешь по базе и по результатам пускаешь или не пускаешь
я правильно понял?
 

krafty

new Exception
Понял правильно. ... что-то я почувствовал небольшую долю иронии. Может не стоит пока прикалываться над человеком, который только недавно занялся web программированием. И не от того, что нечего больше делать. Вот подучусь немного, опыта наберусь, а потом можно будет и поучаствовать в научной конференции, посвященной особенностям использования лямбда функций в PHP.
А если серьезно, то не затруднит ли тебя сказать, реально сделать авторизацию без сессий и без плюшек.
 

Фанат

oncle terrible
Команда форума
Значит, если я правильно тебя понял, то ты, допустим, обращаешься к своей панели, ты вводишь пароль, пароль пишется в базу юзерс_онлайн.
ты ходишь по страницам, при зхзаходе скрипт лезет в базу юзерс_онлайн, достаёт твоё логин и пускает...

тут на сайт захожу Я.
Не ввожу никаких паролей, просто обращаюсь к странице,
скрипт лезет в базу юзерс_онлайн, достаёт твоё логин и... пускает.

Я всё правильно описал? Ничего не упустил?
 

krafty

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

Фанат

oncle terrible
Команда форума

krafty

new Exception
первая статья мне очень пригодится. поскольку я всю жизнь программировал на Delphi. В этом есть свои плюсы и минусы (надеюсь плюсов больше).
Фанат, тебе респект. Чувствуется профессионализм. Не прими за лесть :).
Сегодня и завтра буду трудиться в поте лица. Если че не будет получаться прийдется идти на форум. Думаю до субботы предоставлю плоды своего труда на суд глубокоуважаемой аудитории.
 

Фанат

oncle terrible
Команда форума
не стесняйся, приходи.
С тобой приятно общаться, ты не хнычешь, и понимаешь, что тебе говорят.
К сожалению, на пхпшных форумах - это редкость.

Опять же - вот ты пришёл как? "Вот я написал, что у меня неправильно?". то есть, во-первых, объяснять проще - если человек сам писал, а не бездумно дёргал чужой код, то он ПОНИМАЕТ, что делает его код.
С таким человеком приятно общаться. С таким человеком хочется делиться. а 50% вопросов здесь - "дайте, найдите, напишите". а даже если готовый код ему сунешь - он не понимает, куда его пристроить!
 

krafty

new Exception
не только на пхпшных! я привык так получать новые знания и навыки. надеюсь на дальнейшее сотрудничество. есттественно от меня тебе пока пользы никакой. но ведь и помогать тоже приятно. посмотришь на ошибки, которые делают начинающие. я быстро учусь. хочется думать, что пхп не исключение. язык вобщем-то не сложный. больше нужно разбираться в функционировании сервисов инета, вебсерверов, протоколов,..... очень трудно отлаживать php-программу - так не хватает watch листов, брекпоинов и пошаговой отладки. к сожалению, не могу покуда наткнуться на классный эдитор. поэтому довольствуюсь тем, что есть - Dreamweaver MX 2004. в нем конечно поддержка php заканчивается на цветовой подсветке (или может я недосмотрел чего). вобщем к работе с интерпретатором нужно еще привыкнуть. нет типов данных и разделения программ на блоки. посему многие ошибки сложновато отлавливать. но все дело привычки. будем привыкать.
 
Сверху