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

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

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

Все дело в том, что понять, что с этого компьютера вошли именно вы – достаточно проблематично. Сервер может отследить ваш 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
  • Рейтинг: 0
  • Просмотров: 652
  • Комментариев: 0
  • Создан: 26.11.2011 16:57

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