Часто приходится встречать кнопку запомнить меня в меню авторизации. Почти на каждом форуме, почте или блоге, где регистрационные данные не столь ценны – можно встретить такую удобную галочку.
Почему так устроено?
Все дело в том, что понять, что с этого компьютера вошли именно вы – достаточно проблематично. Сервер может отследить ваш 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 не должна меняться для пользователя, иначе пароли тоже перестанут срабатывать.
Вполне простая процедура, не требующая хитрых приспособлений