Forum Webscript.Ru
Программирование => PHP => Тема начата: 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. Как это сделать.
Большое спасибо.
-
делаешь session_start, потом sesson_register(\'username\') и sesson_register(\'password\') и сверяешь их с правильными каждый раз. По моему так.
А насчет HTTP_POST_VARS.... их можно и подменить.
По моему лучше проверять getenv(\'HTTP_REFERER\')
-
делаешь session_start, потом sesson_register(\'username\') и sesson_register(\'password\') и сверяешь их с правильными каждый раз. По моему так.
В том то и дело, что я не хочу каждый раз сверять их с правильными, а вместо этого просто установить переменную, по которой буду уже определять, аутентифицирован ли уже пользователь или нет.
-
session_start();
session_register("ok"); - при первой проверке.
А потом в каждом последующем скрипте сначала
unset($ok);
а потом уже
session_start();
и проверять на установленность $_SESSION["ok"]
-
Если пришли переменные $username и $password установлены (вот этот момент мне не нравиться, по-моему не правильно), то значит сессия уже была открыта и снова проверяю значения $username и $password
Если $HTTP_SESSION_VARS[\'login\'] существует, то делаешь проверку $HTTP_SESSION_VARS[\'login\'] и $HTTP_SESSION_VARS[\'password\'], иначе выдаешь форму для аутентификации.$OK, и потом каждый раз проверять, установлена ли она.
Нет, лучше каждый раз проверяй логин а пароль.
-
Нет, лучше каждый раз проверяй логин а пароль.
Почему? Разве возможно подделать переменную $HTTP_SESSION_VARS[\'OK\'] ?
-
И ещё одна проблема:
Вот упрощённый код моего скрипта с аутентификацией (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 "";
}
?>
This script
Another script
А вот то, что я не пойму:
При первом запуске скрипта сессия ещё не создаётся (видно из кода), сответственно куки с её номером не установлены, а пхп всё равно добавляет переменную PHPSESSID в url последних двух ссылок. Вот так это выглядит при просмотре кода в браузере:
...
This script
Another script
...
Почему так, ведь сессия ещё не запущена?
-
$password="Cake")
Это присваивание.Почему так, ведь сессия ещё не запущена?
Сессия запущена, только данные тебе пока в ней не видны.
PHP самостоятельно дописывает имя и id сессии к ссылке, иначе как сессия будет передаваться через страницы?
-
$password="Cake")
Это присваивание.
Ошибся, сейчас поправлю.
Сессия запущена, только данные тебе пока в ней не видны.
PHP самостоятельно дописывает имя и id сессии к ссылке, иначе как сессия будет передаваться через страницы?
Так почему же она запущена? Ведь судя по коду она должна запускаться в том случае, если пользователь ввёл правильные имя и пароль.
Или сессия запускается всегда, если в коде скрипта есть вызов
session_start() ?
-
Или сессия запускается всегда, если в коде скрипта есть вызов
session_start() ?
Да.
Но переменные какие-то станут в ней храниться только после их session_register("var")
-
Да.
Но переменные какие-то станут в ней храниться только после их session_register("var")
Т.е., если я правильно понял, если сессия может быть открыта, то её нужно сразу открывать, в самом начале скрипта.
-
А зачем так сделано? Почему нельзя взависимости от логики либо открывать её, либо нет? С этим связаны какие-то проблемы?
-
Дам один совет, в нащале файла просто открой сессию тобишь пропиши
session_start();
и не делай все через задницу, я те скажу проще, у меня сделана авторизация, но с использованием бд, и намного проще каждый раз проверять с дб, чем мучится с регистрацией левой сессии, тем более нужна ли она ???
А еще я тебе посоветую научится работать с куками ! Кому приятно каждый раз авторизироваться ??? проще загнать в куки инфу и если она там есть и правильная, то авторизацию не запрашивать если нет, то авторизацию.
Еще совет, не кидай в куки открытый пассворд, лучше воспользуйся чем-то типа md5() ...
-
Адвокат дело говорит. Вначале.
Про куки - полный бред. Никакие пароли, ни зашифрованные, ни открытые в куки не клади. Только признак авторизованности, если сам юзер захочет и если уровень безопасности позволяет.
А про авторизацию - верно.
во всех скриптах пишется такой код
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
";
}
выводим форму запроса имени и пароля.
-
advocat
так у тебя авторизация с сессиями и еще и в базу лезешь при каждом обращении?
А можно поинтересоваться - зачем?
-
Evgeny
В общем, ты правильно рассудил в своем последнем абзаце.
проверять, из сессии ли пришла переменная, очень просто. Обращаться к переменной $HTTP_SESSION_VARS.
Если хочешь обращаться к переменной по имени - это тоже можно.
unset($authenticated);
session_start()
if ($authenticated) {blah blah blah}
вот и вся проверка.
-
у меня сделана авторизация, но с использованием бд, и намного проще каждый раз проверять с дб, чем мучится с регистрацией левой сессии, тем более нужна ли она ???
, у меня сделана авторизация, но с использованием бд, и намного проще каждый раз проверять с дб, чем мучится с регистрацией левой сессии, тем более нужна ли она ???
Ты мне не кинешь её по мылу?:) simpson@nightmail.ru. Буду очень признателен...
-
SimpsoN
сама по себе бд никакой аутентификации не дает.
надо все равно, чтобы броузер посылал логин с пролем или некий призак авторизации в каждый запрашиваемый скрипт. или хотя бы както сигнализировал серверу - Свои, мол! Это я, тот самый, котороый только что был!
А это можно слделать либо
1. НТТР заголовками
2. куками
3. сессиями
-
надо все равно, чтобы броузер посылал логин и проль в каждый запрашиваемый скрипт
Зачем? По-моему, единственно нормальное решение - это всего одна сессионная переменная - либо логин юзера, либо его ID (у меня последнее).
GotZfild
Сессия запущена, только данные тебе пока в ней не видны
Сессия НЕ запущена, пока не произошел session_start() (косвенно или явно). Как только он произошел - данные стали видны...
-
PilotV
не придирайся :-)
ну хорошо - я исправлю
-
Romik, ты просто вездесущ! :) И откуда ты столько времени на общение берёшь? :)
-
Не вездессущ, а вездеср... ну, ты понял ;-)
-
может имеет смысл распозновать пользователя по $PHP_AUTH_USER и $PHP_AUHT_PW? Собственно это не очень симпотично выглядит, но если защищать какой-нидь админский интерфейс - то по-моему весьма удобно.
-
RomikChef
Ты мне кинь весь скрипт, а тамя разберусь:)
-
просто не туда попал