Unsafe cross origin links что это

Настройка CORS в Spring Security

В целях безопасности браузер запрещает JS-скрипту одного сайта обращаться на другой сайт без специального разрешения. Разрешение это реализуется с помощью технологии CORS (Cross-Origin Resource Sharing). Рассмотрим пример.

Когда возникает проблема

Создадим простое Spring Boot приложение с единственным Rest-контроллером:

В браузере запрос http://localhost:8080/api/hello выполняется успешно:

Unsafe cross origin links что это. good in browser. Unsafe cross origin links что это фото. Unsafe cross origin links что это-good in browser. картинка Unsafe cross origin links что это. картинка good in browserВ браузере все ок.

Теперь запустим на другом порту localhost:4200 Angular-проект (статика и js), он будет выполнять ajax-запросы к нашему контроллеру.

Мы запустили Spring Boot приложение на localhost:8080, а Angular-клиент на порту localhost:4200.

Откроем в браузере localhost:4200 — откроется страница Angular-клиента, которая содержит JavaScript-код, выполняющий запрос http://localhost:8080/api/hello. В консоли мы увидим ошибку, что-то вроде:

Unsafe cross origin links что это. cors error inChrome. Unsafe cross origin links что это фото. Unsafe cross origin links что это-cors error inChrome. картинка Unsafe cross origin links что это. картинка cors error inChromeОшибка в консоли браузера

Страница, естественно, не отображается. У новичка, не знакомого с CORS-политикой браузера, возникает искушение отключить весь CORS в Spring Security. Но у нас он еще не включен. Потому что дело не в Spring Security, а в браузере. И CORS придется не отключить, а наоборот, включить. И настроить.

Включение CORS

Еще раз вернемся к ошибке:

Тут говорится, что в http-ответе на запрос http://localhost:8080/api/hello отсутствует заголовок Access-Control-Allow-Origin.

Что должно быть в http-ответе

Итак, чтобы браузер не выдавал ошибку, надо чтобы Spring Boot приложение явно указывало в http-ответе в заголовке Access-Control-Allow-Origin домен(ы), с которого разрешены запросы. То есть, чтобы не отсекать нашего клиента, запущенного на http://localhost:4200, в ответе должен содержаться такой заголовок:

Подразумевается, что Spring Boot приложение должно знать этот сайт http://localhost:4200 и давать ему разрешение на запросы с помощью вышеприведенного заголовка. Spring Boot приложение должно включать этот заголовок в ответ.

Если бы наш Angular-клиент находился на сайте myangularclient.com, то ему требовался бы соответственно такой заголовок:

А такой заголовок со звездочкой разрешит запросы всем сайтам:

Но последнее не безопасно.

Итак, займемся добавлением заголовка.

Настройка Spring Security

Для начала добавим Spring Security в проект:

Как только это сделано, включится принудительная аутентификация всех запросов по умолчанию, и при вводе в браузере запроса мы будем перенаправлены на страницу логина:

Unsafe cross origin links что это. login. Unsafe cross origin links что это фото. Unsafe cross origin links что это-login. картинка Unsafe cross origin links что это. картинка loginАвтоматически включилась аутентификация

Исправим это, разрешив все запросы для всех пользователей (наш фокус — CORS, а не аутентификация):

Теперь в браузере запрос http://localhost:8080/api/hello выполняется — возвращается hello, а вот при выполнении запроса с клиента возникает та же ошибка. Исправим ее.

Настройка CORS

Для этого реализуем еще метод addCorsMappings() интерфейса WebMvcConfigurer:

В методе мы говорим, каким сайтам по каким url и какими методами можно делать запросы к нашему приложению, запущенному на 8080.

Теперь проверим, как это работает с Angular-клиента.

Проверка

На картинке всплывающая подсказка говорит, что мы обращаемся по запросу

Запрос и ответ содержат такие заголовки (запрос смотрите внизу, а ответ вверху, важное выделено красным):

Unsafe cross origin links что это. headers. Unsafe cross origin links что это фото. Unsafe cross origin links что это-headers. картинка Unsafe cross origin links что это. картинка headersПросмотр запроса и ответа в Chrome Developer Tools, вкладка Network

Запрос

