[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Создание безопасной сессии
Страницы: 1, 2, 3
Nogard7491
Здравствуйте.
В последнее время пытаюсь обдумать правильный и безопасный механизм создания и использования сессий, и вот в чём заключается идея:

Есть таблица users в БД, с полями: login, password, ip, user_agent, session_id

1. При аутентификации пользователь вводит свои логин и пароль, если они совпали то в таблице пользователей, у нашего пользователя обновляются поля ip и user_agent (SERVER['REMOTE_ADDR'] и SERVER['HTTP_USER_AGENT'] соответственно), а в поле session_id записывается случайный идентификатор сгенерированный через rand.

2. Создаётся сессия c 3-мя значениями ip, user_agent и session_id.

3. Теперь, чтобы проверить пользователя, нужно: считать с таблицы users данные пользователя (ip, user_agent, session_id) и если они совпали, то разрешить пользователю дальнейшие действия.
Ещё возникает мысль насолить, где ток можно + хешировать ip и user_agent.
Был бы очень признателен если б мне указали недостатки в таком подходе, и что можно добавить blink.gif
Игорь_Vasinsky
Цитата
session_id записывается случайный идентификатор сгенерированный через rand.

зачем?

session_id() и так уникальна для каждого юзера.


Цитата
3. Теперь, чтобы проверить пользователя, нужно: считать с таблицы users данные пользователя (ip, user_agent, session_id) и если они совпали, то разрешить пользователю дальнейшие действия.
Ещё возникает мысль насолить, где ток можно + хешировать ip и user_agent.
Был бы очень признателен если б мне указали недостатки в таком подходе, и что можно добавить

похоже на паранойю)

вы же авторизируете юзера - пишите его id в сессию и на основе этого id - выводите для него данные.

если нет в сессии id - get out.


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Hello
Пожалейте пользователей. Будет неудобно вводить каждый раз пароль на рабочем\домашнем ПК, телефоне или планшете.

_____________
VPS от 5$, первые 2 месяца - бесплатно.
Nogard7491
Игорь_Vasinsky
Цитата
вы же авторизируете юзера - пишите его id в сессию и на основе этого id - выводите для него данные.

А если подменят id на id админа скажем? то спокойно зайдут в админку и наворотят делов.
Теперь, что касается session_id, допустим у кого то есть возможность подменить переменные сесии, id догадаться на какое поменять ещё, а вот заменить случайно сгенерированное session_id на нужное практически нереально, что и не позволит авторизовать пользователя

Hello
Пользователь будет вводить пароль лишь один раз, далее переменные сессии будут сравниваться с переменными которые в БД
Игорь_Vasinsky
Цитата
А если подменят id на id админа скажем?

проверяй session_id() с той что юзер получил при авторизации и на каждой странице.

при авторизации

$_SESSION[id] = $id;
$_SESSION['sess_id'] = session_id();

на страницах

if($_SESSION['sess_id'] != session_id())
header("location: http://go_to_hell.com");


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Hello
Цитата (Nogard7491 @ 7.03.2013 - 15:42)
Пользователь будет вводить пароль лишь один раз

Вы сами пишите
Цитата (Nogard7491 @ 7.03.2013 - 15:05)
считать с таблицы users данные пользователя (ip, user_agent, session_id) и если они совпали, то разрешить пользователю дальнейшие действия.

На работе, дома, телефоне и планшете будут разные IP и user agent. И если я зайду с телефона то сессии на всех остальных устройствах протухнут.

_____________
VPS от 5$, первые 2 месяца - бесплатно.
killer8080
Цитата (Игорь_Vasinsky @ 7.03.2013 - 14:57)
$_SESSION['sess_id'] = session_id();

это ещё зачем? blink.gif
Цитата (Nogard7491 @ 7.03.2013 - 14:42)
допустим у кого то есть возможность подменить переменные сесии

нет у клиента такой возможности, это серверная сторона wink.gif
Игорь_Vasinsky
Цитата
это ещё зачем?

лекарство от паранойи.

вообще - это достаточно старая иноформация для параноиков - при редиректе после авторизации проверять session_id() и HTTP_REFERER - что бы быть уверенным что пользователь прошёл авторизацию с нужной страницы.

но потом стали умело пользоваться курлом - и всё это уже не важно. Но до сих пор помагают сбить жар у параноиков.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
killer8080
Цитата (Игорь_Vasinsky @ 7.03.2013 - 15:14)
лекарство от паранойи.

нет, это как раз и есть паранойя, хранить в сессии идентификатор самой сессии biggrin.gif
Игорь_Vasinsky
это таблеточка - по сравнению с тем ассортиментом лекарств которые предложил ТС laugh.gif

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Nogard7491
Игорь_Vasinsky
Цитата
проверяй session_id() с той что юзер получил при авторизации и на каждой странице.
Спасибо за совет, им и воспользуюсь, думаю не лишнее будет всё же - Паранойя или не паранойя dry.gif , а + к безопасности не лишний ph34r.gif

Hello в проекте не предполагается, что пользователь будет менять ПК, планшет, ещё какое либо устройство каждые 5 минут, чтобы авторизоваться.

Ну вроде разобрались, благодарю всех за помощь. Если есть ещё недостатки или предложения прошу отписаться.
killer8080
Цитата (Nogard7491 @ 7.03.2013 - 16:22)
проверяй session_id() с той что юзер получил при авторизации и на каждой странице. Спасибо за совет, им и воспользуюсь

бред какой то, храни user_id в сессии и всё. Какой смысл анализировать session_id? Похоже у вас глубокое непонимание принципов работы стандартного механизма сессий.
Цитата (Nogard7491 @ 7.03.2013 - 16:22)
Hello в проекте не предполагается, что пользователь будет менять ПК, планшет, ещё какое либо устройство каждые 5 минут, чтобы авторизоваться.

у меня на этом форуме открыто как минимум 5 сессий, мне, как пользователю, это удобно. Нужно правильно распределять приоритеты, между юзабилити, и безопасностью. Жертвовать удобствами нужно там , где оно оправдано, например для финансовых операций имхо.
Игорь_Vasinsky
да я уже говорил об этом в своём первом посте. не помогло.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Nogard7491
killer8080
ну хорошо убедили, буду только id пользователя хранить надеясь на то что переменные сессии нельзя подменить, и никаких проверок.

Цитата
у меня на этом форуме открыто как минимум 5 сессий, мне, как пользователю, это удобно. Нужно правильно распределять приоритеты, между юзабилити, и безопасностью. Жертвовать удобствами нужно там , где оно оправдано, например для финансовых операций имхо.

и что вы сидите под разными ip и пользуетесь разными браузерами?
я именно это и хотел ограничить.

делаю как в этой статье написано http://www.securityscripts.ru/articles/PHP...id-defense.html
killer8080
Цитата (Nogard7491 @ 7.03.2013 - 17:14)
и что вы сидите под разными ip и пользуетесь разными браузерами?

более того, с разных компьютеров smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.