Эта тема на forum.dklab.ru


mr.SPD: Session, Cookies, Галочка с запомнить
Вопрос следующий. На большинстве сайтов есть форма авторизации, которая работает на сессиях. Естественно при вводе логина и пароля, после нажатия кнопки "Вход" пользователю присваивается SID. Это понятно, пользователь ходит по сайту и остается залогиненным. Но в формах авторизации иногда встречается галочка "Запомнить". Ставишь галочку, жмешь "Сабмит" - пользователю присваивается SID плюс дописывается cookies с его логином. В следующий раз когда заходишь на сайт в форме уже вбит логин и пароль.

Как я понимаю, при заходе на сайт проверяется наличие cookies, берется из него логин, по логину смотрим в базе пароль и вставляем в форму?

Теперь вопросы по безопасности:
1) Поле с паролем типа password, т.е. заглянув в атрибут value - можно явным образом увидеть пароль?
2) Подделка cookies, с логином любого существующего пользователя в базе таким образом даёт доступ к его профилю?

По-моему всё это слишком просто, потому закралось сомнение, что принцип работы немного не такой. Как это всё работает-то поясните кто-нибудь?
Iced:
По порядку:
SID - это идентификатор сессии
По-хорошему, он присваивается пользователю (читай браузеру) как только он попал на сайт (загрузил с него первую страницу). Причём не важно даже залогинен он в какую-нить "member area" или нет. А когда пользователь вводит логин с паролем, чтобы попасть в эту самую "member area", то ему в сессию "записывается" его логин (лучше даже его числовой идентификатор из таблицы users, например, для обезличивания информации).
Причём, важно чётко себе понимать, что всё, что записывается в сессию хранится на стороне сервера, а у пользователя (браузера) остаётся только шестнадцатиричный (да даже и не важно какой он) идентификатор, опять же который никакой информации не несёт, а служит лишь для того, чтобы сервер мог различить пользователей одновременно лазящих по сайту.
mr.SPD:
Это понятно. Да и сессию не обязательно начинать сразу при заходе на сайт, можно и после того, как пользователь в member area попадает...
Мне больше интересно, как галочка "Запомнить" работает?
Iced:
По-поводу галки "запомнить" - полная аналогия. Я потому это всё и писал, чтобы понятней было :)
Генерируйте какой-нить хэш подлиннее (без фанатизма :) ), записывайте его в ту же таблицу users и устанавливайте через set_cookie(). А перед выдачей страницы пользователю проверяйте.
Одно время находил было несколько проектов, которые в cookies хранили id пользователя. Менял на другое число и заходил под чужим логином. Это же не гуд? :)
Iced:
НО! Ещё одно большое НО!
Ниразу не видел чтобы появлялась форма с заполненным логином и паролем... Вы правильно сказали, что чтобы она правильно сработала нужно чтобы в HTML'е был прописан пароль, который можно просмотреть... Кстати, пароль - это личная информация пользователя и, впринципе, даже админ сайта не имеет право его знать, поэтому пароль лучше хранить в зашифрованном виде.
Таким образом, если пользователь при вводе логина с паролем поставил галку "запомнить", то просто эта форма ему больше никогда может не показываться, а просто сразу ему предоставляется возможность лазить по member area.
А то, что видели вы (заполненные логин и пароль), это наверняка возможности браузера (Auto-Completion), или какой-нить RoboForm...
Iced:
Да, и забыл ещё добавить, что в этом случае ещё стОит предусмотреть возможность logoff'а. Т.е. чтобы, если вдруг пользователь захотел отказаться от услуг по запоминания его или на случай прихода другого пользователя, чтобы не надо было пользователю грохать все Cookies браузера и т.п.
Anonymous:
Чего-то я затупил действительно. Хорошо в форму ничего не вставляется...

