На сколько правильна реализация такой авторизации?

Всем привет! Правильна ли будет такая авторизация на сайте?
Пользователь вводит логин, пароль - при успешной проверке с данными из базы пользователю в cookies отправляется случайный набор символов и этот же набор символов сохраняется в БД в запись с id этого пользователя, а потом просто сравнивается в течение всей жизни куки с теми символами из базы.
Просто есть еще возможность авторизации через соц. сети, с ними, вроде, никак не получится по-другому
  • Вопрос задан
  • 358 просмотров
Решения вопроса 1
trevoga_su
@trevoga_su
у меня так

<?php
/**
 * Авторизация, Аутентификация и выход из системы пользователя.
 */
class Krugozor_Authorization
{
    /**
     * Авторизация на год.
     *
     * @var int
     */
    const AUTHORIZATION_ON_YEAR = 360;

    /**
     * Имя cookie с ID пользователя.
     *
     * @var string
     */
    const ID_COOKIE_NAME = 'auth_id';

    /**
     * Имя cookie с хэшем пользователя.
     *
     * @var string
     */
    const HASH_COOKIE_NAME = 'auth_hash';

    /**
     * @var Krugozor_Http_Request
     */
    protected $request;

    /**
     * @var Krugozor_Http_Response
     */
    protected $response;

    /**
     * @var Krugozor_Module_User_Mapper_User
     */
    protected $mapper;

    /**
     * @param Krugozor_Http_Request $request
     * @param Krugozor_Http_Response $response
     * @param Krugozor_Module_User_Mapper_User $mapper
     */
    public function __construct(Krugozor_Http_Request $request,
                                Krugozor_Http_Response $response,
                                Krugozor_Module_User_Mapper_User $mapper=null)
    {
        $this->request = $request;
        $this->response = $response;
        $this->mapper = $mapper;
    }

    /**
     * Ищет пользователя по логину и паролю.
     * Если пользователь найден, выставляются куки в response и возвращает true.
     * В обратном случае - false.
     *
     * @param string $login логин
     * @param string $password пароль
     * @param null|int $days время жизни куки в днях
     * @return bool
     */
    public function processAuthorization($login, $password, $days=null)
    {
        $user = $this->mapper->findByLoginPassword($login, $password);

        if ($user->getId() > 0)
        {
            $time = $days ? time() + 60 * 60 * 24 * $days : 0;

            $this->response->setcookie(self::ID_COOKIE_NAME, $user->getId(), $time, '/');
            $this->response->setcookie(
                self::HASH_COOKIE_NAME,
                md5($user->getLogin() . $user->getPassword() . Krugozor_Registry::getInstance()->SECURITY['SALT']),
                $time,
                '/'
            );

            return true;
        }

        return false;
    }

   /**
     * Аутентификация пользователя на основании данных из COOKIE.
     *
     * @param void
     * @return Krugozor_Module_User_Model_User
     */
    public function processAuthentication()
    {
        if ($this->request->getCookie(self::ID_COOKIE_NAME, 'string') &&
            $this->request->getCookie(self::HASH_COOKIE_NAME, 'string'))
        {
            $user = $this->mapper->findModelById($this->request->getCookie(self::ID_COOKIE_NAME, 'string'));

            if (is_object($user) &&
                md5($user->getLogin() . $user->getPassword() . Krugozor_Registry::getInstance()->SECURITY['SALT'])
                === $this->request->getCookie(self::HASH_COOKIE_NAME, 'string')
               )
            {
                $user->setVisitdate(new Krugozor_Type_Datetime());
                $user->setIp($_SERVER['REMOTE_ADDR']);
                $this->mapper->saveModel($user);

                return $user;
            }
            else
            {
                $this->logout();
            }
        }

        return $this->mapper->findModelById(-1);
    }

    /**
     * Уничтожает сеанс (COOKIE) текущего пользователя.
     *
     * @param void
     * @return void
     */
    public function logout()
    {
        $time = time() - 60*60*24*31;

        $this->response->setCookie(self::ID_COOKIE_NAME, '', $time, '/');
        $this->response->setCookie(self::HASH_COOKIE_NAME, '', $time, '/');
    }
}


Krugozor_Registry::getInstance()->SECURITY['SALT'] - это реестр настроек. В ключе SECURITY['SALT'] хранится т.н. "соль" - набор символов, который подмешивая в хэш мы гарантируем, что невозможно зайти на сайт тупо поставив куку из md5(логин.пароль), даже если у взломщика есть копия СУБД.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
iNickolay
@iNickolay
Ну, у вас описан вполне рабочая логика, которую используют повсеместно :)
Есть ещё сессии, но с ними тяжелее работать. Хотя если вам надо только хранить "ключ" авторизации, то сойдёт)
Ответ написан
Комментировать
@ssrdop
Если серьезный проект, то куки могут украсть плохие люди) В этом случае можно воспользоваться сессиями) Их посложнее украсть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы