Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Совместное использование ресурсов между источниками ( CORS ) - это механизм, который позволяет запрашивать ограниченные ресурсы на веб-странице из другого домена за пределами домена, из которого был обслужен первый ресурс. [1]

Веб-страница может свободно встраивать изображения из разных источников, таблицы стилей , скрипты, фреймы и видео. [2] Определенные "междоменные" запросы, особенно запросы Ajax , по умолчанию запрещены политикой безопасности одного и того же происхождения . CORS определяет способ, которым браузер и сервер могут взаимодействовать, чтобы определить, безопасно ли разрешить запрос из разных источников. [3] Он обеспечивает большую свободу и функциональность, чем запросы с одним и тем же источником, но более безопасен, чем простое разрешение всех запросов с перекрестным происхождением.

Спецификация CORS включена как часть Fetch Living Standard WHATWG . [4] Эта спецификация описывает, как CORS в настоящее время реализован в браузерах. [5] Более ранняя спецификация была опубликована как Рекомендация W3C . [6]

Технический обзор [ править ]

Путь к XMLHttpRequest (XHR) через CORS.

Для методов запроса Ajax и HTTP, которые могут изменять данные (обычно методы HTTP, отличные от GET, или для использования POST с определенными типами MIME ), спецификация требует, чтобы браузеры выполняли предварительную проверку запроса, запрашивая поддерживаемые методы с сервера с помощью запроса HTTP OPTIONS. метод, а затем, после «утверждения» с сервера, отправка фактического запроса с фактическим методом запроса HTTP. Серверы также могут уведомлять клиентов о том, следует ли отправлять «учетные данные» (включая файлы cookie и данные HTTP-аутентификации) с запросами. [7]

Простой пример [ править ]

Предположим, пользователь посещает http://www.example.com, и страница пытается выполнить запрос из разных источников, чтобы получить данные пользователя с http://service.example.com. Браузер, совместимый с CORS, попытается сделать запрос к service.example.com из разных источников следующим образом.

  1. Браузер отправляет запрос GET с дополнительным Origin заголовком HTTP на service.example.com, содержащий домен, обслуживающий родительскую страницу:
    Происхождение: http://www.example.com
  2. Сервер service.example.com может ответить следующим образом:
    • Запрошенные данные вместе с Access-Control-Allow-Originзаголовком (ACAO) в его ответе, указывающем, что запросы от источника разрешены. Например, в этом случае это должно быть:
      Access-Control-Allow-Origin: http://www.example.com
    • Запрошенные данные вместе с Access-Control-Allow-Originзаголовком (ACAO) с подстановочным знаком, указывающим, что запросы со всех доменов разрешены:
      Доступ-Контроль-Разрешить-Происхождение: *
    • Страница с ошибкой, если сервер не разрешает запрос из другого источника

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

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

Значение «*» является особенным, поскольку оно не позволяет запросам предоставлять учетные данные, то есть не позволяет отправлять HTTP-аутентификацию, клиентские SSL-сертификаты или файлы cookie в междоменном запросе. [8]

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

Если сайт указывает заголовок «Access-Control-Allow-Credentials: true», сторонние сайты могут выполнять привилегированные действия и получать конфиденциальную информацию. Даже если этого не произойдет, злоумышленники могут обойти любые средства контроля доступа на основе IP-адресов, прокси через браузеры пользователей.

Пример предполетной подготовки [ править ]

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

ПАРАМЕТРЫ /Хост: service.example.comПроисхождение: http://www.example.comМетод-запроса-контроля доступа: PUT

Если service.example.com готов принять действие, он может ответить следующими заголовками:

Access-Control-Allow-Origin: http://www.example.comДоступ-Контроль-Разрешить-Методы: PUT, DELETE

Затем браузер сделает фактический запрос. Если service.example.com не принимает межсайтовые запросы от этого источника, он ответит ошибкой на запрос OPTIONS, и браузер не будет выполнять фактический запрос.

Заголовки [ править ]

Заголовки HTTP, относящиеся к CORS:

Заголовки запросов [ править ]

  • Origin
  • Access-Control-Request-Method
  • Access-Control-Request-Headers

Заголовки ответов [ править ]

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Credentials
  • Access-Control-Expose-Headers
  • Access-Control-Max-Age
  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers

Поддержка браузера [ править ]

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

  • Браузеры на основе Blink и Chromium ( Chrome 28+, [9] [10] Opera 15+, [9] Amazon Silk , Android 4.4+ WebView и Qt's WebEngine)
  • Gecko 1.9.1 (Firefox 3.5, [11] SeaMonkey 2.0 [12] ) и выше.
  • MSHTML / Trident 6.0 (Internet Explorer 10) имеет встроенную поддержку. [13] MSHTML / Trident 4.0 и 5.0 (Internet Explorer 8 и 9) обеспечивают частичную поддержку через объект XDomainRequest. [1]
  • Браузеры на основе Presto (Opera) реализуют CORS начиная с Opera 12.00 [14] и Opera Mobile 12, но не Opera Mini . [15]
  • WebKit (начальная версия неизвестна, Safari 4 и выше, [1] Google Chrome 3 и выше, возможно, ранее). [16]
  • Microsoft Edge Все версии. [17]

История [ править ]

Поддержка перекрестного происхождения была первоначально предложена Мэттом Ошри, Брэдом Портером и Майклом Боделлом из Tellme Networks в марте 2004 года для включения в VoiceXML 2.1 [18], чтобы разрешить безопасные запросы данных перекрестного происхождения от браузеров VoiceXML. Этот механизм считался общим по своей природе, а не специфическим для VoiceXML, и впоследствии был выделен в ПРИМЕЧАНИЕ по реализации. [19] Рабочая группа W3C по веб-приложениям с участием основных поставщиков браузеров приступила к оформлению ПРИМЕЧАНИЕ в рабочий проект W3C на пути к официальному статусу рекомендации W3C .

В мае 2006 года был представлен первый рабочий проект W3C. [20] В марте 2009 г. проект был переименован в «Совместное использование ресурсов между источниками» [21], а в январе 2014 г. он был принят как Рекомендация W3C. [22]

CORS против JSONP [ править ]

CORS можно использовать как современную альтернативу паттерну JSONP . Преимущества CORS:

  • Хотя JSONP поддерживает только GETметод запроса, CORS также поддерживает другие типы HTTP-запросов.
  • CORS позволяет веб-программисту использовать обычный XMLHttpRequest , который поддерживает лучшую обработку ошибок, чем JSONP.
  • В то время как JSONP может вызывать проблемы с межсайтовым скриптингом (XSS) при взломе внешнего сайта, CORS позволяет веб-сайтам вручную анализировать ответы для повышения безопасности. [3]

Основным преимуществом JSONP была его способность работать в устаревших браузерах, которые предшествовали поддержке CORS ( Opera Mini и Internet Explorer 9 и ранее). CORS теперь поддерживается большинством современных веб-браузеров. [23]

См. Также [ править ]

  • Политика безопасности контента
  • Обмен сообщениями между документами

Ссылки [ править ]

  1. ^ a b c от 6 июля 2009 г., автор - Арун Ранганатан (6 июля 2009 г.). «Межсайтовый xmlhttprequest с CORS ✩ Mozilla Hacks - блог веб-разработчиков» . Hacks.mozilla.org . Проверено 5 июля 2012 .
  2. ^ "Политика одинакового происхождения / Доступ к сети между разными источниками" . MDN.
  3. ^ a b «Междоменный Ajax с совместным использованием ресурсов из разных источников» . NCZOnline . Проверено 5 июля 2012 .
  4. ^ "Получить уровень жизни" .
  5. ^ «Протокол рабочей группы WebAppSec» .
  6. ^ «Совместное использование ресурсов между источниками» .
  7. ^ "межсайтовый xmlhttprequest с CORS" . МОЦИЛЛА . Проверено 5 сентября 2012 .
  8. ^ Совместное использование ресурсов между источниками . W3.org. Проверено 12 апреля 2014.
  9. ^ a b «Мигание» . QuirksBlog. Апрель 2013 . Проверено 4 апреля 2013 года .
  10. ^ "Google идет своим путем, создавая механизм рендеринга WebKit" . Ars Technica. Апрель 2013 . Проверено 4 апреля 2013 года .
  11. ^ «Контроль доступа HTTP (CORS) - MDN» . Developer.mozilla.org. Архивировано из оригинала на 2010-05-27 . Проверено 5 июля 2012 .
  12. ^ "Геккон - MDN" . Developer.mozilla.org. 2012-06-08 . Проверено 5 июля 2012 .
  13. ^ Тони Росс; Руководитель программы; Internet Explorer (09.02.2012). «CORS для XHR в IE10» . MSDN . Проверено 14 декабря 2012 .
  14. ^ Дэвид Хоннеффер, специалист по документации (2012-06-14). «12.00 для журнала изменений UNIX» . Опера. Архивировано из оригинала на 2012-06-18 . Проверено 5 июля 2012 .
  15. ^ Дэвид Honneffer, документация специалист (2012-04-23). «Программное обеспечение Opera: поддержка веб-спецификаций в Opera Presto 2.10» . Opera.com . Проверено 5 июля 2012 .
  16. ^ «59940: Apple Safari WebKit Cross-Origin Resource Sharing Bypass» . Osvdb.org. Архивировано из оригинала на 2012-07-19 . Проверено 5 июля 2012 .
  17. ^ "Руководство разработчика Microsoft Edge" .
  18. ^ «Расширяемый язык разметки голоса (VoiceXML) 2.1» . W3.org. 2004-03-23 . Проверено 5 июля 2012 .
  19. ^ «Авторизация доступа для чтения к содержимому XML с помощью инструкции обработки 1.0 <? Access-control?>» . W3.org . Проверено 5 июля 2012 .
  20. ^ «Авторизация доступа для чтения к содержимому XML с помощью инструкции обработки <? Access-control?> 1.0 W3C - Рабочий проект 17 мая 2006 г.» . W3.org . Проверено 17 августа 2015 года .
  21. ^ «Совместное использование ресурсов между источниками - рабочий проект W3C, 17 марта 2009 г.» . W3.org . Проверено 17 августа 2015 года .
  22. ^ «Совместное использование ресурсов между источниками - Рекомендация W3C от 16 января 2014 г.» . W3.org . Проверено 17 августа 2015 года .
  23. ^ «Когда я могу использовать ... Совместное использование ресурсов Cross Origin» . caniuse.com . Проверено 12 июля 2012 .

Внешние ссылки [ править ]

  • Получить уровень жизни (текущая спецификация CORS)
  • Статья об управлении доступом HTTP (CORS) в MDN
  • Настройка CORS на Apache с правильными заголовками ответов, позволяющими все через
  • Подробная информация о том, как включить поддержку CORS на различных (веб) серверах.
  • HTML5 Rocks подробно объясняет, как работает CORS
  • Руководство W3C CORS для разработчиков
  • Как отключить CORS в браузерах на основе WebKit для максимальной безопасности и конфиденциальности
  • Онлайн-сканер неверной конфигурации CORS