авторизация – “Запомнить меня” при авторизации пользователя – Stack Overflow на русском

Авторизация (php mysql) и запоминание пользователей для начинающих — werther blog’s

1. Таблица БД с пользователями

Мы будем использовать очень краткий вариант. Структура будет такова:

id smallint(8) unsigned NOT NULL auto_increment,
login varchar(50) NOT NULL default '',
password varchar(32) NOT NULL default ''

Размер поля password — 32 символа. Т.к. мы бедм хранить в нем хеш пароля, а не сам пароль в чистом виде.

2. Авторизация и вход пользователей

Для начала мы отрисуем форму, с помомью которой пользователь сможет передать нам свой логин и пароль.

<form action="login.php" method="post">
    <table>
        <tr>
            <td>Логин:</td>
            <td><input type="text" name="login" /></td>
        </tr>
        <tr>
            <td>Пароль:</td>
            <td><input type="password" name="password" /></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Войти" /></td>
        </tr>
    </table>
</form>

После ввода пользователем данных, мы проверяем его логин и пароль.

Так как мы договорились не хранить пароль в чистом виде, будем ставнивать хеш введённого пароля с тем, что хранится у нас в базе.

if (isset($_POST['login']) && isset($_POST['password']))
{
    $login = mysql_real_escape_string($_POST['login']);
    $password = md5($_POST['password']);

    // делаем запрос к БД
    // и ищем юзера с таким логином и паролем

    $query = "SELECT `id`
            FROM `users`
            WHERE `login`='{$login}' AND `password`='{$password}'
            LIMIT 1";
    $sql = mysql_query($query) or die(mysql_error());

    // если такой пользователь нашелся
    if (mysql_num_rows($sql) == 1) {
        // то мы ставим об этом метку в сессии (допустим мы будем ставить ID пользователя)

        $row = mysql_fetch_assoc($sql);
        $_SESSION['user_id'] = $row['id'];

        // не забываем, что для работы с сессионными данными, у нас в каждом скрипте должно присутствовать session_start();
    }
    else {
        die('Такой логин с паролем не найдены в базе данных. И даём ссылку на повторную авторизацию.');
    }
}

3. Кто авторизован, а кто нет?

Итак мы определились, что авторизованные пользователи — те, у которых указан $_SESSION[‘user_id’]
Те, у кого нет $_SESSION[‘user_id’], мы будем считать гостями.

Пример использования:

if (isset($_SESSION['user_id'])) {
    // показываем защищенные от гостей данные.
}
else {
    die('Доступ закрыт, даём ссылку на авторизацию.');
}

4. Как реализовать «запомнить меня на этом компьютере»?

Здесь, помимо сессий, мы будем использовать куки.
О куках обязательно нужно почитать у нас в FAQ.

Сессии не постоянны и данные в них хранятся только на время работы пользователя со скриптом. Поэтому, чтобы пользователь оставался залогиненым после того, как он закрыл и снова открыл на нашей странице свой браузер — необходимо сохранять его авторизационные данные в куках (они хранятся на его компьютере в браузере).
Мы будем записывать в куки пользователя его логин и хеш пароля. (как записывать что-то в куки, читайте выше по ссылке)

В нашем скрипте проверка пользовательских данных в куках будет выглядеть так:

// если пользователь не авторизован
if (!isset($_SESSION['user_id'])) {
    // то проверяем его куки
    // вдруг там есть логин и пароль к нашему скрипту

    if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
        // если же такие имеются
        // то пробуем авторизовать пользователя по этим логину и паролю
        $login = mysql_real_escape_string($_COOKIE['login']);
        $password = mysql_real_escape_string($_COOKIE['password']);

        // и по аналогии с авторизацией через форму:

        // делаем запрос к БД
        // и ищем юзера с таким логином и паролем

        $query = "SELECT `id`
                FROM `users`
                WHERE `login`='{$login}' AND `password`='{$password}'
                LIMIT 1";
        $sql = mysql_query($query) or die(mysql_error());

        // если такой пользователь нашелся
        if (mysql_num_rows($sql) == 1) {
            // то мы ставим об этом метку в сессии (допустим мы будем ставить ID пользователя)

            $row = mysql_fetch_assoc($sql);
            $_SESSION['user_id'] = $row['id'];

            // не забываем, что для работы с сессионными данными, у нас в каждом скрипте должно присутствовать session_start();
        }
        else {
            // только мы не будем давай ссылку на форму авторизации
            // вдруг человек и не хочет был авторизованым
            // а пришел просто поглядеть на наши страницы как гость
        }
    }
}

4.1. Как установить куки?
об этом написано опять же в нашем ФАКе
Когда ставить? — когда авторизуем пользователя через форму, тогда и ставим куку, если в этом есть необходимость.

