Авторизация через cookie php
БлогNot. PHP: авторизация с помощью cookies, простой пример
PHP: авторизация с помощью cookies, простой пример
Если не принимать в расчёт не всегда удобную проверку того, включены ли у пользователя cookie-файлы, использовать их легко. К тому же, cookie позволяют управлять временем, в течение которого действует авторизация.
Ниже показан небольшой листинг, реализующий авторизацию пользователя с помощью «куки», хранящей зашифрованную алгоритмом md5 контрольную сумму от пароля. Имя кукиза auth отличается от имени встроенной переменной, «ответственной» за пароль ( $trypass ), так безопасней.
Вместо формы для ввода пароля он передаётся ссылкой через метод $_GET , разумеется, в жизни так делать не нужно.
Также показана «альтернативная» моей обычной обработка параметров функцией get_param . Обратите внимание, что глобальный массив $_REQUEST содержит как данные массивов $_GET и $_POST , так и все $_COOKIE , что позволяет получить компактный код обработки числовых и строковых параметров скрипта.
Предполагается, что файл выполняется на хосте под именем cookie.php , вот полный листинг:
else return ($number ? 0 : ""); > if (!empty($_COOKIE['auth'])) $trypass = $_COOKIE['auth']; //есть сохранённый куки? прочитать else $trypass = md5(get_param('trypass')); //иначе попытаться получить пароль от юзера $go = get_param('go'); //некий параметр, обозначающий "действие" скрипта $access = false; //флажок "доступ к авторизованной части" if ($trypass==$pass) < //получен верный пароль $access = true; setcookie('auth',$pass,time()+3600); //ставим кукиз на час //в файле cookie хранится только зашифрованный пароль >if ($go=='logout') < //выбрано действие "выход" setcookie('auth','',time()-3600); //сбрасываем время действия кукиза $access = false; >if ($access) < //находимся в авторизованном режиме setcookie('auth',$pass,time()+3600); //продляем кукиз на час от текущего момента //здесь выбор других действий в зависимости от значения $go echo 'Контент для авторизованного пользователя; обновить; выход
'; > else < echo 'Вы не авторизованы; обновить; автовход
'; //на самом деле пароль будет получен из формы > ?>
P.S. Функция mysql_real_escape_string устарела в PHP7. Если не хочется тащить в скрипт идентификатор соединения с БД, как требует MySQLi, попробуйте альтернативные решения, например, отсюда или просто замените @mysql_real_escape_string($name) на $name .
Вот более новая версия примера для PHP 7-8, поддерживает любое имя файла, не требует mysql_real_escape_string :
else return ($number ? 0 : ""); > if (!empty($_COOKIE['auth'])) $trypass = $_COOKIE['auth']; //есть сохранённый куки? прочитать else $trypass = md5(get_param('trypass')); //иначе попытаться получить пароль от юзера $go = get_param('go'); //некий параметр, обозначающий "действие" скрипта $access = false; //флажок "доступ к авторизованной части" if ($trypass==$pass) < //получен верный пароль $access = true; setcookie('auth',$pass,time()+3600); //ставим кукиз на час //в файле cookie хранится только зашифрованный пароль >if ($go=='logout') < //выбрано действие "выход" setcookie('auth','',time()-3600); //сбрасываем время действия кукиза $access = false; >if ($access) < //находимся в авторизованном режиме setcookie('auth',$pass,time()+3600); //продляем кукиз на час от текущего момента //здесь выбор других действий в зависимости от значения $go echo 'Контент для авторизованного пользователя; обновить; выход
'; > else < echo 'Вы не авторизованы; обновить; автовход
'; //на самом деле пароль будет получен из формы > ?>
22.02.2017, 10:21 [16966 просмотров]
Безопасный метод авторизации на PHP
Давайте посмотрим вокруг: форумы, интернет магазины, гостевые книги и т.д. используют регистрацию и последующую авторизацию пользователей. Можно даже сказать, что это почти необходимая функция каждого сайта (только если это не домашняя страничка Васи Пупкина или не визитная карточка, какой-нибудь небольшой компании). Сегодня я хочу поделиться со всеми новичками информацией, о том, как лучше это все реализовать.
1. Модель (клиент)
Регистрация
— логин (a-z0-9)
— пароль
Вход
— логин
— пароль
Cookie
— уникальный идентификатор юзера
— хэш
Модель (сервер)
MySQL
Таблица users
user_id (int(11))
user_login (Varchar(30))
user_password (varchar(32))
user_hash (varchar(32))
user_ip (int(10)) по умолчанию 0
При регистрации в базу данных записываеться логин пользователя и пароль(в двойном md5 шифровании)
При авторизация, сравниваеться логин и пароль, если они верны, то генерируеться случайная строка, которая хешируеться и добавляеться в БД в строку user_hash. Также записываеться IP адрес пользователя(но это у нас будет опциональным, так как кто-то сидит через Proxy, а у кого-то IP динамический… тут уже пользователь сам будет выбирать безопасность или удобство). В куки пользователя мы записываем его уникальный индетификатор и сгенерированный hash.
Почему надо хранить в куках хеш случайно сгенерированной строки, а не хеш пароля?
1. Из-за невнимательности программиста, во всей системе могут быть дырки, воспользовавшийсь этими дырками, злоумышленик может вытащить хеш пароля из БД и подставить его в свои куки, тем самым получить доступ к закрытым данным. В нашем же случае, двойной хеш пароля не чем не сможет помочь хакеру, так как расшифровать он его не сможет(теоретически это возможно, но на это он потратит не один месяц, а может быть и год) а воспользоваться этим хешем ему негде, ведь у нас при авторизации свой уникальный хеш прикрепленный к IP пользователя.
2. Если злоумышленик вытащит трояном у пользователя уникальный хеш, воспользовать им он также не сможет(разве если только, пользователь решил принебречь своей безопастностью и выключил привязку к IP при авторизации).
2. Практика
—
— Структура таблицы `users`
—
CREATE TABLE `users` (
`user_id` int(11) unsigned NOT NULL auto_increment,
`user_login` varchar(30) NOT NULL,
`user_password` varchar(32) NOT NULL,
`user_hash` varchar(32) NOT NULL,
`user_ip` int(10) unsigned NOT NULL default ‘0’,
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
register.php
// Страница регситрации нового пользователя
mysql_connect ( «localhost» , «myhost» , «myhost» );
if(! preg_match ( «/^[a-zA-Z0-9]+$/» , $_POST [ ‘login’ ]))