В запросе в заголовках Origin и Host содержится откуда и куда идет запрос. По ним приложение Spring Boot поймет, надо ли вообще включать в ответ заголовок Access-Control-Allow-Origin (если Origin и Host одинаковые, то не надо, проблемы в браузере в этом случае в принципе не возникнет).

Ответ

Далее наше Spring Boot приложение понимает, сайту http://localhost:4200 доступ разрешен (это мы настроили в методе addCorsMappings), так что в http-ответ оно включает такой заголовок:

Браузер видит по этому заголовку, что сайту http://localhost:4200 доступ разрешен и не зажёвывает ответ с выбросом ошибки в консоль, как это делал раньше, а передает его клиенту. Все ок.

Исходный код Spring Boot примера (без Angular-клиента) доступен на GitHub.

Настройка CORS в Spring Security: 8 комментариев

Спасибо огромное за статью!
Перерыл кучу ресурсов, перепробовал много всего и потратил много часов — и только предложенное здесь решение оказалось полноценным решением проблемы.

Да, автор этого сайта просто снимает всю головную боль! 🙂
Вопрос к автору:
Если заголовок Access-Control-Allow-Origin: * обрабатывается браузером, то как например будет идти обработка запроса любым другим Rest клиентом (например вредоносным с подделкой заголовков)? Как тогда защититься? Так же могут за кршпулить api сайта (если не включать безопасность, jwt например).

Источник

CORS для чайников: история возникновения, как устроен и оптимальные методы работы

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

В этой статье подробно разобрана история и эволюция политики одинакового источника и CORS, а также расписаны разные типы доступа между различными источниками, а также несколько оптимальных решений работы с ними.

Если вы давно хотели разобраться в CORS и вас достали постоянные ошибки, добро пожаловать под кат.

Ошибка в консоли вашего браузера

No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://example.com/

Access to fetch at ‘https://example.com’ from origin ‘http://localhost:3000’ has been blocked by CORS policy.

Я уверен, вам уже доводилось видеть похожие сообщения об ошибках в консоли вашего браузера. Если нет, не волнуйтесь, скоро увидите. Все программисты достаточно часто натыкаются на CORS-ошибки.

Эти всплывающие ошибки в процессе разработки просто раздражают. Но на самом деле, CORS — это невероятно полезный механизм в мире неправильно настроенных веб серверов, злоумышленников, орудующих в интернете и организаций, продвигающих веб-стандарты.

Но давайте-ка пойдем к истокам…

В начале был первый субресурс

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader
Верни мне мой 1993 г.

Источники & cross-origin

Источник идентифицируется следующей тройкой параметров: схема, полностью определенное имя хоста и порт. Например, и имеют разные источники: первый использует схему http, а второй https. Вдобавок, портом для http по умолчанию является 80, тогда как для https — 443. Следовательно, в данном примере 2 источника отличаются схемой и портом, тогда как хост один и тот же (example.com).

Таким образом, если хотя бы один из трех элементов у двух ресурсов отличается, то источник ресурсов также считается разным.

Если, к примеру, мы будем сравнивать источник с другими источниками, то мы получим следующие результаты:

