Как авторизовывать пользователя через куки (cookies)
Идентификация пользователя через встроенный в php 4 механизм сессий.
Пароль на страницу. Часть 4. Печенюшки
Способ этот применим там, где, во-первых, пользователей много, и их контингент постоянно меняется. Во-вторых, где нужно сделать удобный вход - чтобы можно было зайти в систему, введя логин и пароль в форме на странице.
Рисуем форму и делаем файл, который получает логин и пароль (защиту от подборки я уде описывал, допишите её сюда сами).
// обработка строки с логином
$login = str_repalce("'", "", $login);
$login_result = mysql_query("SELECT id FROM user WHERE
login='$login' AND pass='". md5($pass). "'");
if (!mysql_error() && @mysql_num_rows($login_result)==1) {
/* выдача кук. Имена кук и путь лучше во избежание путаницы определять
$login_result = mysql_query("SELECT id FROM user WHERE
login='$login' AND pass='". md5($HTTP_COOKIE_VARS[$COOKIE_PASSW_NAME]). "'");
if (!mysql_error() && @mysql_num_rows($login_result)!=1) {
/* Если такой строки в таблице нет, пользователь перенаправляется на страицу входа. */
header("Location: /login.php");
exit;
}
else
print (mysql_error());
Имена кук будут использоваться в нескольких местах, поэтому лучше заранее поместить их в одном месте (например, объявив константы), чтобы потом не исправлять по нескольку раз.
Как видите, пароль будет бегать по каналу и лежать в файле с куками в открытом незакодированном виде. Это очень небезопасно. В отсутствие хозяина можно подойти к компьютеру, заглянуть в файл, где броузер держит куки, и записать пароль на бумажку (а если в локальной сети всё общее, то и подходить не надо, и стащить пароль можно прямо при хозяине).
Чтобы этого не произошло, пароль нужно кодировать. Как приемлемый вариант, хэш md5. Тут уже нельзя увидеть пароль и зайти в систему, записав его на бумажку или copy-paste-нув. Кстати, именно так можно залазить под паролем и без ведома друга в web-интерфейсы, строящие авторизацию на сессиях. Поэтому последнее, что можно сделать в этом направлении - это менять куку при каждой загрузке страницы.
Сам когда-то делал такую схему: в таблице пользователей есть колонка с датой последнего обращения. Эту дату последнего обращения и пароль, закодированные через md5, пользователь получает при каждом обращении. Система берёт куку с логином, вытаскивает из базы эту строку, генерирует хэш от полей last_log и passwd и сравнивает его с полученным. Если они совпадают, значит посетителя можно впускать. Для пущей безопасности можно добавить проверку на истечение куки - кука должна истечь после получаса неактивности, и, соответсвенно, в базе дата последнего лога должна быть менее чем полчаса назад.
Разумеется, " Ы - чтоб никто не догадался " лучше тоже выделить в отдельную переменную, а лучше использовать вместо этой строки ip-адрес посетителя (или, для обрывающегося диалапа, первые два/три числа ip-адреса).
Кстати, насчёт IP-адреса. Его лучше проверять, но не весь адрес, а только первые два (для ip, начинающихся на число меньше 127) или три (соответственно, больше 127) числа адреса. Это спасёт пользователей плохого и обрывающегося диалапа от необходимости заново авторизовыватсья после обрыва связи, и в то же время, не даст зайти взломщику, укравшему куку. Конечно же, он не сможет перезвонить и зайти через другого провайдера - адрес пула не тот, но это не наши проблемы ("в такую погоду свои дома сидят"). Как не наша проблема и воровство паролей внутри фирмы. Мы защитили от любопытных товарищей и неграмотных взломщиков, а против троянов и снифферов, которые можно поставить жертве, ничего сделать не можем.
На этом "навороты" закончились. Надёжнее защиту уже не сделать. Никто не будет лазить в файл кук за хэшем и подбирать его. Проще будет поместить между пользователем и веб-интерфейсом сниффер и при помощи него найти пароль. Можно поместить трояна, который будет запоминать всё, что пользователь ввёл на клавиатуре, но это уже не наши проблемы. Чтобы защититься от прослушивания канала, надо использовать соединения типа SSL или шифрование данных.
Пароль на страницу. Часть 5. Сессии
Зачем я писал заметку про куки? "Не понимаю, зачем писать про куки, когда в php есть сессии?!" Затем, чтобы у читателей не образовывалась перед глазами плоская картина. Не везде ещё стоит php 4-й версии, а в третьей они не поддерживаются. Более того, не везде сессии так необходимы — за редким исключением алгоритм авторизации проверяет правильность логина/пароля и правильность данных сессии, а затем либо отфутболивает клиента на страницу входа, либо берёт массив (или объект) с данными о пользователе.
Случаев, когда работа сессиями необходима, не так уж и часты. Например, в своей игре "Монополист" я сразу стал использовать сессии, потому что пользователь может играть в нескольких играх и одна и та же страница в одном и том же сеансе работы может содержать разные данные. Там лучше данные для одной из игр, в которых пользователь участвует, хранить в сессии и сделать страницу для перехода между играми.
В общем, я не утверждаю, что сессиями пользоваться не нужно. Нужно, только всему своё место. К вопросу применимости трёх способов авторизации — через 401-й заголовок ("realm"), куки или сессии — я вернусь позже. Сейчас поговорю о сессиях.
Сессии в php — это на самом деле не метод авторизации (само понятие неправильное, но в форумах спрашивают именно "как авторизовывать пользователя через сессии?"). Встроенный в php механизм пользовательских сессий лишь идентифицирует этих пользователей, авторизовывать — опять же, работа вашего скрипта.
Много про механизм сессий рассказывать не буду — уже рассказано. В самом простом виде (вернее в самом dafault-ном) механизм этот работает так: система держит на сервере файл сессии, в котором содержатся её переменные. Пользователь при запуске сессии получает уникальный идентификатор (обычно через куку), и при обращении к другим страницам отправляет её. При запуске механизма сессий в вашем скрипте обработчик php проверяет, существует ли файл соответствующий пришедшему идентификатору сессии — если существует, то скрипт сможет прочесть данные из файла, если нет — будет запущена новая сессия и создан файл. Разумеется, имя данной переменной опеределено в установках php.
Теперь о том, какими функциями мы пользуемся.
session_start(). Запускает сам механизм сессий. От пользователя должна быть переменная и соответствующий ей файл. Если нет файла, он создаётся, и сессия запускается с нуля. Если нет ни файла, ни переменной, то генерируется переменная (например, посылается заголовок с кукой) и создаётся файл.
session_register(имя1, имя2, имя3...). Указание, какие переменные запомнить в файле по окончании работы скрипта. После того как пользователь перейдёт к другой странице, можно запустить механизм сессий, и после вызова данной функции переменные будут доступны.
session_destroy(). Удаляет файл данных сессии (при использовании кук надо удалять их вручную, выставив пустую куку: "setcookie(session_name())").
session_end(). Если после авторизации данные о пользователе менять не надо, лучше сразу "выключить за собой свет" — закрыть файл и освободить доступ к нему.
session_set_cookie_params(жизнь, путь, домен). Установка параметров куки с идентификатором сессии (по умолчанию кука выставляется на корень сервера и на 0 секунд — до закрытия браузера).
Пока всё. Подробно про сессии будут отдельные выпуски. Пока опишу механизм авторизации и идентификации пользователя при помощи сессий.
Итак, имеем три файла — вход (login), проверка (auth) и выход (logout).
$user_result = mysql_query("SELECT * FROM user WHERE
login='$login' AND pass='". md5($pass). "'");
/* если возникла ошибка в базе (например, пользователь всунул в сессию дли-и-инную
переменную, которую база переваривать не захотела) или получилась не одна строка,
отфутболиваем пользователя */
if (mysql_error())
die(mysql_error());
elseif (@mysql_num_rows($user_result) != 1)
$error = "Неверное имя пользователя или пароль.";
// если всё нормально, выбираем данные, запускаем сессию
else {
$user = mysql_fetch_assoc($user_result);
session_set_cookie_params(1800, "/");
session_start();
// запоминаем данные о пользователе
session_register("user");
// и дальше отправляем его куда-нибудь
if (isset($HTTP_POST_VARS["return"]))
header("Location: {$HTTP_POST_VARS['return']}");
else
header("Location: /");
exit();
};
};
/* здесь пользователь уже не прошёл авторизацию, но может отправить куку из
закрытой сессии. очистим её. */
if (isset($HTTP_COOKIE_VARS[session_name()]))
setcookie(session_name());
// дальше рисуем форму, это неинтересно.
Данный скрипт является и обработчиком и формой для ввода данных. При получении логина и пароля он обрабатывает их и, если они правильные, прекращает работу, отправив пользователя на нужную страницу. Если данные неправильные или вообще отсутствуют, рисует форму.
/* убиваем переменную user, чтобы нельзя было, нарисовав форму, отправить данные
в post-запросе. */
unset($user);
// флаг "ошибка сессии" — если он включён, работа прекратится.
$session_error = false;
// если не существует куки с идентификатором сессии, поднять флаг
if (!isset($HTTP_COOKIE_VARS[session_name()]))
$session_error = true;
// если существует, запускаем механизм сессий и регистрируем переменную $user.
else {
session_start();
session_register("user");
/* если случайно в массиве нет логина и пароля, работа тоже прекращается ("ничего
не знаем, мы вам их давали") */
if (!isset($user["login"]) || !isset($user["pass"]))
$session_error = true;
};
/* если пользователю до сих пор удалось геройски избежать ошибок, делается проверка
через базу так же, как и на входе. */
if (!$session_error) {
$check_result = mysql_query("SELECT uid FROM user WHERE
login='{$user[login]}' AND pass='{$user[pass]}'");
if (mysql_error() || @mysql_num_rows($user_result) != 1)
$session_error = true;
};
// если была какая-то ошибка, то
if ($session_error) {
// уничтожаем данные сессии
session_destroy();
// уничтожаем куку, если она была
if (!isset($HTTP_COOKIE_VARS[session_name()]))
setcookie(session_name(),"","/");
/* отправляем пользователя на вход, с возможностью вернуться на запрошенный адрес */
Пара замечаний: закрываемая паролем часть в данном примере - весь сервер (например, service.firm.ru), для закрытия директории нужно исправить пути. Вместо PHPSESSID используется session_name(), чтобы можно было свободно менять имя идентификатора. Кстати, на одном физическом сервере можно делать разные имена идентификаторов сессий - достаточно в нужную часть положить файл .htaccess со строкой php_value session.name "ABRACADABRA".
Категория: php | Добавил: freeone (10.05.2007)
| Автор: Дмитрий Лебедев
How in direction of Software a Mount Buller Holiday
If your self are looking at a Mount Buller holiday, by yourself are picking out a place holiday that sets yourself aside towards the take it easy. It does not just take lengthy for fresh new site visitors toward Mt Buller and Mansfield in the direction of mechanically slide within appreciate with the natural environment and setting of a quiet oasis that will make for the excellent family vacation any period of calendar year. If on your own are fascinated inside of creating a holiday that is a very little alternate and a notch or 2 higher than the typical trip, then on your own really should take a Mt. Buller trip for your subsequent trip. Listed here your self will discover out all the things oneself have to have towards comprehend that will guidance your self application your Mansfield trip or following own vacation http://www.noclegi-w-rewalu-2016.com.pl/noclegi-w-rewalu/pokoje-w-rewalu-bezpieczenstwo-nad-morzem - Pokoje w Rewalu. Mansfield Lodging will be amongst your 1st components in the direction of check out off of your in the direction of do record. The very first House on your own need to have toward appear if by yourself will be using ease of Mt. Buller working day excursions will be the Alzburg vacation resort. This vacation resort specials all of the features oneself have to have in the direction of deliver your holiday vacation a person that will be remembered permanently. Your self will drop within just appreciate all about yet again at Alzburg at the time by yourself just take element inside of their Mt Buller lodging plans, and on your own will be organized toward reserve your upcoming family vacation right here just before oneself even go away. http://s11.postimg.org/wxsjmdbz7/jodlowa.jpg Snowboarding could possibly be your recreation of alternative and could be the sole rationale yourself are thinking about this holiday vacation. If thus, yourself will need in the direction of just take a Mansfield lodging company that will support your self inside the preparations important for a Mansfield Ski Retain the services of or Mt Buller carry tickets. When snowboarding is a amazingly prominent game in just the local, if individuals of your social gathering are not eager for the slopes, oneself might additionally glance for inns that will assistance your self prepare Mt. Buller working day excursions that will satisfaction any traveler http://www.pokoje-w-rewalu-2016.com.pl/wczasy/rewal-pokoje-w-jakim-terminie-jechac-nad-morze - Rewal pokoje. The summertime weeks offer you an abundance of possibilities for both Mt Buller working day excursions or solution out of doors things to do. Oneself can get pleasure from horse using, mountain cycling, mountaineering, or even rock mounting if yourself are the chaotic design. Snowboarding is not the merely sport within just the wintertime, and yourself could in addition acquire snow shoeing, ice skating, or even tobogganing. Inside of addition in the direction of a large wide range of bodily pursuits that yourself can love, your self in addition will need in the direction of discover Mansfield lodging that is around or centrally identified toward the very good browsing and eating amenities in just the community. The neighborhood pieces of Merrijig and Mansfield are house toward a range of places to eat that will give decisions that will you should anyone. No matter if by yourself are on the lookout for a fantastic eating environment, or a everyday eatery or café, on your own will identify it below. Inside of addition, there is a major industrial middle in this article residence towards financial institutions, marketplaces, and pharmacies in direction of meet up with any prerequisites of yours that may perhaps arrive up in the course of your family vacation http://www.noclegi-w-rewalu-2016.com.pl/noclegi-w-rewalu/rewal-noclegi-koszt-wakacji-nad-morzem - Rewal Noclegi. As oneself can perspective, there are a range of causes that deliver Mt. Buller and Mansfield a spot of decision for currently's traveler. If oneself are searching for a spot holiday vacation that is in excess of typical inside text of practical experience, start out coming up with your Mansfield lodging these days!