5. О безопасности кук

Ложа руку на сердце и *** на все холивары по этому поводу, ответственно заявляю: если вы ну оооочень боитесь утечки данных или они очень конфиденциальные — не сохраняйте ничего у пользователя (в куках). Куки могут быть легко угнаны (их даже перекрашивать не нужно) и выданы за свои.

Просто предупреждайте пользователя, что если он хочет «оставаться авторизованым на Вашей странице», то всегда сохранятся риск потери данных.

6. Безопасное хранение пароля в базе данных

Пароль не следует хранить в открытом виде. Всегда существует опасность SQL инъекции, при которой злоумышленник может наглым образом получить Ваш пароль.
Лучше его хешировать (например с помощью функции md5()).
Прочитайте в мануале про эту функцию. И именно по этому мы отводим на пароль 32 символа.
И следовательно, при авторизации мы сверяем не пароли, а их хеши. В нашем случае это было так: мы сравнивали md5(‘введенного пароля’) с хэшем пароля, хранящимся в БД.

7. Соль в пароле или как усложнить жизнь хакеру

Пароль можно подобрать по его хешу, зная алгоритм хеширования. Существует много баз, где пароли сопоставлены с их хешами.

Поэтому, простым движением руки, мы можем немного сложнить задачу людям, которые соберутся подбирать пароль по его хешу.
Можно брать двойной хеш (например, md5(sha1(‘password’))) или использовать так называемую «соль» (salt).
Пример использования соли: md5(md5(‘password’) . ‘secret_code’);
secret_code — это и есть соль, то есть мы тупо к паролю добавляем какой-то набор символов (желательно ещё и запомнить, какой набор символов мы добавляем ;)).

Итак, для такого метода хранения пароля мы немного изменим таблицу БД с пользователями:

id smallint(8) unsigned NOT NULL auto_increment,
login varchar(50) NOT NULL default '',
password varchar(32) NOT NULL default '',
salt varchar(3) NOT NULL default ''

Здесь мы будем использовать соль из 3 символов.

Для каждого пользовательского пароля (при его регистрации), мы будем генерировать свою соль и записывать в базу рядом с паролем, чтобы использовать при хешировании.

Рассмотрим пример:
— мы регистрируем пользователя: md5 с паролем password и солью 8f*
— получаем его хеш, используя md5(md5(‘password’) . ‘8f*’)
— записываем пользователя в таблицу, получаем:
1 | md5 | 84cd3e7ff13bbaed1c1db91671844bcc | 8f*
— при входе пользователя через фому, немного изменим наш код:

// дня начала вытащим из таблицы с пользователями соль для логина, который был введен
$login = mysql_real_escape_string($_POST['login']);

$query = "SELECT `salt`
            FROM `users`
            WHERE `login`='{$login}'
            LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());

if (mysql_num_rows($sql) == 1) {
    $row = mysql_fetch_assoc($sql);

    // итак, вот она соль, соответствующая этому логину:
    $salt = $row['salt'];

    // теперь хешируем введенный пароль как надо и повторям шаги, которые были описаны выше:
    $password = md5(md5($_POST['password']) . $salt);

    // и пошло поехало...
}
else {
    die('пользователь с таким логином не найден, даём ссылку на повторную авторизацию');
}

8. Полезные ссылки

Сессии
Cookie
md5()
sha1()

9. Практический пример авторизации

В этом наборе скриптов: авторизации, регистрации; пример закрытой страницы и дамп таблицы пользователей.
Здесь реализовано хранение пароля в виде: md5(md5(‘пароль’) . ‘соль’) и запоминание с помощью кук.
Имеется дамп таблицы БД, его загрузить и необходимо прописать настройки соединения с БД в файле — mysql.php

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

"запомнить меня" при авторизации пользователя

Добрый день.

Нужно к системе авторизации пользователей добавить возможность запоминания пользователя, если он установился галочку “запомнить меня” при авторизации. Авторизация у меня происходит через сессию. Т.е. проверили данные о юзере с данными из БД и записали данные в сессию.

Как реализовывал “запомнить меня” – если юзер нажал галочку, то когда пишу данные в сессию об авторизации пишу и кукисы –

setcookie('login', $foo1 ,time() 604800, "/");setcookie('pass', $foo2 ,time() 604800, "/");

При разлогинивании убиваю сессию и удаляю кукисы –

setcookie ("login", "", time()-14800); setcookie ("pass", "", time()-14800);session_destroy();

Но проблема в том, что при разлогинивании сессия удаляется, а вот кукисы нет, не знаю почему.

