|
|
|
| День добрый.
Хотелось бы спросить насчет того случая, когда пользователь включает опцию "Запомнить меня" или что-то в этом стиле, что дает ему возможность заходить в защищенную часть сайта без ввода логина и пароля.
Я делаю так:
1) пользователь ввел логин и пароль
2) в случаи успеха создаем сессию с данными об ид пользователя, и куку с хэшем - неким уникальным значением для каждого логина, которое генерируется на лету здесь же и собственно обновляется в таблице пользователей, там же и хранится
3) далее если пользователь указал "Автологин" делаем запрос к таблице пользователей, в котором проверяем есть ли запись о пользователе с полем хэш, совпадающим с хэшем из куки - если есть создаем сессию с данными об ид пользователя
4) если существует сессионная переменная значит пользователь прошел логин.
Это очень плохой метод или же лучше с куками не сделаешь ? Отказаться от них не хочу. | |
|
|
|
|
|
|
|
для: wsnet
(04.01.2013 в 16:49)
| | Еще стоило бы привязывать эту сессию к ip чтобы если злоумышленик утащит куку, то не смог бы залогиниться | |
|
|
|
|
|
|
|
для: tvv123456
(04.01.2013 в 18:19)
| | >Еще стоило бы привязывать эту сессию к ip чтобы если злоумышленик утащит куку, то не смог бы залогиниться
А чем бы это помогло только, ведь пул адресов динамический сейчас или вообще могут быть одни и те ип-адреса у разных клиентов в разное время. Не думаю, что это защита какая-то. | |
|
|
|
|
|
|
|
для: wsnet
(04.01.2013 в 18:24)
| | согласен про ip адреса писал, считая что хотя бы минут 15 ip стабилен, но потом дошло, что речь идет о широком диапазоне времени.
Привязывать можно не только к ip: к версии браузера+операционке+разрешение экрана и много что еще можно придумать.
Штука весьма полезная.
Имея на руках только хеш совокупности всей этой информации злоумышлинник заходя на ваш сайт с чужой кукой, вряд ли сможет смоделировать все те факторы к которым вы привязались. Тем самым вы относительно обезопасите пользователя от кражи куки и авторизации на вашем сайте от его имени.
Конечно нужно искать не просто в базе хеш этой куки, а по-новому привязываться к данным пользователя. Таким образом в куку нужно сохранять не сам хеш, который у вас в базе, а какую-то случайную комбинацию salt. А потом дело техники: берем этот salt(не знаю почему так назвал:)+все данные по которым вычисляем хеш, и уже этот хеш ищем в базе.
Для исключения ошибки можно также создать еще одну куку со статическими данными(не с паролем разумеется), и пользователя в базе искать уже по ней, а по динамическому полю просто проверять и принимать решение: авторизовать пользователя или нет
P.S. Для обычной сессии(10-30 минут). Все-таки считаю не лишним включать и ip адрес. | |
|
|
|
|
|
|
|
для: wsnet
(04.01.2013 в 18:24)
| | Так от нечего делать написал реализацию того что написал выше:
<?php
class auth
{
function __construct()
{
$this->agent = $_SERVER['HTTP_USER_AGENT'];
$this->lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];//меняется редко
}
function getSalt()
{
return md5(time().rand(1000,10000));
}
function setCok()
{
$this->salt = $this->getSalt();
setcookie('salt',$this->salt,time()+3600*24*30);
}
function getCok()
{
$this->salt = $_COOKIE['salt'];
}
//использовались классы чтобы можно было безболезнено менять алгоритм хеширования
function getHash()
{
return md5($this->salt.$this->agent.$this->salt.$this->lang.$this->salt);
}
}
$auth = new auth;
//устанавливаем пользователю куку после успешной авторизации
$auth->setCok();
//получаем хеш с нашей солью
$hash = $auth->getHash();
//далее $hash записываем в базу в строку с пользователем
/*==============Автоматическая Авторизация============*/
//вычисляем хеш на основании соли хранящейся в куках
$auth->getCok();
$hash = $auth->getHash();
//ищем в базе такой $hash и пишем пользователю авторизацию или просим авторизироваться
|
| |
|
|
|
|
|
|
|
для: tvv123456
(04.01.2013 в 19:30)
| | Да кстати кроме этого:
md5($this->salt.$this->agent.$this->salt.$this->lang.$this->salt);
|
у меня как-раз таки хэш сейчас:
md5(time().rand(1000,10000))
|
Спасибо огромное за мысли. | |
|
|
|
|
|
|
|
для: wsnet
(04.01.2013 в 19:44)
| | Использовать конечно только браузер и языковые настройки, тоже не сильно обезопасит при краже куки, так как комбинаций получается не так уж и много. Но это так для образца. Можно привязаться еще к чему-нибудь более уникальному. | |
|
|
|
|
|
|
|
для: tvv123456
(04.01.2013 в 19:49)
| | Да я понял спасибо, просто в моем приложении безопасность - это не крик души - иначе было использовал сессии. | |
|
|
|
|
|
|
|
для: tvv123456
(04.01.2013 в 19:30)
| | > $this->salt = $this->getSalt();
извините, что влез, но откуда берется эта переменная? | |
|
|
|
|
|
|
|
для: tvv123456
(04.01.2013 в 19:30)
| | очень странная реализация функции getCok. да и вообще.. | |
|
|
|