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

Суть технологии CORS

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

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

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

Для 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

На практике чаще используется запись из нескольких доменов, разделенных пробелом: Access-Control-Allow-Origin: http://www.a.com http://www.b.com http://www.c.com

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

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

Примечания

Литература

Категория:Стандарты W3C Категория:AJAX