Совместное использование ресурсов между источниками
Совместное использование ресурсов между источниками ( CORS ) — это механизм, который позволяет веб-странице получать доступ к ограниченным ресурсам с сервера в домене, отличном от домена, который обслуживал веб-страницу.
Веб-страница может свободно встраивать изображения, таблицы стилей, сценарии, iframe и видео из разных источников. Определенные «междоменные» запросы, особенно запросы Ajax , по умолчанию запрещены политикой безопасности одного и того же источника. CORS определяет способ взаимодействия браузера и сервера, чтобы определить, безопасно ли разрешить запрос между источниками. [1] Он обеспечивает больше свободы и функциональности, чем запросы с одним и тем же источником, но более безопасен, чем просто разрешение всех запросов из разных источников.
Спецификация CORS включена в документ Fetch Living Standard группы WHATWG. [2] Эта спецификация описывает, как CORS в настоящее время реализован в браузерах. [3] Более ранняя спецификация была опубликована как Рекомендация W3C . [4]
Технический обзор
[ редактировать ]Для HTTP-запросов, сделанных из JavaScript, которые невозможно выполнить с помощью тега <form>, указывающего на другой домен или содержащего заголовки, не внесенные в безопасный список, спецификация требует, чтобы браузеры «предварительно обрабатывали» запрос, запрашивая поддерживаемые методы с сервера с помощью HTTP-запроса. OPTIONS, а затем, после «одобрения» сервером, отправка фактического запроса с использованием фактического метода HTTP-запроса. Серверы также могут уведомлять клиентов о том, следует ли отправлять «учетные данные» (включая файлы cookie и данные HTTP-аутентификации) вместе с запросами. [5]
Простой пример запроса
[ редактировать ]Предположим, пользователь посещает http://www.example.com, и страница пытается выполнить запрос между источниками для получения данных с http://service.example.com. CORS-совместимый браузер попытается отправить запрос к сервису service.example.com из другого источника следующим образом.
- Браузер отправляет запрос GET с дополнительным
Origin
HTTP-заголовок на service.example.com, содержащий домен, который обслуживал родительскую страницу:Origin: 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) с подстановочным знаком, указывающим, что запросы со всех доменов разрешены:Access-Control-Allow-Origin: *
- Страница ошибки, если сервер не разрешает запрос между источниками [6]
- Запрошенные данные вместе с
Политика одинакового происхождения с подстановочными знаками подходит, когда страница или ответ API должны быть доступны для любого кода на любом сайте. свободно доступный веб-шрифт на общедоступном хостинге, таком как Google Fonts Примером может служить .
Политика одинакового происхождения с подстановочными знаками также широко и уместно используется в модели возможностей объектов , где страницы имеют неугадываемые URL-адреса и предназначены для доступа к любому, кто знает секрет. [ оригинальное исследование? ]
Значение «*» является особенным, поскольку оно не позволяет запросам на предоставление учетных данных, а это означает, что оно не позволяет отправлять HTTP-аутентификацию, клиентские SSL-сертификаты или файлы cookie в междоменном запросе. [7]
Обратите внимание, что в архитектуре 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», сторонние сайты могут выполнять привилегированные действия и получать конфиденциальную информацию.
Предполетный пример
[ редактировать ]При выполнении определенных типов междоменных запросов Ajax современные браузеры, поддерживающие CORS, инициируют дополнительный «предварительный» запрос, чтобы определить, есть ли у них разрешение на выполнение действия. Запросы между источниками предварительно обрабатываются таким образом, поскольку они могут иметь последствия для пользовательских данных.
OPTIONS / Host: service.example.com Origin: http://www.example.com Access-Control-Request-Method: PUT
Если service.example.com желает принять действие, он может ответить следующими заголовками:
Access-Control-Allow-Origin: http://www.example.com Access-Control-Allow-Methods: PUT
Затем браузер выполнит фактический запрос. Если 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+, [8] [9] Опера 15+, [8] Amazon Silk , Android 4.4+ WebView и Qt WebEngine)
- Геккон 1.9.1 (Firefox 3.5, [10] СиМонки 2.0 [11] ) и выше.
- MSHTML/Trident 6.0 (Internet Explorer 10) имеет встроенную поддержку. [12] MSHTML/Trident 4.0 и 5.0 (Internet Explorer 8 и 9) обеспечивают частичную поддержку через объект XDomainRequest. [13]
- Браузеры на базе Presto (Opera) реализуют CORS начиная с Opera 12.00. [14] и Opera Mobile 12, но не Opera Mini . [15]
- WebKit (начальная версия неизвестна, Safari 4 и выше, [16] Google Chrome 3 и выше, возможно, раньше). [17]
- Microsoft Edge Все версии. [18]
История
[ редактировать ]Поддержка перекрестного происхождения была первоначально предложена Мэттом Ошри, Брэдом Портером и Майклом Боделлом из Tellme Networks в марте 2004 года для включения в VoiceXML 2.1. [19] чтобы разрешить безопасные запросы данных между источниками браузерами VoiceXML. Этот механизм считался общим по своей природе, а не специфичным для VoiceXML, и впоследствии был выделен в ПРИМЕЧАНИЕ реализации. [20] Рабочая группа W3C по веб-приложениям при участии основных поставщиков браузеров начала оформлять ПРИМЕЧАНИЕ в рабочий проект W3C, стремясь к официальному статусу Рекомендации W3C .
В мае 2006 года был представлен первый рабочий проект W3C. [21] В марте 2009 года проект был переименован в «Обмен ресурсами между источниками». [22] а в январе 2014 года он был принят как рекомендация W3C. [23]
CORS против JSONP
[ редактировать ]CORS можно использовать как современную альтернативу шаблону JSONP . Преимущества CORS:
- Хотя JSONP поддерживает только
GET
метода запроса, CORS также поддерживает другие типы HTTP-запросов. - CORS позволяет веб-программисту использовать обычный XMLHttpRequest , который поддерживает лучшую обработку ошибок, чем JSONP.
- Хотя JSONP может вызвать проблемы с межсайтовым скриптингом (XSS) , когда внешний сайт взломан, CORS позволяет веб-сайтам вручную анализировать ответы для повышения безопасности. [1]
Основным преимуществом JSONP была его способность работать в устаревших браузерах, которые появились до поддержки CORS ( Opera Mini и Internet Explorer 9 и более ранних версий). CORS теперь поддерживается большинством современных веб-браузеров. [24]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Перейти обратно: а б «Междоменный Ajax с разделением ресурсов между источниками» . NCZОнлайн. 25 мая 2010 года . Проверено 5 июля 2012 г.
- ^ «Повысьте уровень жизни» .
- ^ «Протокол рабочей группы WebAppSec» .
- ^ «Обмен ресурсами между источниками» .
- ^ «Обмен ресурсами между источниками (CORS) — HTTP | MDN» . http://developer.mozilla.org . 10 мая 2023 г. Проверено 7 июня 2023 г.
- ^ «Ошибки CORS — HTTP | MDN» . http://developer.mozilla.org . 10 мая 2023 г. Проверено 4 июля 2023 г.
- ^ [1] . W3.org. Проверено 31 июля 2021 г.
- ^ Перейти обратно: а б «Мигните» . Блог причуд. Апрель 2013 года . Проверено 4 апреля 2013 г.
- ^ «Google идет своим путем, создавая движок рендеринга WebKit» . Арс Техника. Апрель 2013 года . Проверено 4 апреля 2013 г.
- ^ «Контроль доступа HTTP (CORS) — MDN» . Разработчик.mozilla.org. Архивировано из оригинала 27 мая 2010 г. Проверено 5 июля 2012 г.
- ^ «Геккон-МДН» . Разработчик.mozilla.org. 08.06.2012. Архивировано из оригинала 3 августа 2012 г. Проверено 5 июля 2012 г.
- ^ Тони Росс; Менеджер программы; Интернет Эксплорер (9 февраля 2012 г.). «CORS для XHR в IE10» . MSDN . Проверено 14 декабря 2012 г.
- ^ «межсайтовый xmlhttprequest с CORS» . МОЗИЛЛА . Проверено 5 сентября 2012 г.
- ^ Дэвид Хоннеффер, специалист по документации (14 июня 2012 г.). «12.00 для журнала изменений UNIX» . Опера. Архивировано из оригинала 18 июня 2012 г. Проверено 5 июля 2012 г.
- ^ Дэвид Хоннеффер, специалист по документации (23 апреля 2012 г.). «Программное обеспечение Opera: поддержка веб-спецификаций в Opera Presto 2.10» . Opera.com . Проверено 5 июля 2012 г.
- ^ 6 июля 2009 г., автор Арун Ранганатан (6 июля 2009 г.). «межсайтовый запрос xmlhttprequest с CORS ✩ Mozilla Hacks — блог веб-разработчиков» . Hacks.mozilla.org . Проверено 5 июля 2012 г.
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ «59940: Обход совместного использования ресурсов Apple Safari WebKit между источниками» . Osvdb.org. Архивировано из оригинала 19 июля 2012 г. Проверено 5 июля 2012 г.
- ^ «Руководство по разработке Microsoft Edge» . 21 декабря 2023 г.
- ^ «Расширяемый язык разметки голоса (VoiceXML) 2.1» . W3.org. 23 марта 2004 г. Проверено 5 июля 2012 г.
- ^ «Разрешение доступа на чтение к содержимому XML с использованием инструкции обработки <?access-control?> 1.0» . 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 г.
Внешние ссылки
[ редактировать ]- Fetch Living Standard (текущая спецификация для CORS)
- Настройка CORS на Apache с правильными заголовками ответов, позволяющими все выполнить [ постоянная мертвая ссылка ]
- Подробные инструкции по включению поддержки CORS на различных (веб-) серверах.
- HTML5 Rocks подробно объясняет, как работает CORS
- Онлайн-сканер неправильной конфигурации CORS. Архивировано 10 августа 2020 г. на Wayback Machine.