Совместное использование ресурсов между источниками ( CORS ) - это механизм, который позволяет запрашивать ограниченные ресурсы на веб-странице из другого домена за пределами домена, из которого был обслужен первый ресурс. [1]
Веб-страница может свободно встраивать изображения из разных источников, таблицы стилей , скрипты, фреймы и видео. [2] Определенные "междоменные" запросы, особенно запросы Ajax , по умолчанию запрещены политикой безопасности одного и того же происхождения . CORS определяет способ, которым браузер и сервер могут взаимодействовать, чтобы определить, безопасно ли разрешить запрос из разных источников. [3] Он обеспечивает большую свободу и функциональность, чем запросы с одним и тем же источником, но более безопасен, чем простое разрешение всех запросов с перекрестным происхождением.
Спецификация CORS включена как часть Fetch Living Standard WHATWG . [4] Эта спецификация описывает, как CORS в настоящее время реализован в браузерах. [5] Более ранняя спецификация была опубликована как Рекомендация W3C . [6]
Технический обзор [ править ]
Для методов запроса Ajax и HTTP, которые могут изменять данные (обычно методы HTTP, отличные от GET, или для использования POST с определенными типами MIME ), спецификация требует, чтобы браузеры выполняли предварительную проверку запроса, запрашивая поддерживаемые методы с сервера с помощью запроса HTTP OPTIONS. метод, а затем, после «утверждения» с сервера, отправка фактического запроса с фактическим методом запроса HTTP. Серверы также могут уведомлять клиентов о том, следует ли отправлять «учетные данные» (включая файлы cookie и данные HTTP-аутентификации) с запросами. [7]
Простой пример [ править ]
Предположим, пользователь посещает http://www.example.com, и страница пытается выполнить запрос из разных источников, чтобы получить данные пользователя с http://service.example.com. Браузер, совместимый с CORS, попытается сделать запрос к service.example.com из разных источников следующим образом.
- Браузер отправляет запрос GET с дополнительным
Origin
заголовком HTTP на service.example.com, содержащий домен, обслуживающий родительскую страницу:Происхождение: http://www.example.com
- Сервер 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]
См. Также [ править ]
- Политика безопасности контента
- Обмен сообщениями между документами
Ссылки [ править ]
- ^ a b c от 6 июля 2009 г., автор - Арун Ранганатан (6 июля 2009 г.). «Межсайтовый xmlhttprequest с CORS ✩ Mozilla Hacks - блог веб-разработчиков» . Hacks.mozilla.org . Проверено 5 июля 2012 .
- ^ "Политика одинакового происхождения / Доступ к сети между разными источниками" . MDN.
- ^ a b «Междоменный Ajax с совместным использованием ресурсов из разных источников» . NCZOnline . Проверено 5 июля 2012 .
- ^ "Получить уровень жизни" .
- ^ «Протокол рабочей группы WebAppSec» .
- ^ «Совместное использование ресурсов между источниками» .
- ^ "межсайтовый xmlhttprequest с CORS" . МОЦИЛЛА . Проверено 5 сентября 2012 .
- ^ Совместное использование ресурсов между источниками . W3.org. Проверено 12 апреля 2014.
- ^ a b «Мигание» . QuirksBlog. Апрель 2013 . Проверено 4 апреля 2013 года .
- ^ "Google идет своим путем, создавая механизм рендеринга WebKit" . Ars Technica. Апрель 2013 . Проверено 4 апреля 2013 года .
- ^ «Контроль доступа HTTP (CORS) - MDN» . Developer.mozilla.org. Архивировано из оригинала на 2010-05-27 . Проверено 5 июля 2012 .
- ^ "Геккон - MDN" . Developer.mozilla.org. 2012-06-08 . Проверено 5 июля 2012 .
- ^ Тони Росс; Руководитель программы; Internet Explorer (09.02.2012). «CORS для XHR в IE10» . MSDN . Проверено 14 декабря 2012 .
- ^ Дэвид Хоннеффер, специалист по документации (2012-06-14). «12.00 для журнала изменений UNIX» . Опера. Архивировано из оригинала на 2012-06-18 . Проверено 5 июля 2012 .
- ^ Дэвид Honneffer, документация специалист (2012-04-23). «Программное обеспечение Opera: поддержка веб-спецификаций в Opera Presto 2.10» . Opera.com . Проверено 5 июля 2012 .
- ^ «59940: Apple Safari WebKit Cross-Origin Resource Sharing Bypass» . Osvdb.org. Архивировано из оригинала на 2012-07-19 . Проверено 5 июля 2012 .
- ^ "Руководство разработчика Microsoft Edge" .
- ^ «Расширяемый язык разметки голоса (VoiceXML) 2.1» . W3.org. 2004-03-23 . Проверено 5 июля 2012 .
- ^ «Авторизация доступа для чтения к содержимому XML с помощью инструкции обработки 1.0 <? Access-control?>» . W3.org . Проверено 5 июля 2012 .
- ^ «Авторизация доступа для чтения к содержимому XML с помощью инструкции обработки <? Access-control?> 1.0 W3C - Рабочий проект 17 мая 2006 г.» . W3.org . Проверено 17 августа 2015 года .
- ^ «Совместное использование ресурсов между источниками - рабочий проект W3C, 17 марта 2009 г.» . W3.org . Проверено 17 августа 2015 года .
- ^ «Совместное использование ресурсов между источниками - Рекомендация W3C от 16 января 2014 г.» . W3.org . Проверено 17 августа 2015 года .
- ^ «Когда я могу использовать ... Совместное использование ресурсов Cross Origin» . caniuse.com . Проверено 12 июля 2012 .
Внешние ссылки [ править ]
- Получить уровень жизни (текущая спецификация CORS)
- Статья об управлении доступом HTTP (CORS) в MDN
- Настройка CORS на Apache с правильными заголовками ответов, позволяющими все через
- Подробная информация о том, как включить поддержку CORS на различных (веб) серверах.
- HTML5 Rocks подробно объясняет, как работает CORS
- Руководство W3C CORS для разработчиков
- Как отключить CORS в браузерах на основе WebKit для максимальной безопасности и конфиденциальности
- Онлайн-сканер неверной конфигурации CORS