Далее, на странице авторизации, куда у меня идёт редирект, после разлогинивания вызывается метод, этот метод делает проверку на наличии кукисов и если они есть, то проверяем данные из куков и авторизуем юзера. Но из-за того, что кукисы не удалились при разлогинивании у меня происходит снова запуск сесссии и залогинивание юзера, таким образом я вообще не могу разлогиниться. Думал дело в браузере, но перепробовал и в хроме и в Екплоуер и в Мазиле. Сам не могу разобраться в чём причина, уже 2 дня. Очень нужна помощь.

static  function saveMe(){
    // проверяем наличие куки в браузере пользователя
    if(isset($_COOKIE['login'])){
        if(!empty($_COOKIE['login']) && empty($_SESSION['mail'])){
            // кука найдена, теперь сверим данные пользователя с данными в БД сайта
            $db = new db('yes');
            $findUser = $db->isset_user($_COOKIE['login'],$_COOKIE['pass']);
            if(!empty($findUser['id'])){
                $_SESSION['okauth'] = true;
                $_SESSION['mail'] = $findUser['mail_user'];
                $_SESSION['privileged'] = $findUser['privileged'];
            }
            unset($db);
        }
    } }

Авторизируйте пользователя так, чтобы он оставался на той же странице

Авторизация на сайте — это важная функция, и пользователи захотят иметь возможность авторизоваться с любой странички на сайте. Так что не забудьте сделать так, чтобы после входа на сайт пользователь попал на ту же страничку, с которой он авторизовывался. Это сделает процесс проще и поможет пользователю сразу приступить к решению своей задачи на сайте.

Существует два пути реализации такого процесса: выпадающая форма и модальное окно.

Выпадающая форма открывается, не унося пользователя с текущей страницы. Она занимает только небольшую область на странице, что позволяет сделать форму в таком варианте быстрым и ненагруженным решением.

авторизация - "Запомнить меня" при авторизации пользователя - Stack Overflow на русском

Модальное окно также не уносит пользователя с текущей страницы — оно разворачивается по центру страницы, концентрируя внимание полностью на форме авторизации. Этот вариант дает возможность разместить в форме дополнительную информацию.

авторизация - "Запомнить меня" при авторизации пользователя - Stack Overflow на русском

Боритесь со спамом, пряча при помощи javascript текстовое поле, вместо использования капчи

Если вы страдаете от обилия спама, вам совсем не обязательно использовать капчу. При использовании капчи в ее традиционном виде пользователю предлагается ввести в поле искаженные символы с картинки. Наличие капчи, к сожалению, негативно сказывается на конверсии, ведь ее заполнение — это дополнительное усилие, затрачиваемое пользователем.

Простой способ побороть спам, при этом не теряя в конверсии — использование скрытого обязательного поля ввода, создаваемого JavaScript на стороне клиента. Спамботы не могут взаимодействовать с объектами Javascript на стороне клиента, это может сделать только пользователь.

Также вы можете использовать подход Honeypot Captcha — в форме создается поле, которое следует оставить пустым, а затем в CSS оно скрывается от пользователя (но не от ботов). И если при отправке данных в поле появляется какой-то текст, вы можете игнорировать этот случай заполнения формы, т.к. перед вами спам бот.

Не ставьте по умолчанию галочку в чекбоксе «подписаться на рассылку», предлагайте сначала посмотреть превью письма

Большинство веб-сайтов по умолчанию подписывают своих свежезарегистрированных посетителей в надежде получить побольше подписчиков своей корпоративной рассылки. Да, такой прием иногда срабатывает, однако подписка бессмысленна, если пользователь просто не заметил опцию ее отключения или не понял назначения этой опции.

Если пользователю неинтересно будет получать вашу рассылку, он все равно отпишется от нее, и в долгосрочной перспективе такой метод вам не поможет. А еще рассылка писем пользователям, не подозревавшим о наличии рассылки, легко может оттолкнуть их от вас.

Более эффективным подходом было бы продемонстрировать превью или отрывок письма из рассылки. В таком случае пользователи смогут наглядно представить что они потеряют, если не подпишутся. А еще вы будете спать спокойно, зная, что вашу рассылку получают только те, кто точно в ней заинтересован.

Спрашивайте пароль только один раз

Многие формы регистрации предлагают пользователям ввести пароль в два поля. Причины этого вполне понятны — вводимый пароль в форме прячется за маской из соображений безопасности: так люди за спиной не смогут его увидеть. А два поля в этом случае помогают избежать опечаток.

Однако на практике это приводит к еще большему количеству ошибок, потому что пользователю приходится печатать больше. Он не видит, какие символы вводит, и каждый раз при вводе пароля не уверен в том, что печатает правильный пароль.

Более эффективным подходом было бы просить пользователя заполнить пароль только один раз, и включить в форму чекбокс, галочка в котором снимет маску с поля и позволит пользователю проверить правильность введенного пароля. Такой подход поможет уменьшить количество полей и избавит пользователя от лишней работы.