Тогда, назревает вопрос. Когда вводишь в форму логин и пароль, пароль не зашифрован, и следовательно при авторизации он шифруется и сравнивается с зашифрованным паролем в базе. А если поставить галку "запомнить" пароль будет хранится в cookies - но не в открытом же виде? Т.е. принцип сравнения (введенного пароля и пароля в базе) и (пароля в cookies и пароля в базе) будет различный??!
Iced:
Нет-нет-нет!
Давай тогда на примере...
Я пользователь Iced, мой пароль 123456.
У тебя в БД в таблице users есть запись:
(id=567, username="Iced", password="0123456789ABCDEF", hash="") пусть мой пароль в зашифрованном виде выглядит как 0123456789ABCDEF
Намана? :)
Когда я попадаю первый раз на твой сайт, то он пусть в каталог /tmp пишет файлик sess_f3asiusq5sa1btagoonql2hh63, а моему браузеру говорит установить Cookies: PHPSESSID=f3asiusq5sa1btagoonql2hh63
Мой браузер его запоминает и при каждом обращению к серверу его передаёт.
Я в форме заполняю свой юзернейм и пароль и ставлю галку "запомнить".
Сервер, принимая запрос, ищет в БД пользователя Iced с зашифрованным паролем 0123456789ABCDEF (который был получен из моего 123456, пришедшего вот буквально только что вместе с логином Iced) и находит.
Далее пишет в поле hash любую последовательность символов, уникальную для всех пользователей сайта:
(id=567, username="Iced", password="0123456789ABCDEF", hash="AABBCCDDEEFFGGHH")
и говорит браузеру запомнить AABBCCDDEEFFGGHH в cookies.
также в сессию пишется мой id из таблицы users, в результате мой id помещается в файл sess_f3asiusq5sa1btagoonql2hh63.
Теперь, когда я хожу по ссылкам сервера, он сначала проверяет на наличие меня в сессии. Если находит, то считывает мой идентификатор, а по нему выбирает из users все мои данные. Если не находит, то смотрит что у меня в куки. Проверяет в users есть ли такое значение в поле hash. Если есть, то пользователь определён. Если нет, то зашёл новый пользователь.
Фух... Надеюсь хоть более-менее доходчиво...
Почитайте раздел sessions мануала PHP, думаю многое станет ясно :)
mr.SPD:
Чего сегодня не мой день...

Сессия стартует так...

session_start();


После этого, у пользователя в куках пишется переменная типа $PHPSESSID, которая из себя представляет набор символов.
После закрытия браузера, у пользователя этот $PHPSESSID исчезает, верно?

Насчет галки понятно. Ставим галку, пишем в базу хэш. При заходе на сайт, смотрим есть ли в куках этот хэш, смотрим его в базе, получаем ID юзера. Так? А далее, сессию то стартовать нужно?
Iced:
Всё верно! :)
session_start();
Она много из того, что я описал по шагам, делает автоматически. :) Просто поэкспериментируйте сначала прочитав мануал по сессиям :)
И после этого можно обращаться к массиву $_SESSION.
mr.SPD:
На данный момент авторизация организована у меня следующим образом.

На всех страницах вначале до вывода есть, session_start()

Вводим данные в форму, сверяем данные в базе. В базе хранится логин и пароль (причем пароль зашифрован в виде md5(login_password)).
Если все данные совпадают - то стартует сессия, а в массиве задается значение $_SESSION = true;

После чего, на страницах идет разделение, что показывать, что не показывать зарегистрированным, ну т.е.:

if($_SESSION[auth]){ echo "То что должен увидеть зарегистрированный";}
if(!$_SESSION[auth]){ echo "То что увидит незарегистрированный";}

Домой приду, буду решать вопрос с великой и могучей галочкой :)
Iced:
На всех страницах вначале до вывода есть, session_start()
Если все данные совпадают - то стартует сессия, а в массиве задается значение $_SESSION = true;
Что значит тогда "стартует сессия"?! :)
И если $_SESSION = true, то как вы тогда идентифицируете пользователя? Или это не нужно? :)
Anonymous:
Что значит тогда "стартует сессия"?! :)
Ну да, как-то некорректно выразился :)

И если $_SESSION = true, то как вы тогда идентифицируете пользователя? Или это не нужно? :)
Нет, не дописал. Если все совпадает-то в массив добавляются значения $_SESSION и $_SESSION, ну и все необходимые для работы данные из базы о пользователе

Эта тема на forum.dklab.ru