В чем смысл заголовка X-Requested-With?

jQuery и другие фреймворки добавляют следующий заголовок:

X-Requested-With: XMLHttpRequest

зачем это нужно? Почему сервер хочет обрабатывать запросы AJAX иначе, чем обычные запросы?

обновление: Я только что нашел реальный пример, используя этот заголовок:https://core.spreedly.com/manual/payment-methods/adding-with-js. Если платежный процессор запрашивается без AJAX, он перенаправляет вернемся к первоначальному сайту, когда все будет сделано. Когда он запрашивается с помощью AJAX, перенаправление не выполняется.

3 ответов


хорошая причина для безопасности-это может предотвратить CSRF атаки, потому что этот заголовок не может быть добавлен в кросс-домен AJAX-запроса без согласия сервера через CORS.

только следующие заголовки разрешены для кросс-домена:

  • принимать
  • Принять-Язык
  • Content-Language
  • Last-Event-ID
  • Контент-Тип

любые другие вызывают запрос "pre-flight", который будет выдан в браузерах, поддерживаемых CORS.

без CORS невозможно добавить X-Requested-With к запросу XHR кросс-домена.

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

обнаружен новый Flash-байпас

вы можете пожелать объедините это с токеном, потому что Flash работает на Safari на OSX можно установить этот заголовок, если есть шаг перенаправления. Он появляется он также работал на Chrome, но теперь исправлено. подробнее здесь включая различные версии затронуты.

OWASP рекомендует объединить это с проверкой Origin и Referer:

этот метод защиты специально обсуждается в разделе 4.3 Надежная защита от подделки межсайтовых запросов. Однако, обходы эта защита с использованием Flash была задокументирована еще в 2008 году и снова недавно, в 2015 году Матиасом Карлссон использует недостаток CSRF в Vimeo. Но мы считаем, что Flash-атака не может обмануть происхождение или Заголовки Referer поэтому, проверяя оба из них, мы считаем это комбинация проверок должна предотвращать атаки CSRF в обход Flash. (ОТМЕЧАТЬ: Если кто-то может подтвердить или опровергнуть это убеждение, пожалуйста, сообщите нам, чтобы мы можно обновить эту статью)

однако по причинам, уже обсужденным, проверка происхождения может быть сложной.

обновление

написано a более подробно сообщение в блоге на CORS, CSRF и X-запрошено-с Здесь.


убедитесь, что вы прочитали ответ SilverlightFox. Это подчеркивает более важную причину.

причина в основном в том, что если вы знаете источник запроса, вы можете немного настроить его.

например, скажем, у вас есть веб-сайт, который имеет много рецептов. И вы используете пользовательский фреймворк jQuery для слайдов рецептов в контейнер на основе ссылки, которую они нажимают. Ссылка может быть www.example.com/recipe/apple_pie

Теперь нормально, что возвращает полную страницу, заголовок, нижний колонтитул, содержание рецепта и объявления. Но если кто-то просматривает ваш сайт, некоторые из этих деталей уже загружены. Таким образом, вы можете использовать AJAX для получения рецепта, выбранного пользователем, но для экономии времени и полосы пропускания не загружайте верхний/нижний колонтитул/объявления.

Теперь вы можете просто написать вторичную конечную точку для данных, таких как www.example.com/recipe_only/apple_pie но это сложнее поддерживать и делиться с другими людьми.

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

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

это на самом деле похоже на Accept-Language заголовок. Браузер может запросить веб-сайт, пожалуйста, покажите мне русскую версию этого веб-сайта без необходимости вставьте /ru/или аналогичный в URL.


некоторые фреймворки используют этот заголовок для обнаружения запросов xhr, например, Grails spring security использует этот заголовок для идентификации запроса xhr и дает ответ json или html в качестве ответа.

большинство библиотек Ajax (Prototype, JQuery и Dojo с версии v2.1) Включите заголовок X-Requested-With, который указывает, что запрос был сделан XMLHttpRequest вместо того, чтобы запускаться нажатием обычной гиперссылки или формы отправки кнопка.

источник: http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html