admin / 05.06.2018

Реализация авторизации на сайте с помощью PHP и сессий | IT Памятка

.

главная — Статьи — WWW (HTML, PHP и др.)

Сессии. Скрипт авторизации. Часть 1

Господа, небольшое объявление: эта статья написана для неопытных веб-программистов. Это не супер-пупер, а просто работающее руководство к действию. Также просматривайте комментарии внизу статьи — они с 2008 года. За этот срок много что поменялось, но основа все равно работает. Обращайте на это внимание!

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

PHP авторизация на сайте — чтобы пользователи не мерзли у входа

Пароли и логины будем хранить в таблице mysql.

На первой странице (index.php) делаем форму для ввода данных:

 

Думаю здесь пояснять ничего не нужно. Идем дальше:

Сначала краткое пояснение. Мы создаем функцию проверки пользователя check(). У нас есть база данных my_site, содержащая поля id, name и pass, где name и pass — логин и пароль пользователя соответственно. Функция пропускает только тех, кто указал верный логин и пароль в форме ($name, $pass) на входе, потом эти переменные сохраняются в сессию, следовательно, пока сессия жива пользователь может заходить на ваш сайт без авторизации. Даже указав другой верный логин и пароль, он будет авторизирован под указанным ранее логином.

Предполагается, что соединение с базой mysql уже произведено и база данных выбрана.

<?php
functioncheck()
{
    if (empty($pass) || empty($name)) error("Не указан логин или пароль");
    $sql="select * from my_site where login='".$name."'";
    if ($show=mysql_query($sql))
    {
        $a=mysql_fetch_array($show);
        if ($a['pass'] != $pass) error("Неверное сочетание логин — пароль");
        elsesession_register("name","pass");
    }
    elseerror("Ошибка запроса к базе данных");
}
?>

Начнем пояснения с первой строки.

if (empty($pass) || empty($name))

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

error("Не указан логин или пароль");

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

<?php
functionerror($er)
{
    echo$er;
    exit(0);
}
?>

Если поля не пусты, то скрипт продолжает работу.

$sql="select * from my_site where login='".$name."'";

Пишем запрос к базе mysql, который вернет нам значение поля pass, строки, где login=$name.

if ($show=mysql_query($sql))

Если запрос обработан без ошибок, то

$a=mysql_fetch_array($show);

Присваиваем переменной $а (ассоциативный массив) значение поля pass

if ($a['pass'] != $pass) error("Неверное сочетание логин — пароль");

Если поле pass не соответствует тому, что ввел пользователь или тому, что хранится в сессии, то мы опять через функцию error выводим ему ошибку.

elsesession_register("name","pass");

Иначе записываем переменные $name и $pass в сессию и продолжаем выполнять скрипт.

    }
    elseerror("Ошибка запроса к базе данных");
}

Если есть ошибка в запросе к базе mysql, то мы опять же выводим ошибку пользователю.

Итак, вначале каждой страницы, к которой нужно запретить доступ посторонним пишем:

<?php
session_start();
// эта функция, открывающая или продолжающая работу с сессиями. Она должна
//быть задана в самом начале страницы до отправки заголовка страницы.
check();
//наша функция проверки.
?>

Теперь проверим логику скрипта. Если человек не заполняет одно из полей и нажимает кнопку "вход", то перейдя на страницу index2.php он получит надпись "Ошибка: Не указан логин или пароль".

Если он указывает неверный логин или пароль, то ему выпадает "Ошибка: Не верное сочетание логин — пароль".

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

Возможные проблемы:

Нельзя заходить на сайт под разными именами.

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

Решение этих проблем будет описано в следующих статьях.

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

Автор: Александр, http://cngroup.ru/

Авторизуйтесь для добавления комментариев!

Сервис WebMoney Login предназначен для проведения аутентификации участников системы WebMoney как на сервисах WebMoney Transfer, так и на сайтах участников.

В основе принципа работы WebMoney Login лежит понятие о временном (сессионном) пароле, который действителен лишь во время существования сессии участника и в рамках сервиса называется авторизационным тикетом.

Всякий раз при авторизации на том или ином сайте сервис выдает авторизационный тикет и отправляет его вместе с другими параметрами на страницу сайта, запросившую авторизацию.

Безопасный метод авторизации на PHP

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

Сервис поддерживает следующие способы аутентификации участников WebMoney:

  • с помощью WebMoney Keeper:
  • с использованием сервиса E-NUM (только дополнительная авторизация);
  • независимо от типа WebMoney Keeper: с помощью логина (WMID, email или номер телефона) и пароля. Для WebMoney Keeper WebPro (Light) и WinPro (Classic) при этом способе обязательно наличие второго фактора: E-num или проверенного номера телефона, на который высылается код подтверждения по SMS.
  • с использованием аккаунтов в социальных сетях: Facebook, Vkontakte, Одноклассники, Twitter, Google Plus, Linkedin, учетных записей в Microsoft, Yahoo, ICQ, Mail.ru, Yandex.ru

