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

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

Я не профессиональный веб-разработчик, поэтому я попытался реализовать авторизацию на сайте так, как мне пришло в голову - с помощью куки. При чем, если конкретнее, то так:
Пользователь вводит логин, пароль и если они совпадают по базе данных, то в куки записываются логин и id. Так, по значению куки['login'] сайт определяет, авторизован ли пользователь и кто это. Но, если пользователь просто поменяет значение куки (не знаю, может ли пользователь менять значение или только удалять), тогда сайт будет думать что ты уже не Ваня например, а Петя. Можно конечно записывать в куки захэшированный пароль, чтобы каждая страница проверяла соответствие куки - логин == бд.логин && пароль == бд.пароль, но я не уверен что это правильно. Или пользователь все же не имеет доступа к изменению значения куки?
  • Вопрос задан
  • 718 просмотров
Пригласить эксперта
Ответы на вопрос 3
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Есть браузерные куки $_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. Для многих сайтов, где не критична безопасность - это очень красивый, легкий и простой вариант авторизации.
Ответ написан
Ваш ответ на вопрос

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

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