В общем я задумал писать авторизацию. Написал в общем-то, но вот такой вопрос встал у меня.
Я делаю так: у меня 2 таблицы в базе, одна users, вторая session. Для пользователей и для сессий соответственно. В таблице session хранятся session_id, user_id, и прочая лабуда. Как только юзер логинится, ему пишется сессия, и так-же она пишется в базу. Собственно по этой сессии мы и узнаём юзера, а благодаря таблице sessions не храним в куках пароль.
Но чую я что-то упускаю. Ведь сессию могут подменить. Как быть? Что делать? Посоветуй.
Всё можно подменить, если вы ЭЦП не используете. Если боитесь подбора чужого session ID — то нужно этот самый ID сделать длинным, 64 байта например. Если основные опасения — что у пользователя уведут куки с его session ID, то проверяйте user-agent, разрешение экрана, версию flash.
>Собственно по этой сессии мы и узнаём юзера, а благодаря таблице sessions не храним в куках пароль.
>Ведь сессию могут подменить.
Не важно, хранить ты в куке пароль или нет PHP все равно сопоставляет сессию с кукой (по дефолту PHPSESSID). Если ты смог узнать значение этой куки, ты можешь получить сессию тебе не принадлежащую.
Второй аспект наверное в бессмысленности записи данных сессии в базу без изменения механизма сессий.
хранить в куках пароль, даже в MD5/SHA1 — это самоубийство. Взломают за час.
привязываться к IP не нужно, ибо сейчас куча вай фай устройств. Если привязываться к IP будет слетать авторизация.
Все что угодно можно подменить. Советую не быть крайне параноиком в этом плане.
Товарищи выше дают крайне полезный совет. Браузер + IP. В другом браузере все равно заново логиниться, а чтобы проще это распознавать, то используйте хэш. md5([browser].[IP])
Почему бы не посмотреть как сделано в vbulletin, invision или просто какой-нибудь хорошей CMS? Задача авторизации это реально такой баянистый велосипед… заодно подсмотрите всякие интересные штуки типа индивидуальной соли паролей, логин с запоминанием или без, серверную авторизацию как опцию и http only печеньки и прочее и прочее.
Лучше всего вам разобраться как например сделаны сессии в том же PHP по умолчанию. Касательно вопроса (session_id хранится в куках, его можно подменить) — а вы делайте этоот session_id из 32-64 букв, знаков и цифр. Подменить-то такой ид можно, но сначала надо его подобрать, а это годы работу суперкомпьюетров.
По умолчанию session_id — это 32 символьный хеш. У него 37^32 вариантов, как у md5 хеша.
На подбор такой строки при попытке подменить cookie 100 раз в секунду, уйдет у одного компа 5*10^40 лет. Это в худшем случае.
Единственное, что действительно может случиться, так это XSS, когда кто-то выкрадет cookie и пропишет их себе.Поэтому необходимо хешировать что-то «уникальное» для пользователя. Что-то вроде IP, браузера и пользовательского хеша.