eugenius1997
@eugenius1997
недоПрограммист

Как сделать сайт безопасным при авторизации?

Я не профессиональный веб-разработчик, поэтому я попытался реализовать авторизацию на сайте так, как мне пришло в голову - с помощью куки. При чем, если конкретнее, то так:
Пользователь вводит логин, пароль и если они совпадают по базе данных, то в куки записываются логин и id. Так, по значению куки['login'] сайт определяет, авторизован ли пользователь и кто это. Но, если пользователь просто поменяет значение куки (не знаю, может ли пользователь менять значение или только удалять), тогда сайт будет думать что ты уже не Ваня например, а Петя. Можно конечно записывать в куки захэшированный пароль, чтобы каждая страница проверяла соответствие куки - логин == бд.логин && пароль == бд.пароль, но я не уверен что это правильно. Или пользователь все же не имеет доступа к изменению значения куки?
  • Вопрос задан
  • 283 просмотра
Пригласить эксперта
Ответы на вопрос 3
  • xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.ru
    Есть браузерные куки $_COOKIES, а есть сессионные переменные $_SESSION (ID которой хранится также в куках браузера).
    В браузере кроме ID сессии лучше ничего не хранить важного, т.к. это могут поменять без проблем.
    Все данные для сессии - нужно хранить на стороне сервера.
    Используйте установку флага сессии после успешной авторизации в PHP скрипте на стороне сервера, например, так: $_SESSION['user']=$username; и везде проверяйте наличие и наполнение данной переменной:
    if ($_SESSION['user']!="") { 
      //пользователь авторизован... 
    }
    Ответ написан
  • @fman2
    Можно хранить в куках, можно хранить в сессиях. В куках хранить ТОЛЬКО уникальный токен, который при краже перестанет работать. В сессии можно хранить что угодно, но стандартный механизм ставит время жизни сессии равным SESSION.

    Самое главное, идентификатор сессии находится в куках (PHPSESSID), многие про это забывают. И если вы увеличите время жизни сессии, то сессия == куки.
    Ответ написан
  • @Vasiliy_M
    Можно конечно записывать в куки захэшированный пароль, чтобы каждая страница проверяла соответствие куки - логин == бд.логин && пароль == бд.пароль, но я не уверен что это правильно.

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

    т.е.

    1. Пользователь вводит логин и пароль, они верны.
    2. Ставим куки:
    - ID - идентификатор пользователя
    - HASH - md5(user_password_hash + salt), где
    user_password_hash - захэшированый в базе пароль
    salt - соль

    тогда на каждой странице запрос будет вида
    SELECT * FROM `user` WHERE `id` = ID_из_куки
    далее просто сравниваем $_COOKIE['HASH'] === md5($user['user_password_hash'] . $user['salt'])

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

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

Войти через TM ID
Похожие вопросы