Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Нужно ли сверять токен в БД?
Форумы портала PHP.SU » » HTTP и PHP » Нужно ли сверять токен в БД?

Страниц (6): [1] 2 3 4 5 6 »
 

1. Deonis - 06 Ноября, 2015 - 09:01:40 - перейти к сообщению
Приветствую, господа! У меня есть пара маленьких вопросов в плане безопасности, а точнее её усилении. После успешной аутентификации, пользователю в сессию записывается токен, который подставляется во все формы и сверяется на сервере. Есть ли смысл записывать токен в БД и при каждом запросе сверять его еще и там? Вот сижу и думаю: если на одну чашу весов положить такую дополнительную меру, а на другую - мучит БД при каждом запросе, то сто́ит ли игра свеч? Да и вообще, имеет ли смысл использовать токен после успешной авторизации, если работа ведется по SSL? Может быть достаточно просто проверять: есть сессия или нет?
2. Viper - 06 Ноября, 2015 - 09:40:11 - перейти к сообщению
Если объект сессии хранится в БД то не имеет смысла дергать каждый раз, если иначе то обязательно.
Deonis пишет:
имеет ли смысл использовать токен после успешной авторизации, если работа ведется по SSL?

А какая разница?
3. Deonis - 06 Ноября, 2015 - 10:31:32 - перейти к сообщению
Viper пишет:
А какая разница?
Я просто пытаюсь разобраться. Организация безопасности - это моё самое слабое место, т.к. я к этому практически не имел отношения (до сегодняшнего дня). Мне досталась "в наследство" CRM, с которой я пытаюсь разобраться и, по возможности, оптимизировать её. На данный момент было организовано так:
1. Если пользователь не аутентифицирован, то генерируется случайный хеш, который используется, как токен в форме логина.
2. После успешной авторизации, этот хеш записывается в БД и в сессию.
3. При любом запросе, хеш из сессии сверяется с хешем в БД. Если гуд, то пользователь авторизован и работа продолжается, если нет, то выбрасывается на страницу логина.
4. Кроме того, этот хеш используется в формах в скрытых полях. Как я понимаю - это для защиты от CSRF.

Вот я и пытаюсь разобраться: нет ли тут чего лишнего и сделано ли по уму, может можно что-то упростить, а может надо кардинально что-то поменять, если допущены грубые ошибки.
4. Viper - 06 Ноября, 2015 - 10:51:12 - перейти к сообщению
Deonis пишет:
При любом запросе, хеш из сессии сверяется с хешем в БД.
вот эту говняху лучше сократить до чего-то одного. Т.е. сессия в БД, с ней и работаем, незачем ещё писать в файл.
Deonis пишет:
Кроме того, этот хеш используется в формах в скрытых полях. Как я понимаю - это для защиты от CSRF.
всё верно.
5. Deonis - 06 Ноября, 2015 - 10:56:50 - перейти к сообщению
Viper пишет:
Т.е. сессия в БД, с ней и работаем, незачем ещё писать в файл.
Можете кидаться камнями, но не понял. )) Как сократить и как тогда проверять, что юзер залогинен? Просто что-то вроде:
Так это, вроде бы, не надёжно.
6. Viper - 06 Ноября, 2015 - 15:33:14 - перейти к сообщению
Deonis пишет:
хеш из сессии сверяется с хешем в БД
у вас оба хеша в БД?
7. Deonis - 06 Ноября, 2015 - 16:06:32 - перейти к сообщению
Viper пишет:
у вас оба хеша в БД?
Второго хеша нет. Залогинился юзер, записываем хеш в БД и этот же в сессию. Дальше, при каждом запросе, сравнивается хеш из сессии с записанным в БД.