Позвольте пользователям видеть их пароли


Эта опция полезна при авторизации точно так же, как и при регистрации. Если пользователи не видят символов в поле, они легко могут опечататься, после чего им придется вводить пароль заново до тех пор, пока они не введут его правильно.

Проблема состоит в том, что пользователь не знает, какой именно символ он ввел неправильно, и не может исправить ошибку с первого раза. Это требует больше усилий, и замедляет пользователя. От этой проблемы можно избавиться, включив в форму чекбокс «показать пароль».

авторизация - "Запомнить меня" при авторизации пользователя - Stack Overflow на русском

Позволяйте пользователям скопировать платежный адрес из адреса доставки

В США и других странах пользователь, желая приобрести что-то в сети, должен указать не только адрес доставки товара, но еще и так называемый адрес оплаты (по нему может быть доставлен чек). В большинстве случаев эти адреса совпадают, так почему бы не разрешить пользователям скопировать их из одного в другой?

авторизация - "Запомнить меня" при авторизации пользователя - Stack Overflow на русском

Автозаполнение поля «город» на основе почтового индекса

Если вы просите пользователя заполнить домашний адрес, то рассмотрите возможность автозаполнения города и области из введенного почтового индекса. В результате этого ваша форма будет эффективнее, так как пользователю не придется тратить время и силы на то, чтобы впечатывать свой город в поле или выбирать его из длинного выпадающего списка.

авторизация - "Запомнить меня" при авторизации пользователя - Stack Overflow на русском

Заключение

Ваши формы регистрации и авторизации не должны усложнять жизнь пользователям, ведь заполнение форм — это то еще развлечение. Наши советы помогут вам сделать формы проще и эффективнее, так что путь ваших пользователей к содержимому сайта будет короче и приятней.

.PS от переводчиков:Надеюсь, вам понравилась статья. Мы будем рады, если вы укажете нам на ошибки в переводе, чтобы мы могли их оперативно исправить. Пишите мне в личку, пожалуйста 🙂

Спрашивайте имя пользователя уже после регистрации

Во время заполнения формы регистрации от пользователя требуется придумать и ввести уникальное имя. И если пользователь придумывает и вводит уже кем-то занятое имя, ему приходится думать еще, он тратит свое время и терпение. Вместо того чтобы требовать у посетителей имя в процессе регистрации, вы вполне можете спросить его сразу после этого процесса.

Автоподстановка в поле «страна»

Обычно пользователя просят выбрать страну проживания из длинного выпадающего списка. Однако разумнее будет использовать автоподстановку названия страны по вводимым в поле символам — пользователь сможет выбрать свою страну, напечатав пару символов ее названия.

авторизация - "Запомнить меня" при авторизации пользователя - Stack Overflow на русском

Делайте кнопку «подтвердить» такой же ширины, что и поля ввода

Кнопка подтверждения создана не просто для того, чтобы сделать возможным действие — она еще показывает какое именно действие пользователь сейчас совершит. Маленький размер кнопки означает слабую подсказку к манипулированию, из-за чего пользователь может сомневаться в нужности данного действия.

Широкая кнопка придает уверенности, и её трудно не заметить. Название кнопки также становится заметнее, поэтому пользователь лучше понимает действие, которое собирается совершить.

Автоматически устанавливайте курсор в первое поле формы

Как только пользователи увидят перед собой форму авторизации, они будут готовы к тому, чтобы войти на сайт. Вы можете облегчить им задачу, размещая курсор в первом поле ввода. Тогда пользователям не придется наводить мышку на поле и кликать по нему. Они смогут держать руки на клавиатуре и сразу же начать вводить необходимые данные.

Используйте иконку вопроса в качестве ссылки для восстановления пароля

Пользователи не должны испытывть проблем с поиском ссылки восстановления пароля в форме. Вместо того, чтобы использовать слова «Забыли пароль?» в качестве ссылки, достаточно сделать ссылкой маленькую иконку в виде знака вопроса, которая не потеряется среди других ссылок и не занимает много места.

Упрощаем форму регистрации

Цель любой веб-формы заключается в том, чтобы пользователь легко и правильно ее заполнил.

Если форма слишком длинная и сложная, то впечатление пользователя от сайта может быть испорчено. Ниже представлено несколько приемов, которые помогут сделать так, чтобы пользователи заполняли ваши формы легко и быстро.

Упрощаем формы входа на сайт

Задача любой формы авторизации — пустить пользователя в его аккаунт. Не смотря на такую простую задачу, одни формы авторизации решают ее лучше других. Вот вам несколько простых способов того, как помочь пользователям входить в свой аккаунт легче и быстрее.

Похожее:  «Ошибка 29» Триколор ТВ - для просмотра необходима авторизация: причины и что делать?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *