Здесь показаны различия между двумя версиями данной страницы.
| Следующая версия | Предыдущая версия | ||
|
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-Origin: A, 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]] от этого не зависит. | + | |