Forum Webscript.Ru

Программирование => PHP => Тема начата: Evgeny от 09 Июля 2002, 13:29:24

Название: Аутентификация
Отправлено: Evgeny от 09 Июля 2002, 13:29:24
Привет всем.
Помогите пожалуйста разобраться с аутентификацией на пхп.
Вот как я это понимаю, поправьте пожалуйста, если не прав.

Если пришли переменные $HTTP_POST_VARS[\'username\'] && $HTTP_POST_VARS[\'password\'], значит пользователь ввёл их из формы и их нужно проверить.
Проверяю.
Если ОК, открываю сессию и регистрирую переменные $username и $password.
Если не ОК - снова выдаю форму для логина.

Если пришли переменные $username и $password установлены (вот этот момент мне не нравиться, по-моему не правильно), то значит сессия уже была открыта и снова проверяю значения $username и $password. Если ОК - пользователь внутри и может дальше работать, если не ОК - error message.

Теперь вопрос. Можно ли, вместо того, чтобы проверять каждый раз, верны ли $username и $password (для этого их их файла считывать нужно), услановить какую-нибудь переменную $OK, и потом каждый раз проверять, установлена ли она.
Но ведь пользователь может сам послать эту переменную скрипту, тогда нужно различать, какая это переменная,  пришла ли она из броузера или это переменная, связанная с sessionID. Как это сделать.
Большое спасибо.
Название: Аутентификация
Отправлено: Alexandr от 09 Июля 2002, 13:55:16
делаешь session_start, потом sesson_register(\'username\') и sesson_register(\'password\') и сверяешь их с правильными каждый раз. По моему так.
А насчет HTTP_POST_VARS.... их можно и подменить.
По моему лучше проверять getenv(\'HTTP_REFERER\')
Название: Аутентификация
Отправлено: Evgeny от 09 Июля 2002, 14:27:17
Цитировать
делаешь session_start, потом sesson_register(\'username\') и sesson_register(\'password\') и сверяешь их с правильными каждый раз. По моему так.

В том то и дело, что я не хочу каждый раз сверять их с правильными, а вместо этого просто установить переменную, по которой буду уже определять, аутентифицирован ли уже пользователь или нет.
Название: Аутентификация
Отправлено: Fury от 09 Июля 2002, 16:18:52
session_start();
session_register("ok");   -  при первой проверке.
А потом в каждом последующем скрипте сначала
unset($ok);
а потом уже
session_start();
и проверять на установленность $_SESSION["ok"]
Название: Аутентификация
Отправлено: GotZfild от 09 Июля 2002, 16:43:52
Цитировать
Если пришли переменные $username и $password установлены (вот этот момент мне не нравиться, по-моему не правильно), то значит сессия уже была открыта и снова проверяю значения $username и $password

Если $HTTP_SESSION_VARS[\'login\'] существует, то делаешь проверку $HTTP_SESSION_VARS[\'login\'] и $HTTP_SESSION_VARS[\'password\'], иначе выдаешь форму для аутентификации.
Цитировать
$OK, и потом каждый раз проверять, установлена ли она.

Нет, лучше каждый раз проверяй логин а пароль.
Название: Аутентификация
Отправлено: Evgeny от 09 Июля 2002, 17:13:26
Цитировать
Нет, лучше каждый раз проверяй логин а пароль.

Почему? Разве возможно подделать переменную $HTTP_SESSION_VARS[\'OK\'] ?
Название: Аутентификация
Отправлено: Evgeny от 09 Июля 2002, 17:52:47
И ещё одна проблема:
Вот упрощённый код моего скрипта с аутентификацией (index.php):



db edit






function authenticate($username,$password)
{  $ok=false;
   if ($username=="Piece" && $password=="Cake")
   {   $ok=true;
   }
   return $ok;
}

if ($HTTP_POST_VARS[\'username\'] && $HTTP_POST_VARS[\'password\'])
{  $username=$HTTP_POST_VARS[\'username\'];
   $password=$HTTP_POST_VARS[\'password\'];
   if (authenticate($username,$password))
   {  session_start();
      $authenticated=true;
      session_register("username");
      print "Welcome $username!";
   }
   else print "
Error authenticate
";
}
else if ($HTTP_SESSION_VARS[\'username\'])
{  print "
Hello, $username!";
   $authenticated=true;
}

if (!$authenticated)
{  print "
";
// ...
// Форма для ввода имени и пароля.
// ...
   print "
";
}                                                        
?>




This script


Another script





А вот то, что я не пойму:
При первом запуске скрипта сессия ещё не создаётся (видно из кода), сответственно куки с её номером  не установлены, а пхп всё равно добавляет переменную PHPSESSID в url последних двух ссылок. Вот так это выглядит при просмотре кода в браузере:

...


This script


Another script
...


Почему так, ведь сессия ещё не запущена?
Название: Аутентификация
Отправлено: GotZfild от 09 Июля 2002, 18:26:14
Цитировать
$password="Cake")

Это присваивание.
Цитировать
Почему так, ведь сессия ещё не запущена?

Сессия запущена, только данные тебе пока в ней не видны.
PHP самостоятельно дописывает имя и id сессии к ссылке, иначе как сессия будет передаваться через страницы?
Название: Аутентификация
Отправлено: Evgeny от 10 Июля 2002, 12:03:00
Цитировать

Цитировать

$password="Cake")

Это присваивание.

Ошибся, сейчас поправлю.

Цитировать
Сессия запущена, только данные тебе пока в ней не видны.
PHP самостоятельно дописывает имя и id сессии к ссылке, иначе как сессия будет передаваться через страницы?

Так почему же она запущена? Ведь судя по коду она должна запускаться в том случае, если пользователь ввёл правильные имя и пароль.
Или сессия запускается всегда, если в коде скрипта есть вызов
session_start() ?
Название: Аутентификация
Отправлено: Fury от 10 Июля 2002, 14:22:48
Цитировать
Или сессия запускается всегда, если в коде скрипта есть вызов
session_start() ?


Да.
Но переменные какие-то станут в ней храниться только после их session_register("var")
Название: Аутентификация
Отправлено: Evgeny от 11 Июля 2002, 19:34:06
Цитировать
Да.
Но переменные какие-то станут в ней храниться только после их session_register("var")

Т.е., если я правильно понял, если сессия может быть открыта, то её нужно сразу открывать, в самом начале скрипта.
Название: Аутентификация
Отправлено: Evgeny от 11 Июля 2002, 19:34:45
А зачем так сделано? Почему нельзя взависимости от логики либо открывать её, либо нет? С этим связаны какие-то проблемы?
Название: Аутентификация
Отправлено: advocat от 15 Июля 2002, 15:59:27
Дам один совет, в нащале файла просто открой сессию тобишь пропиши
  session_start();
и не делай все через задницу, я те скажу проще, у меня сделана авторизация, но с использованием бд, и намного проще каждый раз проверять с дб, чем мучится с регистрацией левой сессии, тем более нужна ли она ???

А еще я тебе посоветую научится работать с куками ! Кому приятно каждый раз авторизироваться ??? проще загнать в куки инфу и если она там есть и правильная, то авторизацию не запрашивать если нет, то авторизацию.
Еще совет, не кидай в куки открытый пассворд, лучше воспользуйся чем-то типа md5() ...
Название: Аутентификация
Отправлено: Меняздесьдавнонет от 15 Июля 2002, 17:31:29
Адвокат дело говорит. Вначале.
Про куки - полный бред. Никакие пароли, ни зашифрованные, ни открытые в куки не клади. Только признак авторизованности, если сам юзер захочет и если уровень безопасности позволяет.

А про авторизацию - верно.
во всех скриптах пишется такой код

session_start();
if (!$HTTP_SESSION_VARS[\'username\']) {
header("Location: register.php");
exit;
}


а там, где проверяешь пароль, просто регистрируешь в сессии переменную. тоже не тонны кода

if ($HTTP_POST_VARS[\'submit\']) {
  $username=$HTTP_POST_VARS[\'username\'];
  $password=$HTTP_POST_VARS[\'password\'];
  // проверяем имя и пароль, причем безо всякой функции.
   if (пароль прошел)
   {  session_register("username");
      print "Welcome $username!";
   }
   else print "
Error authenticate
";
}
выводим форму запроса имени и пароля.
Название: Аутентификация
Отправлено: Меняздесьдавнонет от 15 Июля 2002, 17:34:08
advocat
так у тебя авторизация с сессиями и еще и в базу лезешь при каждом обращении?
А можно поинтересоваться - зачем?
Название: Аутентификация
Отправлено: Меняздесьдавнонет от 15 Июля 2002, 17:37:15
Evgeny
В общем, ты правильно рассудил в своем последнем абзаце.
проверять, из сессии ли пришла переменная, очень просто. Обращаться к переменной $HTTP_SESSION_VARS.
Если хочешь обращаться к переменной по имени - это тоже можно.
unset($authenticated);
session_start()
if ($authenticated) {blah blah blah}
вот и вся проверка.
Название: Аутентификация
Отправлено: SimpsoN от 03 Октября 2002, 18:36:15
Цитировать
у меня сделана авторизация, но с использованием бд, и намного проще каждый раз проверять с дб, чем мучится с регистрацией левой сессии, тем более нужна ли она ???

Цитировать
, у меня сделана авторизация, но с использованием бд, и намного проще каждый раз проверять с дб, чем мучится с регистрацией левой сессии, тем более нужна ли она ???

Ты мне не кинешь её по мылу?:) simpson@nightmail.ru. Буду очень признателен...
Название: Аутентификация
Отправлено: Меняздесьдавнонет от 03 Октября 2002, 18:45:57
SimpsoN
сама по себе бд никакой аутентификации не дает.
надо все равно, чтобы броузер посылал логин с пролем или некий призак авторизации в каждый запрашиваемый скрипт. или хотя бы както сигнализировал серверу - Свои, мол! Это я, тот самый, котороый только что был!
А это можно слделать либо
1. НТТР заголовками
2. куками
3. сессиями
Название: Аутентификация
Отправлено: PilotV от 03 Октября 2002, 21:45:49
Цитировать
надо все равно, чтобы броузер посылал логин и проль в каждый запрашиваемый скрипт


Зачем? По-моему, единственно нормальное решение - это всего одна сессионная переменная - либо логин юзера, либо его ID (у меня последнее).

GotZfild
Цитировать
Сессия запущена, только данные тебе пока в ней не видны

Сессия НЕ запущена, пока не произошел session_start() (косвенно или явно). Как только он произошел - данные стали видны...
Название: Аутентификация
Отправлено: Меняздесьдавнонет от 03 Октября 2002, 21:54:02
PilotV
не придирайся :-)
ну хорошо - я исправлю
Название: Аутентификация
Отправлено: detail от 03 Октября 2002, 23:30:36
Romik, ты просто вездесущ! :) И откуда ты столько времени на общение берёшь? :)
Название: Аутентификация
Отправлено: Меняздесьдавнонет от 04 Октября 2002, 00:57:56
Не вездессущ, а вездеср... ну, ты понял ;-)
Название: Аутентификация
Отправлено: Croaker от 04 Октября 2002, 17:44:05
может имеет смысл распозновать пользователя по $PHP_AUTH_USER и $PHP_AUHT_PW? Собственно это не очень симпотично выглядит, но если защищать какой-нидь админский интерфейс - то по-моему весьма удобно.
Название: Аутентификация
Отправлено: Ленивый гость от 04 Октября 2002, 17:52:16
RomikChef
Ты мне кинь весь скрипт, а тамя разберусь:)
Название: Аутентификация
Отправлено: Neter от 04 Октября 2002, 19:58:05
просто не туда попал