P.S. Этот же хеш используется для защиты от CSRF в формах. Возможно, что под вторым хешем вы поняли это и как раз, возможно, что это лишнее?
8. DeepVarvar - 06 Ноября, 2015 - 16:31:20 - перейти к сообщению
Deonis пишет:
аутентификации
Аутентичненько, однако..
Deonis пишет:
смысл записывать токен в БД
Зависит от того пишешь ли ты в БД и сессии, не?
Deonis пишет:
работа ведется по SSL
А завтра резко перестанет, и останешься без штанов с голыми помидорами.
Deonis пишет:
есть сессия или нет
Ну вот нет её, и как гостю капчу вводить без сессии?
Deonis пишет:
генерируется случайный хеш, который используется, как токен в форме логина
Шинель заправленая в трусы.
Deonis пишет:
После успешной авторизации, этот хеш записывается в БД и в сессию
А сессия не в БД? Значит шинель заправленая в трусы.
Deonis пишет:
При любом запросе, хеш из сессии сверяется с хешем в БД
А хеш из БД достается по еще одному хешу из сессии? Ну шинель же, заправленая в трусы.
Deonis пишет:
Если гуд, то пользователь авторизован и работа продолжается, если нет, то выбрасывается на страницу логина
Так это же сессионная кука, и она не меняется достаточно длительное время.
Deonis пишет:
этот хеш используется в формах в скрытых полях. Как я понимаю - это для защиты от CSRF
Шинель заправленая в трусы только ради успокоения но не защиты от CSRF.
Viper пишет:
всё верно
..., шинель заправленая в трусы.
Deonis пишет:
Так это, вроде бы, не надёжно
Т.е. по твоему тру, иногда, может стать не тру?
Deonis пишет:
Дальше, при каждом запросе, сравнивается хеш из сессии с записанным в БД
Хайлоад грядёт! Закупи яйцы куриные про запас. Скоро будет на чем жарить.
9. Deonis - 06 Ноября, 2015 - 16:59:02 - перейти к сообщению
DeepVarvar пишет:
[много букав]
Хоть бы что-то по существу... Я же писал, что разработка не моя. А вот я пытаюсь понять, как привести её в божеский вид.
10. DeepVarvar - 06 Ноября, 2015 - 19:03:01 - перейти к сообщению
Букав много?
А если объяснять по существу, то, столько же этих букав станет?
Deonis пишет:
что разработка не моя
И как это тебя оправдывает? Работа то -- твоя.

Краткий список задач по пунктам тебя устроит?
11. Deonis - 06 Ноября, 2015 - 19:33:53 - перейти к сообщению
DeepVarvar пишет:
Краткий список задач по пунктам тебя устроит?
Устроит.

P.S. Впрочем, забудьте. А то у меня создается ощущение, что я клянчу.
DeepVarvar пишет:
И как это тебя оправдывает?
Я не ищу оправданий, т.к. они мне не нужны. Я объяснял ситуацию и не более того.
DeepVarvar пишет:
Работа то -- твоя.
Естественно! Поэтому я и не просил, чтоб кто-то делал её за меня. Вы видели где-то в моем вопросе что-то вроде кода, с просьбой поправить его? Вопрос риторический. А если вы считаете, что делиться личным опытом или указывать на какие-то конкретные ошибки с конструктивным пояснением - это приравнивается к "сделайте за меня", то пардоньте, что потревожил.
12. teddy - 06 Ноября, 2015 - 20:40:50 - перейти к сообщению
Deonis пишет:
Есть ли смысл записывать токен в БД и при каждом запросе сверять его еще и там?

Нет. В двойной сверке с данными, которые хранятся на сервере, нет необходимости.
Deonis пишет:
Да и вообще, имеет ли смысл использовать токен после успешной авторизации, если работа ведется по SSL?

Задача - обезопасить себя от CSRF атак, поэтому нужно задействовать более подходящий для задачи механизм, то есть токены. Желательно одноразовые.
Deonis пишет:
Может быть достаточно просто проверять: есть сессия или нет?

Если речь о CSRF, то не достаточно. Нужно обязательно сверять токен отправленный клиентом и тот, что хранится на сервере. Ну а если токен от клиента не пришел, то такой запрос можно считать не валидным.
Deonis пишет:
$_SESSION['login'] === true;
Так это, вроде бы, не надёжно.

Лучше проверить например на isset, потому что данного ключа может просто не существовать.
Если нужно проверить на наличие ключа + сверить значение этого ключа, то действуем соответственно.
13. Deonis - 07 Ноября, 2015 - 02:00:49 - перейти к сообщению
teddy пишет:
В двойной сверке с данными, которые хранятся на сервере, нет необходимости.
обезопасить себя от CSRF атак.... токены. Желательно одноразовые.
Спасибо, понял.
teddy пишет:

Deonis пишет:

$_SESSION['login'] === true;
Так это, вроде бы, не надёжно.

Лучше проверить например на isset, потому что данного ключа может просто не существовать.
Тут я засомневался немного в другом ключе, в плане идентификации пользователя, который работает в данной сессии. Наверно, это уже относится к XSS, но если украсть сессию, то обычное булевое значение, указывающее на то, что юзер залогинен, даст полный доступ ко всем его данным. Хотя, это рассуждения с дилетантской точки зрения.
Но в целом, спасибо за советы.
14. DeepVarvar - 07 Ноября, 2015 - 03:24:36 - перейти к сообщению
teddy пишет:
проверить например на isset, потому что данного ключа может просто не существовать
Не надо нам тут гвозди забивать двуручной пилой.

Deonis пишет:
Устроит


1) Перенести хранение сессии в БД, полностью и чтоб она только там была.

2) Стартовать сессию (ага, к БД не забудь подключиться) всегда, вне зависимости от того кто это, гость или пользак.
И если гость -- формировать идентичный профилю пользака объект, с пометкой что это гостевая роль.

3) Перевести все, требующие защиты от CSRF места, на POST/PUT/DELETE запросы.
После чего не использовать CSRF-токен вообще.

Только учти что эти три пункта легко могут обеспечить тебя гемором на пол года вперед.
Поэтому определись:

а) готов ли ты к долгоделу?
б) готов ли ты велосипедить?
в) может лучше взять серьезный фреймворк? там все это есть
г) может оставить все как есть?
15. Мелкий - 07 Ноября, 2015 - 08:31:44 - перейти к сообщению
DeepVarvar пишет:
Перевести все, требующие защиты от CSRF места, на POST/PUT/DELETE запросы.
После чего не использовать CSRF-токен вообще.

Не понял

Так, видимо, эту тему всё-таки надо прочитать и понаписать текста.
(Добавление)
Deonis пишет:
пользователю в сессию записывается токен, который подставляется во все формы и сверяется на сервере. Есть ли смысл записывать токен в БД и при каждом запросе сверять его еще и там?

Давайте начнём с проверки понимания: зачем этот токен делается? Без него же проще.

Идея ответа верна - защита от CSRF. Но зачем он делается?
Отдельный вопрос DeepVarvar'у: если на подконтрольную тебе страницу пришёл пользователь, какая тебе проблема попросить браузер пользователя сделать не GET-запрос на атакуемую страницу, а тот же POST?
Собственно идея: GET должен только читать данные. Обработка GET не должна менять состояние мира. Если это выполняется - то GET-запросы от CSRF защиты не требуют.
А вот запросы на изменение данных - требуют.

Возвращаясь к сути CSRF. Вектор атаки в том, что пользователь авторизован у вас, но свободно гуляет по интернету с этого же браузера. Случайно попадает на совершенно посторонний сайт (злоумышленника или хороший сайт, но скомпрометированный), на котором размещён код, который заставляет браузер пользователя выполнить запрос на ваш сервер. Браузер послушно лезет на ваш сервер, любезно подставляет авторизационные куки, и ваш сайт, считая что пользователь зашёл сам, выполняет этот запрос. Готово, пользователь того не хотел и обычно даже не заметил, а что-то нехорошее произошло.
Ну и нафига тут БД?
К слову про SSL - в вопросе CSRF ничем не отличается от HTTP. Даже не требует атакующему быть HTTPS - запрос из HTTP на HTTPS считается безопасным и не даёт предупреждений пользователю, в отличии от обратного.

Deonis пишет:
Так это, вроде бы, не надёжно.

Надёжно. Если перехватят куку - то дублирование токена в базе ничего не заметит. А других методов подменить файл сессии нет. Ну кроме прямого доступа к серверу.
Таким образом вы лишь мешаете авторизоваться с двух машин. Например, со смартфона и десктопа одного и того же человека.

Deonis пишет:
но если украсть сессию

То чуть менее чем весь мир у ваших ног. Потому что куки - единственный метод отличить одного пользователя от другого, предоставляемый нам протоколом HTTP.
И HTTPS этой угрозе хорошо мешает. Только вот там тоже не всё так просто. SSL уязвим и использовать его уже нельзя (любой версии). Использовать надо TLS и ещё сколько-то гаек покрутить в области допустимых ciphers
Если параноить, то можно поверх немного прикрутить. Например, поведенческие факторы: если пользователь час назад заходил из Москвы, и тут вдруг из Китая - возможно, что-то не так. Но это мог быть просто VPN. Если вы не банк и у вас нет чемодана денег на разработку - то сессионной куки достаточно.

 

Powered by ExBB FM 1.0 RC1