Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access control max age

XMLHttpRequest: кросс-доменные запросы

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/fetch-crossorigin.

Обычно запрос XMLHttpRequest может делать запрос только в рамках текущего сайта. При попытке использовать другой домен/порт/протокол – браузер выдаёт ошибку.

Существует современный стандарт XMLHttpRequest, он ещё в состоянии черновика, но предусматривает кросс-доменные запросы и многое другое.

Большинство возможностей этого стандарта уже поддерживаются всеми браузерами, но увы, не в IE9-.

Впрочем, частично кросс-доменные запросы поддерживаются, начиная с IE8, только вместо XMLHttpRequest нужно использовать объект XDomainRequest.

Кросс-доменные запросы

Разберём кросс-доменные запросы на примере кода:

  1. Мы создаём XMLHttpRequest и проверяем, поддерживает ли он событие onload . Если нет, то это старый XMLHttpRequest , значит это IE8,9, и используем XDomainRequest .
  2. Запрос на другой домен отсылается просто указанием соответствующего URL в open . Он обязательно должен быть асинхронным, в остальном – никаких особенностей.

Контроль безопасности

Кросс-доменные запросы проходят специальный контроль безопасности, цель которого – не дать злым хакерам™ завоевать интернет.

Серьёзно. Разработчики стандарта предусмотрели все заслоны, чтобы «злой хакер» не смог, воспользовавшись новым стандартом, сделать что-то принципиально отличное от того, что и так мог раньше и, таким образом, «сломать» какой-нибудь сервер, работающий по-старому стандарту и не ожидающий ничего принципиально нового.

Давайте, на минуточку, вообразим, что появился стандарт, который даёт, без ограничений, возможность делать любой странице HTTP-запросы куда угодно, какие угодно.

Как сможет этим воспользоваться злой хакер?

Он сделает свой сайт, например http://evilhacker.com и заманит туда посетителя (а может посетитель попадёт на «злонамеренную» страницу и по ошибке – не так важно).

Когда посетитель зайдёт на http://evilhacker.com , он автоматически запустит JS-скрипт на странице. Этот скрипт сделает HTTP-запрос на почтовый сервер, к примеру, http://gmail.com . А ведь обычно HTTP-запросы идут с куками посетителя и другими авторизующими заголовками.

Поэтому хакер сможет написать на http://evilhacker.com код, который, сделав GET-запрос на http://gmail.com , получит информацию из почтового ящика посетителя. Проанализирует её, сделает ещё пачку POST-запросов для отправки писем от имени посетителя. Затем настанет очередь онлайн-банка и так далее.

Спецификация CORS налагает специальные ограничения на запросы, которые призваны не допустить подобного апокалипсиса.

Запросы в ней делятся на два вида.

Простыми считаются запросы, если они удовлетворяют следующим двум условиям:

  1. Простой метод: GET, POST или HEAD
  2. Простые заголовки – только из списка:
  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type со значением application/x-www-form-urlencoded , multipart/form-data или text/plain .

«Непростыми» считаются все остальные, например, запрос с методом PUT или с заголовком Authorization не подходит под ограничения выше.

Принципиальная разница между ними заключается в том, что «простой» запрос можно сформировать и отправить на сервер и без XMLHttpRequest, например при помощи HTML-формы.

То есть, злой хакер на странице http://evilhacker.com и до появления CORS мог отправить произвольный GET-запрос куда угодно. Например, если создать и добавить в документ элемент

Комментарии

  • Если вам кажется, что в статье что-то не так — вместо комментария напишите на GitHub.
  • Для одной строки кода используйте тег , для нескольких строк кода — тег

