Cross-origin resource sharing

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

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

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

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

Access-Control-Allow-Origin: http://example.com

Тогда страницы с серверов A, B, C смогут загружать контент с сервера example.com.

Для 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 4.0 (Internet Explorer 8) предоставляет частичную поддержку через XDomainRequest объект.
  • Presto браузеры (Opera) CORS реализован в Opera 12.00[5] и 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. http://osvdb.org/59940
  5. Opera: Opera 12.00 for UNIX Changelog