2015-06-29 2 views
1

Недавно я заметил, что приложение, с которым я консультируюсь, использует незашифрованные файлы cookie. Передний конец (Угловой) регулярно использует следующее, чтобы извлечь идентификатор пользователя:Использование зашифрованных файлов cookie и хранилища сеансов для защиты запросов

var user_id = JSON.parse($cookies.userdata).id; 

Я представляю себе сомнительный посетитель может постоянно использовать свой браузер, чтобы изменить их идентификаторы и получить доступ к ресурсам, они не должны. Это огромный красный флаг, и я мог бы использовать некоторую помощь, поддерживающую это. This looks like a solid enough guide, но я не совсем обволакивал разные части.

  1. Что именно хранится в файле cookie, если я использую клиентскую сессию Mozilla? Все, что я хочу? У меня есть API-маршруты, такие как GET /api/v1/user/:user_id, чтобы возвращать информацию о пользователе. Если файл cookie зашифрован в браузере, я потеряю возможность доступа к текущему user_id и вызову этот API. Каким будет мой план действий? Создайте прокси-сервер для этого API, который сначала будет дешифровать файл cookie, извлечь user_id и , затем позвонить GET /api/v1/user/:user_id? Маршруты API защищены функцией, которая проверяет: req.isAuthenticated() === true, если это вообще помогает.

  2. Учитывая приведенное выше, в какой момент сеанс вступает в игру? Предположим, что я храню пользовательские сессии в MongoDB. Мы знаем, что файлы cookie могут хранить только 4kb, но что, если этого достаточно? Какие данные должны содержать в файле cookie и какие данные должны храниться в сеансе пользователя?

Ваши ответы пройдут ДАЛЬНЕЙШИЙ путь к устранению некоторых концепций, которые были для меня черным ящиком.

ответ

2

Что именно хранится в файле cookie, если я использую клиентскую сессию Mozilla ? Все, что я хочу?

Да - любые значения зашифрованы и аутентифицированы, что означает, что их нельзя подделать на клиенте. В принципе, при хранении какой-либо чувствительной клиентской стороны вы хотите, чтобы данные были защищенными от несанкционированного доступа и, при необходимости, конфиденциальными. Аутентификация данных с помощью алгоритма хеширования, такого как HMAC поверх SHA-256, предотвращает несанкционированное использование, но не препятствует конечному пользователю просматривать значение. Шифрование с помощью алгоритма, такого как AES-128, также предотвращает просмотр пользователем данных.

В случае имени пользователя вы, вероятно, хотите только целостность (т. Е. Сделать его доказательством несанкционированного доступа). Это не позволит вашему пользователю изменить его, но ваши вызовы user_id все равно смогут прочитать значение. Неясно, поддерживает ли только клиентский сеанс Mozilla только аутентификацию. Вместо этого у меня возникнет соблазн использовать JSON Web Tokens, что и делает.

Учитывая приведенное выше, в какой момент сеанс вступает в игру?

Я бы использовал сеанс для хранения информации, которая не обязательна для клиента. Как вы говорите, файлы cookie имеют ограничение по размеру. Сессия имеет большее значение для больших данных, поскольку значение cookie отправляется на сервер по адресу с запросом. Если у вас есть большой объем данных, установленный в файлах cookie, вы будете снижать производительность своего сайта для тех пользователей с большими файлами cookie.

2

Постарайтесь работать над одной штукой за раз, иначе вы потеряете свой разум! :)

Клиент всегда может изменить все, что захочет на клиенте. Это не имеет значения. Сервер имеет значение. Сервер должен безопасно использовать сеансовые куки. Прочитайте OWASP.

Значение cookie сеанса не нужно зашифровывать, оно просто должно быть длинным и случайным, поэтому очень медленно и трудно угадать его. Однако соединение между браузером и сервером должно быть зашифровано (используйте HTTPS).

Если клиент имеет userId 4 и может успешно запрашивать данные из/foo/userId/5, то это плохо. Но это не имеет никакого отношения к файлам cookie и всему, что связано с Access Control на сервере.

Размер файла cookie в основном не имеет значения. Вы должны хранить как можно меньше информации в файлах cookie. Храните данные сеанса в сеансе (память веб-сервера). Храните более длительные данные в базе данных.

+1

Рекомендовать плакату также прочитать следующие уязвимости OWASP Top 10: [Нарушена аутентификация и управление сеансом] (https://www.owasp.org/index.php/Top_10_2013-A2-Broken_Authentication_and_Session_Management), [Отсутствует функциональный уровень Контроль доступа] (https://www.owasp.org/index.php/Top_10_2013-A7-Missing_Function_Level_Access_Control), [Незащищенные ссылки на прямые объекты] (https://www.owasp.org/index.php/Top_10_2013-A4- Insecure_Direct_Object_References). Я вполне уверен, что у них есть все. Защита должна быть на стороне сервера, а не на стороне клиента. – TheGreatContini

Смежные вопросы