Автор оригинала: FreeCodeCamp Community Member.
Алексом Надалин
Примечание. Это часть 4 серии о веб-безопасности. Часть 3 была Закрепите ваше веб-приложение с этими заголовками HTTP .
Представьте себе, что это разработчик Backend, который должен реализовать Сессии В приложении: первое, что приходит к вашему мнению, это выдать токен Клиентам и попросите их отправить этот токен своими последующими запросами. Оттуда далее вы сможете определить клиентов, основанные на токене, включенном в их запрос.
HTTP Cookies родились для стандартизации такого типа механизма через браузеры. Они не более чем способ хранить данные, отправленные сервером и отправьте его вместе с будущими запросами. Сервер отправляет cookie, которое содержит небольшие биты данных. Браузер сохраняет его и отправляет его вместе с будущими запросами на тот же сервер.
Почему мы беспокоим о печенье с точки зрения безопасности? Поскольку данные, которые они содержат, это чаще всего, чрезвычайно чувствительна. Печенье обычно используются для хранения идентификаторов сеансов или токенов доступа, святой границы злоумышленника. Как только они подвергаются воздействию или скомпрометированными, злоумышленники могут омирать пользователей или обострить свои привилегии на вашем приложении.
Обеспечение файлов cookie является одним из важнейших аспектов при реализации сеансов в Интернете. Таким образом, эта глава приведет вас к лучшему пониманию файлов cookie, как их защитить и какие альтернативы могут быть использованы.
Что за печенье?
Сервер может настроить файл cookie, используя Set-cookie
Заголовок:
HTTP/1.1 200 OkSet-Cookie: access_token=1234...
Затем клиент будет хранить эти данные и отправлять его в последующие запросы через Cookie
Заголовок:
GET / HTTP/1.1Host: example.comCookie: access_token=1234...
Обратите внимание, что серверы могут установить несколько файлов cookie одновременно:
HTTP/1.1 200 OkSet-Cookie: access_token=1234Set-Cookie: user_id=10...
И клиенты могут хранить несколько файлов cookie и отправлять их по их запросу:
GET / HTTP/1.1Host: example.comCookie: access_token=1234; user_id=10...
В дополнение к равнине ключ и ценность Файлы cookie могут нести дополнительные директивы, которые ограничивают свое время для жизни и объема.
Истекает
Определяет, когда уже истекает печенье, так что браузеры не хранятся и передают его на неопределенный срок. Чистый пример – это идентификатор сеанса, который обычно истекает через некоторое время. Эта директива выражена как дата в форме Дата:
час> ;: <минута>: <Второй> GMT
Как дата: пт, 24 авг 2018 04:33:00 GMT. Вот полный пример печенья, который истекает 1 января 2018 года:
access_token=1234;Expires=Mon, 1st Jan 2018 00:00:00 GMT
Максимальный возраст
Похож на Истекает
Директива, Макс-возраст
Указывает количество секунд до тех пор, пока печенье не должно истечь. Печенье, которое должно продлить 1 час, будет выглядеть следующее:
access_token=1234;Max-Age=3600
Домен
Эта директива определяет, на какие хосты на печенье следует отправлять. Помните, что файлы cookie обычно содержат конфиденциальные данные, поэтому важно для браузеров не терять их нерешительными хостами. Печенье с директивой Домен = Trusted.example.com
не будет отправлено вместе с запросами на любой домен, кроме Trusted.example.com
даже корневой домен example.com
Отказ Вот допустимый пример файла cookie, ограниченного определенной поддоном:
access_token=1234;Domain=trusted.example.com
Дорожка
Похож на Домен
Директива, но применяется к пути URL ( /ue/path
). Эта директива предотвращает разделяемое печенье с ненадежными путями, такими как в следующем примере:
access_token=1234;Path=/trusted/path
Сессия и постоянное печенье
Когда сервер отправляет файл cookie, не установив его Истекает
или Макс-возраст
, браузеры относятся к этому как Сессия cookie Вместо того, чтобы угадать свое время для жизни или применения забавной эвристики, браузер удаляет его, когда он выключается.
А постоянное печенье , наоборот, хранится на клиенте до тех пор, пока крайний срок установлен его Истекает
или Макс-возраст
Директивы.
Стоит отметить, что браузеры могут использовать механизм, известный как Сеанс восстановление , где сеанс cookie можно восстановить после того, как клиент выключается. Браузеры реализовали этот вид механизма для удобного позволяют пользователям возобновить сеанс после, например, сбой. Восстановление сеанса может привести к Неожиданные проблемы Если мы ожидаем сеанс cookie-файлов срок действия в течение определенного периода времени (например, мы абсолютно позитивные, сеанс не будет длиться не более 3 времени).
Из перспективы браузера восстановление сеанса является совершенно действительной функцией, так как эти файлы cookie остаются в руках клиента, без срока годности. Что делает клиент с этими файлами cookie, не влияет на сервер, который не может обнаружить, закрывается ли клиент в любой момент времени. Если клиент желает поддерживать сеансные файлы cookie навсегда, это не беспокойство для сервера. Это определенно будет сомнительная реализация, но нет ничего, что сервер может сделать с этим.
Я не думаю, что есть четкий победитель между сеансом и постоянным файлом cookie, как очень хорошо обслуживает разные цели. Однако, что я наблюдал, что Facebook, Google и подобные услуги будут использовать постоянные печенья. Из личного опыта я, как правило, всегда использую постоянные печенья, но никогда не приходилось связывать критическую информацию, такую как номер социального страхования или баланс банковского счета на сессию.
В некоторых контекстах вам может потребоваться использовать сеансные файлы cookie из-за требований соответствия. Я видел аудиторов, просимая преобразовать все постоянные печенья на сессию. Когда люди спрашивают меня ” я должен использовать x или y? ” Мой ответ “Это зависит от контекста”. Строительство гостевой книги для вашего блога несет разные разветвления безопасности, чем построение банковской системы. Как мы увидим позже в этой серии, я бы порекомендовал понять ваш контекст и попытаться построить систему, которая является закрепить достаточно : Абсолютная безопасность – утопия, как 100% SLA.
Только в хосте
Когда сервер не включает в себя Домен
Директива Печенье следует считать Только для хоста
Один, что означает, что его действительность ограничена только нынешней домен.
Это своего рода «по умолчанию» поведение из браузеров, когда они получают файл cookie, который не имеет Домен
задавать. Вы можете найти небольшой пример, который я написал на github.com/odino/wasec/tree/master/cookies Отказ Это простое веб-приложение, которое устанавливает файлы cookie на основе параметров URL, а также печатает cookies на странице, через какой-то код JavaScript:
Если вы следуете инструкциям в Readme
Вы сможете получить доступ к веб-серверу в Wasec.local: 7888 , который иллюстрирует, как Только для хоста
Печенье работает:
Если мы тогда попытаемся посетить поддомен, печенье, которые мы устанавливаем на основной домен, не будут видны - попробуйте навигацию на sub.wasec.local: 7888 :
Способ обойти это ограничение, как мы видели ранее, указать Домен
Директива печенья, то, что мы можем сделать, посетив Wasec.local: 7888/? Домен = на :
Если мы посмотрим на приложение, работающее в поддомене, мы теперь сможем увидеть файлы cookie на родительском домене, как они используют Домен = WASEC.LOCAL
, который допускает любой домен «под» Wasec.local
Для доступа к файлам файла:
В HTTP-терминах, именно так, как ответы, отправленные с сервера:
~ ᐅ curl -I http://wasec.local:7888HTTP/1.1 200 OKSet-Cookie: example=test_cookieDate: Fri, 24 Aug 2018 09:34:08 GMTConnection: keep-alive
~ ᐅ curl -I "http://wasec.local:7888/?domain=on"HTTP/1.1 200 OKSet-Cookie: example=test_cookieSet-Cookie: example_with_domain=test_domain_cookie;Domain=wasec.localDate: Fri, 24 Aug 2018 09:34:11 GMTConnection: keep-alive
Суперкообразные
Что если бы мы смогли установить печенье на домен верхнего уровня (TLD), например .com
или .org
? Это, безусловно, было бы огромной проблемой безопасности, по двум основным причинам:
- Пользовательская конфиденциальность: Каждый веб-сайт работает на этом конкретном TLD, сможет отслеживать информацию о пользователе в общем хранилище
- Утечка информации: Сервер мог по ошибке хранить чувствительный элемент данных в файле cookie, доступных для других сайтов
К счастью, TLD-куки, иначе известные как Supercookies , отключены веб-браузерами по причинам, которые я упомянул выше. Если вы попытаетесь установить Supercookie, браузер просто откажется от этого. Если мы добавим параметр супер = на
В нашем примере мы увидим, что сервер пытается установить Supercookie, а браузер игнорирует его:
Однако в сегодняшней сети есть другие способы отслеживания пользователей, Etag Отслеживание Быть примером этого. Поскольку печенье обычно связаны с отслеживанием, Эти методы часто называют суперкоками Также, хотя они не полагаются на файлы куки HTTP. Другие термины, которые могут ссылаться на тот же набор технологий и практики, являются перспективы (постоянные файлы cookie) или зомбицик (печенье, которые никогда не умирают).
Флаги печенья, которые имеют значение
До сих пор мы едва поцарапали поверхность файлов куки HTTP. Сейчас время для нас попробовать настоящий сок.
Есть 3 очень важных директива ( Безопасная
, Httponly
и Samesite
), которые следует понимать перед использованием файлов cookie, поскольку они в значительной степени влияют на то, как сохраняются и закреплены печенье.
Шифровать его или забудь
Печенье содержит очень конфиденциальную информацию. Если злоумышленники получают удостоверение личности сеанса, они могут омирать пользователей по угон их сессий Отказ
Большинство сессия угонает Атаки обычно происходят через Человек-в-середине Кто может слушать незашифрованный трафик между клиентом и сервером и украсть любую информацию, которая была обменена. Если файл cookie обменивается http, то он уязвим к атакам MITM и угона для сеанса.
Чтобы преодолеть проблему, мы можем использовать HTTPS при выдаче файлов cookie и добавить Безопасный
Флаг к этому. Это поручает браузерам никогда не отправлять файлы cookie в простых http-запросах.
Возвращаясь к нашему практическому примеру, мы можем проверить это, навигацию на https://wasec.local: 7889/? Безопасность = на Отказ Сервер устанавливает 2 дополнительных файла cookie, один с Безопасный
Флаг и один без:
Когда мы вернемся и перейдите к HTTP-версии сайта, мы можем ясно видеть, что Безопасный
Cookie недоступен на странице. Попробуйте навигацию на Wasec.local: 7888 Отказ
Мы можем четко видеть, что версия HTTPS нашего приложения настроит файл cookie, который доступен http One (The Not_secure
One), но другое cookie, помеченное как Безопасный
, нигде не видно.
Маркировка чувствительных печенья как Безопасный
это невероятно важный аспект безопасности cookie. Даже если вы обслуживаете все свои трафики через HTTPS, атакующие могут найти способ настроить простую старую страницу HTTP под вашим доменом и перенаправлять пользователей там. Если ваше печенье не Безопасный
Затем они будут иметь доступ к очень вкусной еде.
JavaScript не может коснуться этого
Как мы видели ранее в этой серии, атаки XSS позволяют вредоносному пользователю выполнять произвольный JavaScript на странице. Учитывая, что вы можете прочитать содержимое банки Cookie простым Document.cookie
Защита наших файлов печенья от недоверивого доступа JavaScript является очень важным аспектом упрочнения печенья с точки зрения безопасности.
К счастью, HTTP Spec позаботился об этом с Httponly
флаг. Используя эту директиву, мы можем поручить браузеру не делиться файлом cookie с JavaScript. Браузер затем удаляет cookie из window.cookie
Переменная, что делает невозможным доступ к файлу cookie через JavaScript.
Если мы посмотрим на пример на Wasec.local: 7888/? Httponly = On Мы можем ясно увидеть, как это работает. Браузер сохранил cookie (как видно в скриншоте devtoolss ниже), но не делятся его с JavaScript:
Затем браузер продолжит отправку файлов cookie на сервер в последующие запросы, поэтому сервер все еще может отслеживать клиент через cookie. Трюк в этом случае состоит в том, что печенье никогда не воздействует на конечный пользователь, а остается «частным» между браузером и сервером.
Httponly
Флаг помогает смягчить атаки XSS, отрицая доступ к критической информации, хранящейся в файле cookie. Используя его сложнее для злоумышленника угона сеанса.
Samesame: убийца CSRF
Последнее, но не менее важное, Samesame
Флаг, одна из последних записей в мире cookie.
Введен Google Chrome V51, этот флаг эффективно устраняет Запрос на поперечный сайт Подсказка (CSRF) из Интернета. Samesame
Является ли простым новаторским инновациями, поскольку предыдущие решения атак CSRF были либо неполными, либо слишком много бремени для владельцев сайтов.
Для того, чтобы понять Samesame
Нам сначала нужно взглянуть на уязвимость, которая нейтрализуется. CSRF - это нежелательный запрос, сделанный на сайте A до сайта B, а пользователь аутентифицируется на сайте B.
Звучит сложно? Позвольте мне перефразировать.
Предположим, что вы вошли в систему на вашем банковском сайте, который имеет механизм для передачи денег на основе HTML VES
Запрос на почту с этими параметрами и вашим сеансом Cookie, он обработает передачу. Теперь предположим, что злонамеренный веб-сайт 3-го вечеринка устанавливает HTML-форму как таковой:
Посмотрите, где это становится?
Если вы нажмете на кнопку «Отправить», умно замаскирован как привлекательный приз, 1000 долларов будет передан с вашей учетной записи. Это запрашивающий запрос на сайт - не более того, ничего меньше.
Традиционно было 2 способа избавиться от CSRF:
Происхождение
иРезервятся
Заголовки: сервер мог убедиться, что эти заголовки приходят от доверенных источников (напримерhttps://bank.com
). Недостатком этого подхода является то, что, как мы видели ранее в этой серии, ниПроисхождение
ниРезервятся
Очень надежны и могут быть «отключены» клиентом, чтобы защитить конфиденциальность пользователя.- Tokens CSRF: сервер может включать подписанный токен в форме и проверять свою действительность после отправки формы. Это, как правило, солидный подход, и это было рекомендуемая лучшая практика в течение многих лет. Недостаток токенов CSRF заключается в том, что они технические нагрузки для бэкэнда, так как вам придется интегрировать генерацию токена и проверку в вашем веб-приложении. Это может не быть сложной задачей, но более простое решение было бы более чем приветствуется.
Samesame
Печенье стремится заменить решения, упомянутые выше один раз и для всех. Когда вы пометиете файл cookie с этим флагом, вы говорите браузеру не включать файлы cookie в запросах, которые были сгенерированы различными источниками. Когда браузер инициирует запрос на ваш сервер, и файл cookie помечен как Samesame
Браузер сначала проверяет, является ли начало запроса то же самое начало, которое выпустило cookie. Если это не, браузер не будет включать в себя cookie в запросе.
Мы можем иметь практический взгляд на Samesame
С примером в github.com/odino/wasec/tree/master/cookies Отказ Когда вы просматриваете Wasec.local: 7888/? Samesite = на Сервер установит Samesame
Печенье и «регулярное» одно.
Если мы тогда посетите WASEC2.LOCAL: 7888/То же самое - форма сайта Мы увидим пример HTML-формы, которая будет вызвать запрос на поперечному сайту:
Если мы нажмем на кнопку отправки формы, мы сможем понять истинную силу этого флага. Форма будет перенаправлять нас на Wasec.local: 7888 , но нет следов Samesame
Cookie в запросе, сделанном браузером:
Не путайтесь, увидев Some_site_cookie = test
На вашем экране: Cookie производится в браузере, но он не был отправлен в сам запрос. Мы можем проверить это, просто набрав http://wasec.local: 7888/
В адресной строке:
Поскольку отправитель запроса «безопасен» (без происхождения, Get
Метод) браузер отправляет Samesame
cookie с просьбой.
Этот гениальный флаг имеет 2 варианта, LAX
и Строгий
Отказ Наш пример использует первое, так как позволяет навигацию верхнего уровня на веб-сайт, чтобы включить cookie. Когда вы пометиете куки, как Samesite = Strict
Вместо этого браузер не отправит файл cookie в любом запросе с перекрестным происхождением, включая навигацию на высшем уровне. Это означает, что если вы нажмете ссылку на сайт, который использует Строгий
Печенье, которые вы не будете войти вообще вообще. Чрезвычайно большое количество защиты, которое, с другой стороны, может удивить пользователей. LAX
Режим позволяет отправлять эти файлы cookie по запросу, используя безопасные методы (такие как Get
), создавая очень полезную смесь между безопасностью и пользователем.
Альтернативы
Чтение всего этого материала о куки и безопасности, вы можете быть соблазнены сказать: «Я действительно хочу держаться подальше от печенья!». Реальность такова, что на сегодняшний день cookie - это ваша лучшая ставка, если вы хотите реализовать какой-то механизм сеанса над http. Каждый раз, и тогда мне попросят оценить альтернативы куки, поэтому я собираюсь попытаться обобщить пару вещей, которые упоминаются очень часто:
- LocalStorage : Особенно в контексте одностраничных приложений (SPA) - иногда упоминается локальная таблица, когда обсуждается, где хранить чувствительные токены. Однако проблема с таким подходом заключается в том, что LocalStorage не предлагает какую-либо защиту от атак XSS. Если злоумышленник может выполнить простой
localstorage.getitem («токен»)
На браузере жертвы это игра.Httponly
Печенье легко преодолеть эту проблему. - Jwt : JSON Web Tookens определяет способ надежно создавать токены доступа для клиента. JWT - это спецификация, которая определяет, как будет выглядеть токен доступа и не определяет, где будет храниться токен. Другими словами, вы можете хранить JWT в файле cookie, локальной местности или даже в памяти, поэтому не имеет смысла рассматривать Jwts «альтернатива» для файлов cookie.
Что бы сделать Леброн?
Пришло время перейти от протокола HTTP и его функций, таких как файлы cookie. На протяжении всего этой серии мы были в долгом путешествии, рассеянии, почему родились куки, как они структурированы и как вы можете защитить их, применяя некоторые ограничения на их Домен
, Истекает
, Макс-возраст
и Путь
атрибуты и как другие флаги, такие как Безопасный
, Httponly
и Samesame
жизненно важны в закалении печенья.
Давайте будем двигаться вперед и попытаться понять, что мы должны делать, с точки зрения безопасности, когда мы сталкиваемся с определенной ситуацией. Следующая статья попытается предоставить консультации на основе передовой практики и прошлого опыта.
Следующая статья в этой серии представит то, что я называю « Ситуационные ».
Первоначально опубликовано в odino.org (14 сентября 2018 года). Вы можете следовать за мной на Twitter - Ранды приветствуются! ?