Авторизация. Запомнить меня. Как это делается?

Часто приходится встречать кнопку запомнить меня в меню авторизации. Почти на каждом форуме, почте или блоге, где регистрационные данные не столь ценны – можно встретить такую удобную галочку.

Почему так устроено?

Все дело в том, что понять, что с этого компьютера вошли именно вы – достаточно проблематично. Сервер может отследить ваш IP и по нему назначить вам сессию, но хранить он ее будет не долго, т.к. через час вашего отсутствия он будет думать, что вы уже ушли и хранить информацию больше ни к чему.
Так, когда вы возвращаетесь на форум на следующие сутки – он вас вдруг вспоминает. Это работает следующим образом – при авторизации – сервер дает команду сохранить логин и шифр пароля у вас на компьютере, в файлах, под названием Куки cookie. И каждый раз, когда вы входите на форум – компьютер автоматически отправляет эти данные и вас узнают.
Получается – это не безопасно? Конечно, хранение файлов с логином и паролем у себя в открытом виде – небезопасно. По этому обычно храниться не сам пароль, а хеш пароля. Но, тем не менее, потенциальная угроза остается. Кто-то может при помощи не хитрых приспособлений, поместив небольшой кусок Javascript на страницу с форумом – получить эти данные и также, в виде файлов – разместить их у себя. Либо злоумышленник может сделать нехитрый exe файлик, который при запуске будет считывать все ваши файлы cookie и передавать их куда-либо.
Таким образом – Безопасность страдает в угоду удобства.

Как же это делать технически?

Очень просто – при авторизации – вешаем пользователю 2 куки

setcookie('email',$login,time()+3600*24*14,'/');
setcookie('pass',sha1($password.'соль-куки'.$login),time()+3600*24*14,'/');

Время хранения указываем, какое хотим. В примере – 2 недели с момента авторизации
Помним, что в базе данных храниться хеш пароля. Но даже хеш нельзя давать человеку в куку, по этому создаем хеш хеша пароля :). В функцию обязательно пихаем соль и id учетной записи, чтобы сложнее было понять сам пароль и хешу.
Далее – когда пользователь заходит на сайт – проверяем, есть ли у него установленные Куки и сравниваем тот же хеш пароля. На выходе – либо авторизируем, либо уничтожаем Куки.
К примеру можно сделать так в загрузочном файле:

if (!$_SESSION[‘user’][‘id’] and !empty($_COOKIE['email']) and !empty($_COOKIE['pass']))login($_COOKIE['email'],$_COOKIE['pass'],true);

Последним – ставим признак сверки хеша хеша пароля ). Когда мы захотим авторизоваться обычным образом – мы просто передадим false.
Сама же функция авторизации может выглядеть простым способом

function login($login,$pass,$ishashing=false){
        if (empty($login))return 'Не указан почтовый ящик email';
        if (empty($pass))return 'Не указан пароль';
        // смотрим бд
        $sql="SELECT * FROM users WHERE email='{$login}'";
        $rs=execute($sql);
        if (empty($rs['email']))return 'Пользователь не найден';
        $math=false;
        if ($ishashing){
            if ($pass==sha1($rs['password'].'соль-куки'.$login))$math=true;
        }else{
            if (sha1($pass.'соль-при-регистрации')==$rs['password'])$math=true;
        }
        if (!$math){
            if ($ishashing){
                setcookie('email','',0,'/');
                setcookie('pass','',0,'/');
                return false;
            }
            return 'Пользователь с данным паролем не найден';
        }
        $_SESSION['user']=$rs;
        setcookie('email',$login,time()+3600*24*14,'/');
        setcookie('pass',sha1($rs['password'].'соль-куки'.$login),time()+3600*24*14,'/');
        return true;
    }

Думаю вопросов много не будет. Сперва проверяем данные, смотрим данные из базы.
Сравнение зависит от типа хеша. При обычном сравнении – идет сравнение с солью, данной при регистрации, а при хешированном – хеш еще раз хешуется.
Переменная login не должна меняться для пользователя, иначе пароли тоже перестанут срабатывать.
Вполне простая процедура, не требующая хитрых приспособлений

  • Автор: kosmom
  • Рейтинг: 5
  • Просмотров: 3692
  • Комментариев: 0
  • Создан: 26.11.2011 16:57

Комментарии (0)

Ваши предложения и пожелания пишите на pro@kosmom.ru

Теги

backup bootstrap core framework eloquent excel home project html ios javascript keep-alive kpi laravel legacy mvp orm php rip scroll timestamp undefined vue vuetify watch безопасность биометрический паспорт ваша любаша для путешествий загран на 10 лет загран паспорт загранпаспорт нового образца зимние книги как заполнить анкеты кеширование книги на новый год логирование мцф недвижимость новогодние книги образец заполнения антеты паспорт для путешествий паспорт нового поколения печать продукт проектирование прокси разработка ремонт ремонт в апартаментах ремонт нежилого помещения самокат сдача сколько стоил ремонт апартаментов спорт стандарты таблица финансы хостинг цена ремонта что почитать зимой юзабилити

Случайный пост

20.09.2011 22:13
День второй