Инструменты пользователя

Инструменты сайта


php:cors

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
php:cors [2023/09/12 11:05]
werwolf создано
php:cors [2023/09/12 11:12] (текущий)
werwolf [Соотношение CORS и JSONP Править]
Строка 1: Строка 1:
-=====   Суть технологии CORS Править ​=====+======Cross-origin resource sharing======
  
- ​[[:​wiki:​%D0%A4%D0%B0%D0%B9%D0%BB:​Flowchart_showing_Simple_and_Preflight_XHR|{{::​upload.wikimedia.org:​wikipedia:​commons:​thumb:​c:​ca:​Flowchart_showing_Simple_and_Preflight_XHR.svg:​220px-Flowchart_showing_Simple_and_Preflight_XHR.svg.png?​220x116}}]] [[:​wiki:​%D0%A4%D0%B0%D0%B9%D0%BB:​Flowchart_showing_Simple_and_Preflight_XHR|{{::​upload.wikimedia.org:​wikipedia:​commons:​thumb:​c:​ca:​Flowchart_showing_Simple_and_Preflight_XHR.svg:​220px-Flowchart_showing_Simple_and_Preflight_XHR.svg.png?​220x116}}]]Есть три [[:​wiki:​%D0%94%D0%BE%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BC%D1%8F|домена]], позволяющие загрузить ​ресурсы с сервера ​U. Для ​того, чтобы это стало возможным, [[:​wiki:​%D0%92%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80|веберверу]] U, который отдает [[:​wiki:​%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F|контент]],​ достаточно указать ​в заголовке ответа Access-Control-Allow-Origin список доверенных [[:​wiki:​%D0%94%D0%BE%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BC%D1%8F|доменов]]:​ A, B, C. Тогда для ​страниц этих [[:​wiki:​%D0%94%D0%BE%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BC%D1%8F|доменов]] не будут действовать ограничения [[:​wiki:​%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%D0%B0|принципа одинакового источника]] на запрашиваемые страницы:+> Cross-origin resource sharing (CORS; с англ. — «совместное использование ресурсов между ​разными источниками») — технология ​современных браузеров, которая позволяет предоставить веб-страницам доступ к ресурсам другого домена.
  
-''​Access-Control-Allow-Origin:​ //A, B, C//''​+=====   ​Суть технологии CORS Править =====
  
-После ​этого, страницы [[:​wiki:​%D0%94%D0%BE%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BC%D1%8F|доменов]] A, B, C смогут загружать ​контент с сервера ​U.+Есть три домена,​ позволяющие загрузить ресурсы с сервера U. Для ​того, ​чтобы это ​стало возможным,​ веб-серверу U, который отдает контент, достаточно указать в заголовке ответа Access-Control-Allow-Origin список доверенных доменовA, B, C. Тогда для ​страниц этих доменов не будут действовать ограничения принципа одинакового источника на запрашиваемые страницы:{{ :​php:​220px-flowchart_showing_simple_and_preflight_xhr.svg.png?400 |}}
  
-Для [[:​wiki:​PHP|PHP]] это реализуется вызовом [[:​wiki:​%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)|функции]] header():+<​code>​ 
 +Access-Control-Allow-OriginA, B, C 
 +</​code>​
  
 <code php> <code php>
Строка 17: Строка 19:
 =====   ​Пример использования Править ===== =====   ​Пример использования Править =====
  
-Для инициализации cross-origin запроса ​[[:​wiki:​%D0%91%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80|браузер]] клиента добавляет в [[:​wiki:​HTTP|HTTP]]-запрос указание Origin ([[:​wiki:​%D0%94%D0%BE%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BC%D1%8F|домена]] [[:​wiki:​%D0%A1%D0%B0%D0%B9%D1%82|сайта]], с которого происходит запрос). Например,​ страница http://​www.a.com/​page.html пытается получить данные со страницы http://​www.b.com/​cors.txt. В случае если ​[[:​wiki:​%D0%91%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80|браузер]] клиента поддерживает технологию CORS, [[:​wiki:​%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%B8|запрос]] будет выглядеть так:+Для инициализации cross-origin запроса браузер клиента добавляет в HTTP-запрос указание Origin (домена сайта, с которого происходит запрос). Например,​ страница http://​www.a.com/​page.html пытается получить данные со страницы http://​www.b.com/​cors.txt. В случае если браузер клиента поддерживает технологию CORS, запрос будет выглядеть так:
  
 <code bash> <code bash>
Строка 25: Строка 27:
 </​code>​ </​code>​
  