, если больше 10 строк — ссылку на песочницу (plnkr, JSBin, codepen…)

  • Если что-то непонятно в статье — пишите, что именно и с какого места.
  • Понимание CORS

    Правило одного источника является важным принципом обеспечения безопасности, реализованное web браузерами для предотвращения выполнения JavaScript кодом запросов к другим источникам(т.е. к другим доменам), а не к тому, с которого он передан. Несмотря на эффективность такого правила, оно также ограничивает в законных взаимодействиях между сервером и клиентами из надежных источников.

    Cross-Origin Resource Sharing (CORS) является техникой для ослабления правила одного источника, позволяя JavaScript на web странице обрабатывать ответ от REST API от другого источника.

    Обработка простых CORS запросов

    В простейшем случае, междоменные взаимодействия начинаются с запроса GET, POST или HEAD к ресурсу на сервере. В данном случае, тип содержимого POST запроса ограничен application/x-www-form-urlencoded , multipart/form-data или text/plain . Запрос включает заголовок Origin , который указывает на происхождение клиентского кода.

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

    С другой стороны, если Access-Control-Allow-Origin отсутствует в ответе или если его нет в Origin запроса, то браузер не разрешит запрос.

    К примеру, предположим, что клиентский код расположен на foo.client.com и отправляет запрос на bar.server.com:

    Заголовок Origin говорит серверу, что клиентский код создан в http://foo.client.com. Так он проверяет правила одного источника и определяет, что он может обработать запрос. Ответ может выглядеть примерно так:

    Access-Control-Allow-Origin указывает на то, что «http://foo.client.com» разрешен доступ, но не другим источникам.

    Дополнительно Access-Control-Allow-Origin может быть установлен в «*», указывая на доступность всем. Это считается небезопасной практикой, кроме тех особых случаев, где API полностью публично и предназначено для использования любым клиентом.

    Предполетные запросы

    Если запрос может оказать влияние на пользовательские данные, то простого запроса недостаточно. Вместо этого, предполентый CORS запрос отправляется в перед отправкой необходимого запроса, чтобы гарантировать безопасность отправки запроса. Предполетные запросы необходимы в тех случаях, когда любой HTTP метод, отличный от GET, POST, HEAD или если тип содержимого POST запроса отличен от application/x-www-form-urlencoded , multipart/form-data или text/plain . Также, если запрос содержит любые собственные заголовки, то необходим предполетный запрос.

    Читать еще:  Access control list

    К примеру, предположим, что клиент, расположенный на foo.client.com, выполняет DELETE запрос к ресурсу не bar.server.com. Предполетный запрос принимает вид OPTIONS запроса со следующими заголовками:

    Предполетный запрос фактически спрашивает сервер о доступности DELETE запроса без фактической отправки самого DELETE запроса. Если сервер разрешает такой запрос, то он ответит предполетному запросу примерно так:

    Ответ предполетному запросу указывает(в заголовке Access-Control-Allow-Methods ) на то, что клиенту доступен DELETE запрос к передаваемому ресурсу. Заголовок Access-Control-Max-Age указывает на то, что этот предполетный ответ действует 84600 секунд или 1 день, после которого должен быть выполнен новый предполетный запрос.

    В то же время клиенту будет доступно отправка настоящего DELETE запроса к ресурсу.

    тут блог

    Общественные обязательства интроверта.
    Сообщения на ИТ тематику, но не обязательно.

    О CORS

    Современные браузеры не хотят просто так ходить на другие домены. Точнее на другой Origin. Это касается JavaScript, выполняемого в браузере.

    Нельзя просто так взять, и потыкать API, находящееся в другом домене. И нельзя сделать crawler, работающий в браузере. Это будут cross-origin запросы. И они запрещены. Из соображений безопасности. Похоже, это скорее забота о том, чтобы конфиденциальные данные из вашего браузера не утекли куда не надо, чем попытка затруднить жизнь тем, кто захочет воспользоваться вашим API.

    Но иногда у вас какой-нибудь SPA на React должен ходить в API на другой домен. И тут на помощь приходит CORS. Cross-Origin Resource Sharing. Сервер другого ресурса, нашего API, может явно сказать, с каких Origin к нему разрешён доступ. С помощью некоторых дополнительных HTTP заголовков.

    В простейшем случае, когда наш JavaScript делает GET запрос, и не передаёт никаких потенциально опасных заголовков, браузер включает в запрос заголовок Origin . А сервер должен ответить с заголовком Access-Control-Allow-Origin , где, собственно, и говорит, разрешён ли доступ с этого Origin.

    В более сложном случае, например, когда мы делаем POST запрос с JSON в теле запроса, браузер делает так называемый «preflight request».

    Это OPTIONS запрос, в который включены заголовки, описывающие будущий полноценный запрос. Access-Control-Request-Method говорит, какой HTTP метод будет в будущем запросе. Access-Control-Request-Headers говорит, какие HTTP заголовки будут в будущем запросе (помимо тех, вроде Host , User-Agent и Acept , которые и так разрешены по умолчанию). Конечно же, этот запрос включает заголовок Origin .

    Если сервер согласен и с Origin, и с методом, и с заголовками, он отвечает 200 OK с дополнительными заголовками. Снова заголовок Access-Control-Allow-Origin выражает согласие сервера с Origin. Заголовок Access-Control-Allow-Methods перечисляет методы, которые сервер готов принимать с этого Origin. Заголовок Access-Control-Allow-Headers подтверждает готовность сервера принимать заголовки. Заголовок Access-Control-Max-Age указывает срок действия данного соглашения, браузер может какое-то время не повторять preflight запросы.

    В Access-Control-Allow-Origin сервер может вернуть не только тот самый Origin, что запросил доступ, но и специальное значение «*», звёздочку. Это означает «любой Origin». Но в этом случае запрещается передавать в запросе credentials. Под «credentials» подразумеваются куки, информация об аутентификации, включая заголовки и TLS сертификаты. Всё то, что браузер может неявно подмешать в запрос, и что явно идентифицирует пользователя.

    По умолчанию credentials запрещены. Но сервер может разрешить, если выдаст заголовок Access-Control-Allow-Credentials со значением true . Но для Origin «*» это не работает.

    Если говорить про fetch() в браузере, то для credentials есть свои опции.

    Сервер может ещё использовать заголовок Vary , чтобы указать на заголовки запроса, изменение которых приведёт к другому ответу сервера. Поэтому положено, если Access-Control-Allow-Origin возвращает конкретный Origin, то должен быть ещё и Vary: Origin .

    Почти во всех случаях, когда у вас есть SPA и отдельное API, вам придётся учитывать CORS.

    Вам повезло, если вы можете закрыть и фронтенд и бэкенд общим прокси на одном домене. Тогда ваше API будет, скажем, просто по относительному URL «/api», и это будет same-origin, и CORS не понадобится.

    Вам повезло, если перед бэкендом вы можете поставить прокси, которое сможет добавлять заголовки. Например, Nginx. Тогда он сможет взять на себя всю работу c CORS. Не забудьте включить в Access-Control-Allow-Headers все заголовки, которые рожает ваше SPA.

    Если вам позарез нужны credentials, например, аутентификация у вас через cookie, то всё немного усложняется.

    Как правило, на preflight запрос сервер должен отвечать минуя все механизмы авторизации. Собственно, так и произойдёт, если вы к этому location добавите ещё, например, директивы auth_basic . Потому что return прерывает обработку запроса раньше.

    Приведённые конфигурации открывают доступ к API с любого Origin. Возможно, это не то, что вы хотите. Тогда разбираться с CORS придётся в самом бэкенде.

    Если вы разворачиваетесь в облаке, то вряд ли вам захочется запускать свой Nginx, лучше воспользоваться облачным load balancer. А они вовсе не обязаны втыкать дополнительные заголовки. К тому же в облаках статику и динамику как-то удобнее размещать в разных доменах, CDN, всё такое. Так что от CORS не отвертитесь, и снова на бэкенде.

    Читать еще:  Const pointer c

    Настройка CORS в Nginx

    CORS (cross-origin resource sharing) — совместное использование ресурсов между разными источниками . Это спецификация, которая обеспечивает действительно открытый доступ между доменами. Если вы размещаете общедоступный контент, рассмотрите возможность использования CORS, чтобы открыть его для универсального доступа из JavaScript в браузерах.

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

    Почему CORS важен?

    За последние годы JavaScript и веб-программирование активно развиваются, но same-origin политику никто не отменял. Это препятствует тому, чтобы JavaScript делал запросы между разными доменами, что породило различные хаки для выполнения междоменных запросов.

    CORS представляет стандартный механизм, который может использоваться всеми браузерами для реализации междоменных запросов. Спецификация определяет набор заголовков, которые позволяют браузеру и серверу сообщать о том, какие запросы разрешены (и не разрешены). CORS продолжает дух открытой сети, предоставляя доступ к API всем.

    Правило ограничения домена (Same Origin Policy, Принцип одинакового источника) — это важная концепция безопасности для некоторых языков программирования на стороне клиента, таких как JavaScript. Политика разрешает сценариям, находящимся на страницах одного сайта, доступ к методам и свойствам друг друга без ограничений, но предотвращает доступ к большинству методов и свойств для страниц на разных сайтах. Одинаковые источники — это источники, у которых совпадают три признака: домен, порт и протокол.

    Концепция правила ограничения домена появилась во времена Netscape Navigator 2.0. Скрытые производные оригинальной разработки используются во всех современных браузерах, а также в плагинах, таких как Adobe Flash либо для механизмов отличных от DOM манипуляций, таких как XMLHttpRequest.

    Как это работает?

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

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

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

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

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

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

    Пример конфигурации CORS для web-сервера Nginx

    Читайте также

    Nginx — легковесный, по сравнению с Apache, HTTP, обратный прокси сервер написанный Igor Sysoe. Официальную документацию к Nginx вы найдете здесь.…

    Как регламентировать перекуры в течение рабочего дня? Можно ли разрешать опаздывать к началу рабочего дня? Можно ли чатится во время…

    iReadMail пожалуй один единственный почтовый сервер, установку которого запустил и все произошло само собой. Единственное что вам необходимо — только…

    Почему отправляется запрос параметров и можно ли его отключить?

    Я создаю веб-api. Я обнаружил, что всякий раз, когда я использую Chrome для публикации, добираюсь до своего API, всегда есть запрос на опцию, отправленный до реального запроса, что довольно раздражает. В настоящее время я получаю сервер, чтобы игнорировать любые параметры запроса. Теперь мои вопросы: что хорошо отправить запрос на опцию, чтобы удвоить нагрузку на сервер? Есть ли способ полностью остановить браузер от отправки запросов параметров?

    15 ответов:

    изменить 2018-09-13: добавлены некоторые уточнения об этом предполетном запросе и как его избежать в конце этого ответа.

    OPTIONS просит то, что мы называем pre-flight запросы Cross-origin resource sharing (CORS) .

    они необходимы, когда вы делаете запросы через различные источники в конкретных ситуациях.

    этот запрос перед полетом выполняется некоторыми браузерами в качестве меры безопасности, чтобы гарантировать, что выполняемый запрос доверен серверу. Это означает, что сервер понимает, что метод, источник и заголовки, отправляемые по запросу, безопасны для действий.

    ваш сервер не должен игнорировать, но обрабатывать эти запросы всякий раз, когда вы пытаетесь сделать перекрестные запросы происхождения.

    хороший ресурс можно найти здесь http://enable-cors.org/

    способ справиться с ними, чтобы получить удобный, чтобы убедиться, что для любого пути с OPTIONS метод сервер отправляет ответ с этим заголовком

    это сообщит браузеру, что сервер готов отвечать на запросы из любого источника.

    для получения дополнительной информации о том, как добавить поддержку CORS на ваш сервер см. следующую блок-схему

    изменить 2018-09-13

    CORS OPTIONS запрос запускается только в некоторые случаи, как объяснено в MDN docs:

    пожалуйста, обратитесь к этому ответу на фактическую потребность в предварительном запросе опций:CORS — какова мотивация введения предполетных запросов?

    чтобы отключить запрос опций, для запроса ajax должны быть выполнены следующие условия:

    1. запрос не устанавливает пользовательские заголовки HTTP, такие как «application/xml» или «application/json» и т. д.
    2. метод запроса должен быть одним из GET, HEAD или POST. Если сообщение, тип контента должен быть один из application/x-www-form-urlencoded , multipart/form-data или text/plain
    Читать еще:  Импорт xml в access

    прошли через эту проблему, ниже мой вывод по этому вопросу и мое решение.

    по словам стратегия CORS (настоятельно рекомендуем Вам прочитать об этом) вы не можете просто заставить браузер прекратить отправку запроса опции, если он считает, что это необходимо.

    есть два способа обойти это

      1. убедитесь, что ваш запрос является «простой запрос»
      1. Set Access-Control-Max-Age для запроса опции

    простой запрос

    простой межсайтовый запрос-это запрос, удовлетворяющий всем следующим условиям:

    единственные разрешенные методы: — ПОЛУЧИТЬ — ГЛАВА — В должности

    кроме заголовков, установленных автоматически агентом пользователя (например, соединение, User-Agent и т. д.), только заголовки, которые могут быть установлены вручную: — Принимать — Принять-Язык — Содержание-Язык — Content-Type

    единственными допустимыми значениями для заголовка типа содержимого являются: — приложение / x-www-форма-urlencoded — multipart/данные формы — text / plain

    простой запрос не вызовет запрос опции перед полетом.

    установите кэш для опции check

    Вы можете установить Access-Control-Max-Age для запроса опции, чтобы он не проверял разрешение снова, пока оно не истечет.

    Access-Control-Max-Age дает значение в секундах как долго ответ на запрос перед полетом может быть кэширован без отправки другого запроса перед полетом.

    Да, это возможно, чтобы избежать заказу вариантов. Запрос параметров-это предварительный запрос при отправке (отправке) любых данных в другой домен. Это проблема безопасности браузера. Но мы можем использовать и другую технологию: iframe transport layer. Я настоятельно рекомендую вам забыть о любой конфигурации CORS и использовать готовое решение, и оно будет работать в любом месте.

    когда у вас есть открытая консоль отладки и Disable Cache опция включена, предполетные запросы всегда будут отправляться (т. е. перед каждым запросом). если вы не отключите кэш, запрос перед полетом будет отправлен только один раз (на сервер)

    Как уже упоминалось в предыдущих сообщениях, OPTIONS просит есть. Если у вас есть проблема с большим временем отклика от вашего сервера (например, зарубежное соединение), вы также можете кэшировать в своем браузере предполетные запросы.

    пусть ваш сервер ответит с Access-Control-Max-Age заголовок и для запросов, которые идут в ту же конечную точку, запрос перед полетом будет кэшироваться и больше не возникнет.

    для разработчика, который понимает причину его существования, но должен получить доступ к API, который не обрабатывает вызовы опций без auth, мне нужен временный ответ, чтобы я мог развиваться локально, пока владелец API не добавит соответствующую поддержку SPA CORS или я не получу прокси-API и не запустится.

    Я обнаружил, что вы можете отключить CORS в Safari и Chrome на Mac.

    Chrome: выход из Chrome, откройте терминал и вставьте это команда: open /Applications/Google Chrome.app —args —disable-web-security —user-data-dir

    Если вы хотите отключить политику одинакового происхождения в Safari (у меня есть 9.1.1), вам нужно только включить меню разработчика и выбрать «отключить ограничения перекрестного происхождения» из меню разработки.

    Я решил эту проблему, как.

    это только для развития. С этим я жду 9 мс и 500 мс, а не 8С и 500 мс. я могу это сделать, потому что производство JS приложение будет на той же машине, что и производство, так что не будет OPTIONS но развитие мое локальное.

    вы не можете, но вы могли бы избежать CORS с помощью JSONP.

    проведя целый день с половиной, пытаясь решить подобную проблему, я обнаружил, что это связано с IIS.

    мой проект Web API был настроен следующим образом:

    у меня не было конкретных параметров конфигурации CORS в интернете.конфигурация > система.узел веб-сервера, как я видел во многих сообщениях

    в глобальном коде нет кода CORS.asax или в контроллере в качестве декоратора

    проблема было то настройки пула приложений.

    на режим управляемого конвейера было установлено значение classic (изменил его на интегрированный) и личность был установлен в сетевую службу (изменил его на ApplicationPoolIdentity)

    изменение этих настроек (и обновление пула приложений) исправило это для меня.

    то, что сработало для меня, было импортировать «github.com/gorilla/handlers-а потом используй его так:

    Как только я выполнил запрос Ajax POST и прикрепил к нему данные JSON, Chrome всегда добавлял заголовок Content-Type, которого не было в моей предыдущей конфигурации AllowedHeaders.

    Я думаю, вы отправляете запрос домен крест.

    на кросс-домен запросы, установка типа контента на что-либо другое чем application / x-www-form-urlencoded,multipart / form-data, или text / plain вызовет браузер, чтобы отправить параметры предполетного запрос к серверу.

    поэтому вам может потребоваться указать contentType to во избежание запросу вариант.

    возможно, есть решение (но я его не тестировал) : вы можете использовать CSP (политику безопасности контента), чтобы включить удаленный домен, и браузеры, возможно, пропустят проверку запроса параметров CORS.

    Я если найду время, я проверю это и обновлю этот пост !

    одно решение, которое я использовал в прошлом-допустим, ваш сайт включен mydomain.com, и вам нужно сделать запрос ajax, чтобы foreigndomain.com

    настройка перезаписи IIS из вашего домена во внешний домен-например

    на вашем mydomain.com сайт-вы можете сделать тот же запрос происхождения, и нет необходимости в каких-либо вариантах запроса 🙂

    Это можно решить в случае использования прокси, которые перехватывают запрос и пишут соответствующие заголовки. В частном случае лака это были бы правила:

    Ссылка на основную публикацию
    Adblock
    detector