Cross-origin resource sharing

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

Cross-origin resource sharing (CORS; с англ. — «совместное использование ресурсов между разными источниками») — технология современных браузеров, которая позволяет предоставить веб-странице доступ к ресурсам другого домена. До недавнего времени основным способом преодоления ограничений, наложенных в same-origin-policy относительно XSS запросов, было использование JSONP. Сам JSONP имеет неустранимое ограничение — позволяет только получение данных GET методом, то есть отправка данных через POST метод остается недоступной.

Суть технологии CORS[править | править код]

Flowchart showing Simple and Preflight XHR

Сама технология достаточно проста. Есть три домена, желающие загрузить ресурсы с сервера Z. Для того чтобы это стало возможным, веб-серверу Z, который отдает контент, достаточно указать в заголовке ответа Access-Control-Allow-Origin список доверенных доменов: A, B, C. Тогда для страниц этих доменов, ограничения принципа одинакового источника на запрашиваемые страницы, не будут действовать:

Access-Control-Allow-Origin: A, B, C

После этого страницы доменов A, B, C смогут загружать контент с сервера Z.

Для PHP это реализуется вызовом функции header():

<?php
    header("Access-Control-Allow-Origin: http://example.com");
?>

Упрощённый пример[править | править код]

Для инициации Cross-origin запроса браузер клиента добавляет в HTTP запрос Origin (домен сайта, с которого происходит запрос). Например страница http://www.a.com/page.html пытается получить данные со страницы http://www.b.com/cors.txt. В случае если браузер клиента поддерживает технологию CORS, запрос будет выглядеть так:

GET /cors.txt HTTP/1.1
Host: www.b.com
Origin: www.a.com

Если сервер www.b.com хочет разрешить получение данных с www.a.com то в ответе сервера будет присутствовать строчка:

Access-Control-Allow-Origin: http://www.a.com

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

В случае, если сервер хочет разрешить доступ любому домену, он может указать в ответе:

Access-Control-Allow-Origin: *

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

Access-Control-Allow-Origin: http://www.a.com
Access-Control-Allow-Origin: http://www.b.com
Access-Control-Allow-Origin: http://www.c.com


На практике чаще используется запись из нескольких доменов, разделенных пробелом[1]:

 Access-Control-Allow-Origin: http://www.a.com http://www.b.com http://www.c.com

Отношение CORS к JSONP[править | править код]

Технология CORS может быть использована как более современная и надёжная альтернатива JSONP, так как позволяет использовать все преимущества XMLHttpRequest, и не имеет риска инъекции, как JSONP. С другой стороны, технология CORS поддерживается только современными браузерами, а JSONP работает и в старых тоже.

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

  • Gecko 1.9.1 (Firefox 3.5[2], SeaMonkey 2.0) и выше.
  • WebKit (Safari 4 и выше[3], Google Chrome 3 и выше[4], возможно более ранние).
  • MSHTML/Trident 6.0 (Internet Explorer 10) имеет встроенную поддержку[5], MSHTML/Trident 4.0 и 5.0 (Internet Explorer 8 и 9) предоставляет частичную поддержку через XDomainRequest объект. Браузеры Internet Explorer 10 и 11, согласно имеющимся баг-репортам[6], не поддерживают CORS для интернациональных доменных имен (IDN), содержащих нелатинские символы.
  • Presto браузеры (Opera) CORS реализован в Opera 12.00[7] и Opera Mobile 12, но не в Opera Mini.

Примечания[править | править код]

  1. Cross-Origin Resource Sharing
  2. HTTP access control (CORS) — HTTP | MDN
  3. cross-site xmlhttprequest with CORS ✩ Mozilla Hacks — the Web developer blog
  4. Архивированная копия (недоступная ссылка). Дата обращения 24 февраля 2014. Архивировано 19 июля 2012 года.
  5. Tony Ross, Program Manager, Internet Explorer. CORS for XHR in IE10. MSDN (9 февраля 2012).
  6. Browser fails to recognize Access-Control-Allow-Origin if it is an IDN domain - Microsoft Edge Development (недоступная ссылка). developer.microsoft.com. Дата обращения 18 сентября 2016. Архивировано 19 сентября 2016 года.
  7. Opera: Opera 12.00 for UNIX Changelog

Литература[править | править код]

  • Monsur Hossain. CORS in Action: Creating and consuming cross-origin APIs. — Manning Publications Company, 2014. — 240 p. — ISBN 978-1-61729-182-1.
  • Mike Shema. Hacking Web Apps: Detecting and Preventing Web Application Security Problems. — Newnes, 2012. — P. 3-6. — ISBN 978-1-59749-951-4.