Сесии, авторизация

denver

?>Скриптер
Сесии, авторизация

Эээ.. Зря вы тему закрыли я вас скажу... Не сочтите за диггера и тормоза но я темку прочел и не нашел ответа на один момент.

Мне нужно реализовать галочку [x] remember me при логине. Не очень то это и секьюрно конечно, но очень удобно порой.

цитата из FAQа
- по факту идентификации пользователя стартует сессия и признак авторизованности передается в ней.
- Если надо "запомнить" пользователя, то ему ставится кука, его идентифицирующая.
- При следующем заходе пользователя на сайт, для того, чтобы авторизоваться, он должен либо ввести пароль, либо система сама его опознает по поставленной ранее куке
Вопрос в том что это за кука такая идентифицирующая?

Есть два варианта ответа у меня
1. Это хэш пароля
Недостатки: если кто-то украл куку он может быстро подобрать пароль по хэшу брутфорсом.
Достоинства: Зато на данном компе пользователь будет запомнен хоть навеки (всегда будет логинить, ну пока он пароль не сменит так точно)

2. Это случайный хэш который хранится также и в базе у данного юзера. Обновляется в обоих местах каждый раз при авторизации.
Недостатки: если на одном компе юзер зашел с "запоминанием" а затем зашел на другом компе то на первом его больше не "вспомнят" т.к. хэш давно ту-ту перегенерился в базе.. Зато секьюрно если еще кой-чего проверять.

Нет ли такого метода чтобы совмещал вот лучшее из вышеупомянутых:
- на компьютере где он залогинля с галочкой "помнить" его вспоминало всегда не зависимо от того логинился ли он после этого с другого компа или нет.
- либо хэш пароля не светится нигде, либо если и светится то чтобы трудно было брутфорснуть что-ли

:confused:
 

sunchess

Новичок
1 ты можешь запоминать логин и пароль в куки
2 саму сессию, те SID.

PS обычно "запомнить" работает не больше 2 недели

-~{}~ 20.06.06 22:43:

и + что - нить с ип придумать, но это детали
 

denver

?>Скриптер
1. пароль в куки не подходит, его хэш тоже.
2. сид после закрытия браузера умирает довольно быстро.
 

dr-sm

Новичок
denver
3. $uid.':'.md5($uid.$passHash), где $uid это инфа по которой ты идентифицируешь юзера (ид из базы, логин, и тп).

sunchess в пункте 2 ты бредишь.
 

denver

?>Скриптер
dr-sm
Есть ли смысл делать трюки с хэшем еще серьезнее?
Ну скажем сохранять в куках:

PHP:
md5('zhopa'.$username.$passhash)
где zhopa это только мне известное слово?
или чтобы совсем запутать следы то что-то типа такого:

PHP:
md5($username.'zhopa'.sha1($passhash)))
насколько я понимаю трудно будет найти подобрать верный пароль зная весь этот хэш и имя юзера но не зная алгоритма генерации..
Или я слишком глубоко копаю? Хочется сделать более-менее секьюрно.
 

dr-sm

Новичок
не стоит загоняться, подделать такую куку не имея доступа к базе пользователей вродебы невозможно и так. с $uid можно поколдовать например умножить на 3 и тп.
основная идея состоит в том, что ты выдаешь юзеру куку состоящую из двух частей:
в первой содержится информация о том "хто" стучится.
во второй содержится иформация о том что этот "хто" есть валидный пользователь, + инфа из первой части. и все это обрабатывается односторонним хешем.
еще можно добавить ип , если нужно привязать куку к хосту.

з.ы. используй sha вместо md5 если боишься брута. но для достаточно ценной инфы, обычно "ремембер ми" не делают ;).
 

denver

?>Скриптер
Автор оригинала: dr-sm
не стоит загоняться, подделать такую куку не имея доступа к базе пользователей вродебы невозможно
Зачем к базе... если я украл чужую куку и вижу в ней

denver:48d63002b48de7db2b95ae3b1689d6e3

и, предположим, я знаю что это хэш вида md5('denver'.md5($password))

то можно перебором найти за ночь штук 10 паролей при которых получается вышеуказанный хэш (и без подключения)
из этих 10 паролей один точно подойдет к сайту.
 

dr-sm

Новичок
если пароль больше 8 символов и состоит из букв и цифр, то однозначно нет. да и с чего ты взял, что 10 паролей? блин все слышали что в md5 есть коллизии, но ни кто почему-то не понимает, что их прямым перебором не то что встретить, найти ПРАКТИЧЕСКИ НЕВОЗМОЖНО - plain text слишком большого размера нада будет перебрать.
 

denver

?>Скриптер
Т.е. по сути подтвердилась моя первая теория.

Спасибо энивэй!
 