Для обычного участника сервис предоставляет следующие возможности:

  1. Контролировать время создания и окончания действия его авторизационных тикетов, а также название сайтов, для которых они выданы и IP-адреса с которых произведена авторизация (см. Раздел Активные входы );
  2. Настраивать параметры входа на сайты для WM Keeper (см. Раздел Настройки );
    • IP — разрешает авторизацию только с разрешенных IP-адресов при включенной опции Блокировка по IP .
    • Online — разрешает авторизацию только в случае, когда WM Keeper находится в режиме Online;
    • Включать/отключать опцию пропуска вторичного шага аутентификации, если это возможно;
    • Включать и настраивать режим быстрой аутентификации, при котором авторизационный тикет запоминается браузером и может использоваться для авторизации на других сайтах;
  3. Контролировать и удалять, при необходимости, созданные на различных устройствах сохраненные в браузерах входы, а также IP-адреса для которых они являются действительными (см. Раздел Сохраненные в браузерах данные для входа );
  4. Задавать политику контроля изменения IP адреса при входе на сайты, который в частности разрешает авторизацию только с конкретных IP-адресов при включенной опции Блокировка по IP или с тех IP-адресов, которые были задействованы при входе с вторым фактором (активированных).

Для разработчиков и web-мастеров сервис дает возможность установить систему авторизации на своем сайте без подключения криптографических библиотек. Сервис позволяет задавать следующие настройки авторизации сайта:

  1. Название сайта, разрешенные способы авторизации;
  2. Адреса страниц, на которых будет производиться проверка тикета;
  3. Список активных авторизационных тикетов, а также история авторизаций на сайте;
  4. Перечень доверенных сайтов;
  5. Настройки пароля и ключа шифрования.

Сайт сервиса: https://login.wmtransfer.com

См. также
Раздел помощи на сайте WebMoney Login
Возможности WebMoney Login для посетителей сайтов
Возможности WebMoney Login для владельцев сайтов
Быстрая аутентификация
Вход с дополнительным подтверждением

Безопасный метод авторизации на PHP

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

Модель авторизации:

Клиент
    Регистрация:

  • логин (a-z0-9)
  • пароль
    Cookie:

  • уникальный идентификатор юзера
  • хэш
Сервер MySQL

Таблица users
user_id (int(11))
user_login (Varchar(30))
user_password (varchar(32))
user_hash (varchar(32))
user_ip (int(10)) по умолчанию 0

При регистрации в базу данных записывается логин пользователя и пароль(в двойном md5 шифровании)

При авторизация, сравниваеться логин и пароль, если они верны, то генерируеться случайная строка, которая хешируеться и добавляеться в БД в строку user_hash. Также записываеться IP адрес пользователя(но это у нас будет опциональным, так как кто-то сидит через Proxy, а у кого-то IP динамический… тут уже пользователь сам будет выбирать безопасность или удобство). В куки пользователя мы записываем его уникальный индетификатор и сгенерированный hash.

Почему надо хранить в куках хеш случайно сгенерированной строки, а не хеш пароля?
1. Из-за невнимательности программиста, во всей системе могут быть дырки, воспользовавшийсь этими дырками, злоумышленик может вытащить хеш пароля из БД и подставить его в свои куки, тем самым получить доступ к закрытым данным. В нашем же случае, двойной хеш пароля не чем не сможет помочь хакеру, так как расшифровать он его не сможет(теоретически это возможно, но на это он потратит не один месяц, а может быть и год) а воспользоваться этим хешем ему негде, ведь у нас при авторизации свой уникальный хеш прикрепленный к IP пользователя.

Пишем авторизацию пользователя на PHP

2. Если злоумышленик вытащит трояном у пользователя уникальный хеш, воспользовать им он также не сможет(разве если только, пользователь решил принебречь своей безопастностью и выключил привязку к IP при авторизации).

Реализация

Структура таблицы `users` в базе данных ‘testtable’

register.php

login.php

check.php

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

Автор: http://jiexaspb.habrahabr.ru/. Адаптация под PHP 5.5 и MySQL 5.7 KDG.

Куки с флагом HttpOnly не видны браузерному javascript-коду, а отправляются только на сервер. На практике у вас никогда нет необходимости получать их содержимое в javascript. А вот злоумышленнику, нашедшему XSS — а XSS так или иначе когда-нибудь где-нибудь найдется — отсутствие HttpOnly на авторизационных куках доставит много радости.

Другие примеры авторизации на PHP:

© Copyright 2008-2018 by KDG

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*