-Если ​[[:​wiki:​%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5)|сервер]] www.b.com разрешает получение данных с www.a.com, то в ответе ​[[:​wiki:​%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5)|сервера]] будет присутствовать строка:​ +Если сервер www.b.com разрешает получение данных с www.a.com, то в ответе сервера будет присутствовать строка:​
 <​code>​ <​code>​
 Access-Control-Allow-Origin:​ http://​www.a.com Access-Control-Allow-Origin:​ http://​www.a.com
 </​code>​ </​code>​
  
-Если в ответе ​[[:​wiki:​%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5)|сервера]] отсутствует данная строка,​ то [[:​wiki:​%D0%91%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80|браузер]], поддерживающий ​[[:​wiki:​%D0%A2%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F|технологию]] CORS, вернёт ​[[:​wiki:​%D0%9A%D0%BE%D0%B4_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8|код ошибки]] вместо данных.+Если в ответе сервера отсутствует данная строка,​ то браузер,​ поддерживающий технологию CORS, вернёт код ошибки вместо данных.
  
-В случае,​ если ​[[:​wiki:​%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5)|сервер]] хочет разрешить доступ для страниц с любого ​[[:​wiki:​%D0%94%D0%BE%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BC%D1%8F|домена]], он может указать в ответе:​+В случае,​ если сервер хочет разрешить доступ для страниц с любого домена,​ он может указать в ответе:​
  
 <code php> <code php>
Строка 39: Строка 40:
 </​code>​ </​code>​
  
-Если ​[[:​wiki:​%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5)|сервер]] хочет разрешить доступ более чем одному ​[[:​wiki:​%D0%94%D0%BE%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BC%D1%8F|домену]], то в ответе ​[[:​wiki:​%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5)|сервера]] должно быть по одной строчке Access-Control-Allow-Origin для каждого ​[[:​wiki:​%D0%94%D0%BE%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BC%D1%8F|домена]].+Если сервер хочет разрешить доступ более чем одному домену,​ то в ответе сервера должно быть по одной строчке Access-Control-Allow-Origin для каждого домена.
  
 <code php> <code php>
Строка 47: Строка 48:
 </​code>​ </​code>​
  
-На практике чаще используется запись из нескольких ​[[:​wiki:​%D0%94%D0%BE%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BC%D1%8F|доменов]], разделенных ​[[:​wiki:​%D0%9F%D1%80%D0%BE%D0%B1%D0%B5%D0%BB|пробелом]]<​sup>​[[#​cite_note-1|[1]]]</​sup>​:+На практике чаще используется запись из нескольких доменов,​ разделенных пробелом:​
  
 <​code>​ <​code>​
Строка 55: Строка 56:
 =====   ​Соотношение CORS и JSONP Править ===== =====   ​Соотношение CORS и JSONP Править =====
  
-Технология CORS может быть использована как более современная и надёжная альтернатива ​[[:wiki:JSONP|JSONP]], так как позволяет использовать все преимущества ​[[:wiki:XMLHttpRequest|XMLHttpRequest]], и в отличие от JSONP, не является уязвимой для ​[[:​wiki:​%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_SQL-%D0%BA%D0%BE%D0%B4%D0%B0|SQL-инъекции]] +Технология CORS может быть использована как более современная и надёжная альтернатива JSONP, так как позволяет использовать все преимущества XMLHttpRequest,​ и в отличие от JSONP, не является уязвимой для SQL-инъекции. С другой стороны,​ технология CORS требует специальной поддержки в коде браузеров,​ а JSONP от этого не зависит.
- +
-.mw-parser-output .ts-fix-template{white-space:​nowrap}.mw-parser-output .ts-fix-error{font-size:​inherit}@media screen{.mw-parser-output .ts-fix-text{border:​1px solid #​a2a9b1;​box-decoration-break:​clone;​margin:​0 -0.1em;​padding:​0 0.1em;​transition:​background 0.1s}.mw-parser-output :hover .ts-fix-text{background:#​fee7e6}}@media screen and (hover:​hover){.mw-parser-output .ts-fix-comment,​.mw-parser-output .ts-fix-commented>​a:​not(:​hover){border-bottom:​1px dotted;​text-decoration:​none}} +
- +
-<​sup>​[//​[[:​wiki:​%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:​%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8|источник не указан 775 дней]]//​]</​sup>​. С другой стороны,​ технология CORS требует специальной поддержки в коде ​[[:​wiki:​%D0%91%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80|браузеров]], а [[:​wiki:​JSONP|JSONP]] от этого не зависит.+
  
  
  
php/cors.1694505942.txt.gz · Последние изменения: 2023/09/12 11:05 — werwolf