dr-sm

Новичок
в теории да :). но при практической реализации мне кажется целесообразным все-таки хранить связку [$uid:$someHash]:

1. легко забиндить куку для конкретного ИПа.
2. в базе не нужен индекс по pass_hash.
 

_vampiro_

Новичок
хранить связку [$uid:$someHash]
меня взломали. зашли с запоминанием. я жалуюсь админу и он меняет мне пароль... я захожу, меняю его еще раз на более сложный. Но почем-то взломщик с кукой "[$uid:$someHash]" беспроблемо логинится и гадит от моего имени! ;-) привязывать к паролю - обязательно. к ИП - желательно, но опционально отключаемо.
 

mani13

Новичок
dr-sm
К IP для запоминания между сессиями привязываться не стоит. Есть диалапщики.
 

denver

?>Скриптер
2. Это случайный хэш который хранится также и в базе у данного юзера. Обновляется в обоих местах каждый раз при авторизации.
Недостатки: если на одном компе юзер зашел с "запоминанием" а затем зашел на другом компе то на первом его больше не "вспомнят" т.к. хэш давно ту-ту перегенерился в базе.. Зато секьюрно
Хм.. перечитал еще раз топик и подумал, а ведь данный недостаток лечится добавлением IP. Т.е. хэш генерируется при авторизации и хранится в БД свой для каждого! IP с которого заходил пользователь (а можно и юзер агент еще до кучи). (при смене пароля обнулять все хэши).
Тогда в след раз как он пытается зайти система смотрит - заходил ли он ранее с этого IP, если да то проверяет стоит ли кука и соответствует ли она значению в базе (напротив данного юзера и такого IP).
Итого: в куке не хранится хэш пароля, и "вспоминает" на каждой машине с которой заходил.
Имхо секурно.
Гениально? :)
 

BubenPupen

Новичок
denver
Что делать с диалапщиками ?

_vampiro_
меня взломали. зашли с запоминанием. я жалуюсь админу и он меняет мне пароль... я захожу, меняю его еще раз на более сложный. Но почем-то взломщик с кукой "[$uid:$someHash]" беспроблемо логинится и гадит от моего имени! ;-) привязывать к паролю - обязательно. к ИП - желательно, но опционально отключаемо.
Зачем вообще нужна привязка к IP ? Можно каждый раз, когда пользователь логинится (всмысле сам, а не "через" куку) генерировать случайное число, шифровать его с md5, класть в базу и в куки. Если тебя взломали, а потом админ поменял пароль, то когда ты залогинишься с новым паролем, хэш в базе изменится, и у взломщика останется старый недействительный хэш.
 

avm

Новичок
почему хеш должен генериться именно от пароля? разве нельзя для этих целей хранить в аккаунте еще одно рандомное значение (и менять его при смене пароля)?
 

hermit_refined

Отшельник
off-topic:
Автор оригинала: BubenPupen
генерировать случайное число, шифровать его с md5, класть в базу и в куки
есть такое клише - взять число и зашифровать его с помощью md5.
применяющий его, по всей видимости, даже не догадывается, что кол-во уникальных значений таким образом ограничивается изначальным числовым диапазоном, а не всеми возможными md5-комбинациями. и что разницы - использовать число или хеш от него - нет никакой.

конечно, можно добавить соль, и менять её в каждом создаваемом проекте (проблема с уникальными значениями останется, зато подобрать будет сложнее), но для меня загадка - откуда вообще возникает мысль применить md5? неужели так нетривиально сгенерировать просто случайную строку?..
 

stalxed

Новичок
хм чесно говоря тоже интересна данная тема. думаю профи её уже давно решили эту проблему) интересно что они посоветуют?
 

BubenPupen

Новичок
hermit_refined
применяющий его, по всей видимости, даже не догадывается, что кол-во уникальных значений таким образом ограничивается изначальным числовым диапазоном, а не всеми возможными md5-комбинациями. и что разницы - использовать число или хеш от него - нет никакой.

конечно, можно добавить соль, и менять её в каждом создаваемом проекте (проблема с уникальными значениями останется, зато подобрать будет сложнее), но для меня загадка - откуда вообще возникает мысль применить md5? неужели так нетривиально сгенерировать просто случайную строку?..
Можно и не шифровать, если алгоритм генерации код сложный и не легко угадывающийся.
Если генерировать случайную строку, то всеравно остается даже очень маленький, но все-таки шанс, что такая строка может быть у кого-то еще.
Я предпочитаю что-то типа mt_rand().time()
 

Gorynych

Посетитель PHP-Клуба
denver

если Вы используете запоминание при посещении хотя бы этого форума, то найдите у себя соответствующие куки и подумайте над ними.
 
Сверху