URLРезультатПричина
Тот жеОтличается только путь
Тот жеОтличается только путь
ОтличенРазные протоколы
ОтличенОтличается порт (https:// порт является по умолчанию 443)
ОтличенРазный хост

Пример запроса между различными источниками: когда ресурс (то есть, страница) типа попробует отобразить тег из источника (заметьте, что схема поменялась!).

Слишком много опасностей запроса между различными источниками

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

Когда тег появился во Всемирной Паутине, мы тем самым открыли ящик Пандоры. Некоторое время спустя в Сети появились теги

Источник

Небезопасный cross-origin resource sharing

Что такое CORS?

CORS — это механизм безопасности, который позволяет веб-странице из одного домена обращаться к ресурсу с другим доменом (кросс-доменным запросом). Без таких функций, как CORS, веб-сайты ограничиваются доступом к ресурсам одного и того же происхождения через так называемую политику единого происхождения.

Первым шагом в понимании CORS является знание того, как работают некоторые функции безопасности веб-браузеров. По умолчанию веб-браузеры не разрешают AJAX-запросы на сайты, кроме сайта, который вы посещаете. Это называется политикой единого происхождения, и это важная часть модели веб-безопасности. Совместное использование ресурсов между разными источниками (cross-origin resource sharing) — это механизм HTML 5, который дополняет политику единого происхождения для упрощения совместного использования ресурсов домена между различными веб-приложениями.

Спецификация CORS определяет набор заголовков, которые позволяют серверу и браузеру определять, какие запросы для междоменных ресурсов (изображения, таблицы стилей, сценарии, данные и т. д.) разрешены, а какие нет. CORS является техникой для ослабления правила одного источника, позволяя JavaScript на web странице обрабатывать REST API запросы от другого источника.

По своей сути, CORS это защитная оболочка для браузера. Совместное использование ресурсов между разными источниками очень важно в современном мире сложных веб-приложений, и все браузеры поддерживают его. В частности, CORS обычно используется для междоменных AJAX запросов.

Обмен запросами

Взаимодействие ресурсов начинается с отправки GET, POST или HEAD запросу к тому или иному ресурсу на сервере. Тип содержимого POST запроса ограничен application/x-www-form-urlencoded, multipart/form-data или plaintext. Запрос включает заголовок Origin, который и указывает на происхождение клиентского кода.

Веб приложение проверяет происхождение запроса и на основании Origin либо принимает запрос, либо отвергает его. Если запрос принят, запрашиваемые сервер ответит заголовком Access-Control-Allow-Origin. Этот заголовок будет указывать клиенту с каким происхождением будет разрешен доступ. Принимая во внимание, что Access-Control-Allow-Origin соответствует Origin запроса, браузер разрешит запрос.

При запросе на site.ru/resource с site.com/some будут следующие заголовки:

Если запрос принят, запрашиваемый сервер добавляет к ответу заголовок Access-Control-Allow-Origin, содержащий домен запроса site.com.

Access-Control-Allow-Origin указывает, какие домены могут обращаться к ресурсам сайта. Например, если компания имеет домены site.ru и site.com, то ее разработчики могут использовать этот заголовок, чтобы предоставить site.com доступ к ресурсам site.ru.

Access-Control-Allow-Methods определяет, какие HTTP-запросы (GET, PUT, DELETE и т. д.) могут быть использованы для доступа к ресурсам. Этот заголовок позволяет повысить безопасность, указав какие методы действительны, когда site.com обращается к ресурсам site.ru.

Access-Control-Max-Age указывает время жизни предзапроса (также он называется «предполетным») доступности того или иного метода, после которого должен быть выполнен новый запрос на тот или иной метод.

Отказ от политики запроса из белого списка

Использование правильных заголовков, методов и доверенных доменов вроде бы не позволяет злоумышленнику вклиниться в эту цепочку обмена. На самом деле это не так. И подводит здесь коварная *.

Наиболее распространенная проблема безопасности при внедрении CORS — это отказ от проверки запроса белых списков. Зачастую разработчики устанавливают значение для Access-Control-Allow-Origin в ‘*’. Это позволяет любому домену в Интернете получать доступ к ресурсам этого сайта.

Основания проблема кроется в том, что многие компании размещают API в пределах домена, не ограничивания к нему доступ политикой «белого списка». Это порождает уязвимость.

Attack scenario

Большинство веб-приложений использует файлы cookie для отслеживания информации о сеансе. При генерации cookie ограничены определенным доменом. При каждом HTTP запросе к этому домену браузер подставлять значение cookie, созданные для этого домена. Это относится к каждому HTTP запросу — для получения изображений, страниц или AJAX-вызовов.

Что это означает на практике: при авторизации в goodsite.ru, cookie генерируются и хранятся для этого домена. Веб-приложение goodsite.ru основано на технологии SPA и содержит REST API на goodsite.ru/api для взаимодействия с помощью AJAX. Предположим, что вы просматриваете badsite.ru, будучи авторизованным на goodsite.ru. Без ограничения Access-Control-Allow-Origin по белому списку (с указанием сайта) badsite.ru может выполнить любой разрешенный аутентифицированный запрос к goodsite.ru, даже не имея прямого доступа к сессионной cookie!

Это связано с тем, что браузер автоматически привязывает файлы cookie к goodsite.ru для любых HTTP запросов в этом домене, включая AJAX запросы от badsite.ru в goodsite.ru. Таким образом атакующий может взаимодействовать даже с вашим внутренним ресурсом, недоступным в сети интернет и находящимся в корпоративной сети.

Наглядные примеры

В качестве примера приведу код OWASP Testing Guide. Уязвимое веб-приложение, с неверно настроенной политикой Access-Control-Allow-Origin.

Например, такой запрос будет показывать содержимое файла profile.php:

Т.к. отсутствует проверка URL-адреса, атакующий может добавить скрипт, который будет выполняться в контексте домена example.foo со следующим URL:

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

В качестве еще одного примера рекомендую ознакомиться с Stealing contact form data on www.hackerone.com using Marketo Forms XSS with postMessage frame-jumping and jQuery-JSONP — публичным раскрытием уязвимости, включая небольшую видео-демонстрацию.

Защитные меры

Используйте белые списки доменов. Если такой возможности нет — размещайте API вне домена — политики CORS для sub.site.ru, site.ru и даже разным портам будут различаться.

Указывайте конкретные методы обращения.

Не используйте wildcard — CORS учитывает или * или домен.

Обязательно указывайте протокол. «Access-Control-Allow-Origin: site.ru» не будет учтён, поскольку протокол отсутствует.

При использовании Access-Control-Allow-Credentials: true всегда используется Access-Control-Allow-Origin: домен — при использовании * браузер не получит ответ.

Источник

Политика общего происхождения и CORS: визуальное руководство

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Доброго времени суток, друзья!

Представляю вашему вниманию перевод статьи «CS Visualized: CORS» автора Lydia Hallie.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Отлично! Мы только что отправили запрос на сервер и получили в ответ данные в формате JSON.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Что случилось? Мы отправили точно такой же запрос, но на этот раз браузер показывает какую-то ошибку.

Мы наблюдаем CORS в действии. Почему возникла данная ошибка и что она означает?

Политика общего происхождения

Источник является другим, когда он расположен в другом (под)домене, протоколе или порте.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Круто, но зачем нужна ПОП?

Предположим, что ее не существует, и вы случайно кликаете по вирусной ссылке, которую прислала ваша тетя в Facebook. Данная ссылка перенаправляет вас на «вредоносный сайт», имеющий встроенный iframe, который загружает сайт вашего банка и успешно авторизуется там с помощью куки.

Разработчики «злого сайта» позаботились о том, чтобы он имел доступ к iframe и мог взаимодействовать с содержимым DOM сайта вашего банка для перечисления денежных средств на свой аккаунт от вашего имени.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Да уж… это серьезная проблема безопасности. Мы не хотим, чтобы кто-нибудь имел доступ к чему-либо без нашего ведома.

К счастью, существует ПОП. Эта политика ограничивает доступ к ресурсам из других источников.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Хорошо, но… как это работает?

CORS на стороне клиента

Несмотря на то, что ПОП применяется только к скриптам, браузеры «расширяют» ее до любых JavaScript-запросов: по умолчанию мы имеем доступ только к ресурсам из одного источника.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Хм, но… у нас часто возникает необходимость получить ресурсы из другого источника. Возможно, нашему фронтенду нужно обратиться к серверному прикладному интерфейсу для загрузки данных. Для безопасного получения ресурсов из других источников браузеры реализуют механизм под названием CORS.

CORS расшифровывается как Cross-Origin Resource Sharing (совместное использование ресурсов). Хотя браузеры запрещают получение ресурсов из других источников, мы можем использовать CORS для изменения этого ограничения, оставаясь при этом в безопасности.

Пользовательские агенты (браузеры) могут использовать механизм CORS для разрешения запросов между разными источниками, которые в противном случае были бы заблокированы, на основе некоторых заголовков HTTP-ответа.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Для того, чтобы браузер разрешил получение ресурсов из другого источника, в ответе сервера также должен содержаться определенный заголовок.

CORS на стороне сервера

Значение данного заголовка определяет, какие источники могут получать наши ресурсы.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Да, CORS заблокировал доступ к ресурсам.

CORS позволяет указать * в качестве значения разрешенных источников. Это означает, что ресурсы будут доступны любым источникам, так что будьте осторожны.

Access-Control-Allow-Origin — это один из многих заголовков, которые мы можем установить. Разработчик серверной части может настраивать CORS для разрешения (запрета) конкретных запросов.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

В данном случае разрешены только запросы, отправленные с помощью методов GET, POST или PUT. Другие методы, такие как PATCH или DELETE будут заблокированы.

Говоря о запросах, отправленных с помощью методов PUT, PATCH и DELETE, CORS обрабатывает их особым образом. Эти «непростые» запросы иногда называют предварительными (preflight).

Предварительные запросы

CORS работает с двумя типами запросов: простыми и предварительными. То, каким является запрос, зависит от некоторых его значений.

Запрос является простым, если он отправлен с помощью методов GET или POST и не содержит дополнительных заголовков. Любой другой запрос является предварительным.

Хорошо, но что означает предварительный запрос и зачем нужны такие запросы?

Перед отправкой фактического запроса, клиент направляет серверу предварительный запрос с информацией о фактическом запросе: о его методе, дополнительных заголовках, включая Access-Control-Request-* и т.д.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Сервер получает предварительный запрос и отправляет пустой предварительный ответ, содержащий CORS-заголовки. Браузер получает предварительный ответ и проверяет, будет ли разрешен фактический запрос.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Если да, то браузер отправляет фактический запрос и получает данные в ответ.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Если нет, CORS заблокирует предварительный запрос и фактический запрос не будет отправлен. Предварительные запросы — это отличный способ предотвратить доступ и изменение ресурсов на сервере. Это защищает сервер от потенциально нежелательных запросов из других источников.

Для уменьшения количества повторных запросов мы можем закэшировать предварительный ответ посредством добавления заголовка Access-Control-Max-Age в CORS-запрос. Это позволяет избежать повторного направления предварительного запроса.

Полномочия (credentials)

Куки, заголовки авторизации и сертификаты TLS по умолчанию устанавливаются только для запросов из одного источника. Однако у нас может возникнуть необходимость использовать эти полномочия в запросе из другого источника. Возможно, мы хотим включить в запрос куки, которые сервер может использовать для идентификации пользователя.

Если мы хотим включить куки и другие заголовки авторизации в наш запрос из другого источника, нам нужно присвоить полю withCredentials значение true в запросе и добавить заголовок Access-Control-Allow-Credentials в ответ.

Unsafe cross origin links что это. image loader. Unsafe cross origin links что это фото. Unsafe cross origin links что это-image loader. картинка Unsafe cross origin links что это. картинка image loader

Готово, теперь мы можем включать полномочия в наши запросы из другого источника.

Надеюсь, статья была вам полезной. Благодарю за внимание.

Источник

Безопасность наглядно: CORS

Unsafe cross origin links что это. 2*CKTbKehNz6QOcUAEkSNM5w. Unsafe cross origin links что это фото. Unsafe cross origin links что это-2*CKTbKehNz6QOcUAEkSNM5w. картинка Unsafe cross origin links что это. картинка 2*CKTbKehNz6QOcUAEkSNM5w

Aug 27, 2020 · 8 min read

Unsafe cross origin links что это. 0*CKNWCGMjRqT4e uv. Unsafe cross origin links что это фото. Unsafe cross origin links что это-0*CKNWCGMjRqT4e uv. картинка Unsafe cross origin links что это. картинка 0*CKNWCGMjRqT4e uv

В этой статье я не буду останавливаться на основах HTTP. Скажу лишь, что в своих примерах я использую HTTP/1.1, а не HTTP/2 — на CORS это никак не влияет.

Во фронтенде часто требуется отобразить данные, которые хранятся в другом месте. Перед этим браузер должен направить запрос серверу: клиент отправляет HTTP-запрос со всей информацией, которая нужна серверу, чтобы вернуть данные.

Unsafe cross origin links что это. 1*YcZzHhIlw QJlMey8dlENw. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*YcZzHhIlw QJlMey8dlENw. картинка Unsafe cross origin links что это. картинка 1*YcZzHhIlw QJlMey8dlENw

Unsafe cross origin links что это. 1*0NKA k4. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*0NKA k4. картинка Unsafe cross origin links что это. картинка 1*0NKA k4

Что произошло? Мы отправили такой же запрос, но на этот раз браузер выдал странную ошибку. Мы только что увидели CORS в действии. Давайте разберёмся, почему возникла эта ошибка, и что она означает.

Правило одинакового источника (Same-Origin Policy)

Ресурс считается принадлежащим к другому источнику (cross-origin), если он располагается на другом домене/поддомене, протоколе или порте.

Unsafe cross origin links что это. 1*9 c5qHZhImmawYinJBkDJg. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*9 c5qHZhImmawYinJBkDJg. картинка Unsafe cross origin links что это. картинка 1*9 c5qHZhImmawYinJBkDJg

Это, конечно, здорово, но для чего правило одинакового источника вообще существует?

Представим, что это правило не работает, а вы случайно нажали на какую-то вирусную ссылку, которую прислала ваша тётушка на Фейсбуке. Ссылка перенаправляет вас на мошеннический сайт, который с помощью фрейма загружает интерфейс сайта вашего банка и успешно залогинивает вас с помощью сохранённых куки.

Разработчики этого мошеннического сайта сделали так, чтобы он имел доступ к фрейму и мог взаимодействовать с DOM сайта вашего банка — так они смогут переводить деньги на свой счёт от вашего имени.

Unsafe cross origin links что это. 1*NWgtgPrtQneKv2Afh XJNw. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*NWgtgPrtQneKv2Afh XJNw. картинка Unsafe cross origin links что это. картинка 1*NWgtgPrtQneKv2Afh XJNw

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

К счастью, здесь приходит на помощь правило одинакового источника: оно гарантирует, что мы можем получить доступ только к ресурсам из того же самого источника.

Unsafe cross origin links что это. 1*MNhe3ThgKySQs8I1XuSAQw. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*MNhe3ThgKySQs8I1XuSAQw. картинка Unsafe cross origin links что это. картинка 1*MNhe3ThgKySQs8I1XuSAQw

Но какое отношение всё это имеет к CORS?

CORS на стороне клиента

Несмотря на то, что правило одинакового источника применяется исключительно к скриптам, браузеры распространили его и на JavaScript-запросы: по умолчанию можно получить доступ к ресурсам только из одинакового источника.

Unsafe cross origin links что это. 1*GFSFIWzD6ndsdgYd1rwE A. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*GFSFIWzD6ndsdgYd1rwE A. картинка Unsafe cross origin links что это. картинка 1*GFSFIWzD6ndsdgYd1rwE A

Но нам ведь часто нужно обращаться к ресурсам из других источников… Может, тогда фронтенду стоит взаимодействовать с API на бэкенде, чтобы загружать данные? Чтобы обеспечить безопасность запросов к другим источникам, браузеры используют механизм под названием CORS.

Аббревиатура CORS расшифровывается как Cross-Origin Resource Sharing (Технология совместного использования ресурсов между разными источниками). Несмотря на то, что браузеры не позволяют получать доступ к ресурсам из разных источников, можно использовать CORS, чтобы внести небольшие коррективы в эти ограничения и при этом быть уверенным, что доступ будет безопасным.

Пользовательские агенты (к примеру, браузеры) на основе значений определённых заголовков для CORS в HTTP-запросе могут проводить запросы к другим источникам, которые без CORS были бы заблокированы.

Когда происходит запрос к другому источнику, клиент автоматически подставляет дополнительный заголовок Origin в HTTP-запрос. Значение этого заголовка отражает источник запроса.

Unsafe cross origin links что это. 1*KNH5jryBsY8h9ksnWBlOiA. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*KNH5jryBsY8h9ksnWBlOiA. картинка Unsafe cross origin links что это. картинка 1*KNH5jryBsY8h9ksnWBlOiA

Чтобы браузер разрешил доступ к ресурсам из другого источника, он должен получить определённые заголовки в ответе от сервера, которые указывают, разрешает ли сервер запросы из других источников.

CORS на стороне сервера

Unsafe cross origin links что это. 1*2IdKp2ag8. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*2IdKp2ag8. картинка Unsafe cross origin links что это. картинка 1*2IdKp2ag8

Unsafe cross origin links что это. 1*1a4w5cC4nQTbYsagrBO0rQ. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*1a4w5cC4nQTbYsagrBO0rQ. картинка Unsafe cross origin links что это. картинка 1*1a4w5cC4nQTbYsagrBO0rQ

Да, теперь CORS выдаёт эту печально известную ошибку, которая иногда всех нас так расстраивает. Но сейчас нам понятно, какой смысл она несет.

Unsafe cross origin links что это. 1*7YU9Ds4ljJqUNLM7coZCww. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*7YU9Ds4ljJqUNLM7coZCww. картинка Unsafe cross origin links что это. картинка 1*7YU9Ds4ljJqUNLM7coZCww

Предварительные запросы

Существует два типа CORS-запросов: простые и предварительные. Тип запроса зависит от хранящихся в нём значений (не волнуйтесь, здесь не надо будет ничего запоминать).

Если интересно узнать, каким требованиям должен соответствовать запрос, чтобы называться простым, почитайте эту статью на MDN.

Но что означают и почему существуют “предварительные запросы”?

Перед отправкой текущего запроса клиент сначала генерирует предварительный запрос: в своих заголовках Access-Control-Request-* он содержит информацию о текущем запросе. Это позволяет серверу узнать метод, дополнительные заголовки и другие параметры запроса, который браузер пытается отправить.

Unsafe cross origin links что это. 1*d4z8AidGgSPXwNTGc0X4nQ. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*d4z8AidGgSPXwNTGc0X4nQ. картинка Unsafe cross origin links что это. картинка 1*d4z8AidGgSPXwNTGc0X4nQ

Сервер получает этот предварительный запрос и отправляет обратно пустой HTTP-ответ с CORS-заголовками сервера. Браузер в свою очередь получает предварительный ответ (только CORS-заголовки) и проверяет, разрешён ли HTTP-запрос.

Unsafe cross origin links что это. 1*gh KFqW1sC0JdO3hsNfDtQ. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*gh KFqW1sC0JdO3hsNfDtQ. картинка Unsafe cross origin links что это. картинка 1*gh KFqW1sC0JdO3hsNfDtQ

Если всё в порядке, браузер посылает текущий запрос на сервер, а тот в ответ присылает данные, которые мы запрашивали.

Unsafe cross origin links что это. 1*F732vkngJ1RD1I4WdRdigQ. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*F732vkngJ1RD1I4WdRdigQ. картинка Unsafe cross origin links что это. картинка 1*F732vkngJ1RD1I4WdRdigQ

Если же возникает проблема, CORS блокирует предварительный запрос, а текущий вообще уже не будет отправлен. Предварительный запрос — отличный способ уберечь нас от получения доступа или изменения ресурсов на серверах, у которых (пока что) не настроены правила CORS. Сервера защищены от потенциально нежелательных запросов из других источников.

Учётные данные

Куки, заголовки авторизации, TLS-сертификаты по умолчанию включены только в запросы из одинакового источника. Однако нам может понадобиться использовать учётные данные и в запросах из разных источников. Возможно, мы захотим включить куки в запрос, который сервер сможет использовать для идентификации пользователя.

Unsafe cross origin links что это. 1*zF8Q6Zl3o XRIZWSqlwgmw. Unsafe cross origin links что это фото. Unsafe cross origin links что это-1*zF8Q6Zl3o XRIZWSqlwgmw. картинка Unsafe cross origin links что это. картинка 1*zF8Q6Zl3o XRIZWSqlwgmw

Готово — теперь мы можем включать учётные данные в запрос из другого источника.

Думаю, мы все согласимся с тем, что появление ошибок CORS порой расстраивает, но, тем не менее, здорово, что CORS позволяет безопасно отправлять запросы из разных источников в браузере — считаю, что мы должны любить эту технологию чуточку сильнее 🙂

Разумеется, о правиле одинакового источника и CORS можно рассказать гораздо больше, но я просто не смогу уместить всё это в одной статье. К счастью, ресурсов много (к примеру, спецификация W3) — вам будет к чему обратиться, если захотите подробнее изучить эту тему.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *