Какая точка заголовка X-Requested-With?
JQuery и другие фреймворки добавляют следующий заголовок:
X-Requested-With: XMLHttpRequest
Зачем это нужно? Почему сервер хочет обрабатывать запросы AJAX иначе, чем обычные запросы?
UPDATE. Я просто нашел пример в реальном времени, используя этот заголовок: https://core.spreedly.com/manual/payment-methods/adding-with-js. Если процессор платежей запрашивается без AJAX, он перенаправляет обратно на исходный веб-сайт, когда он будет выполнен. Когда он запрашивается с AJAX, перенаправление не выполняется.
Ответы
Ответ 1
Хорошая причина для безопасности - это может предотвратить атаки CSRF, потому что этот заголовок не может быть добавлен в кросс-домен запроса AJAX без согласие сервера через CORS.
Разрешены только следующие заголовки:
- Принять
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type
любые другие вызывают запрос "перед полетом" в браузерах, поддерживаемых CORS.
Без CORS невозможно добавить X-Requested-With
к запросу XHR с кросс-доменом.
Если сервер проверяет наличие этого заголовка, он знает, что запрос не инициировал из домена злоумышленника попытку сделать запрос от имени пользователя с помощью JavaScript. Это также проверяет, что запрос не был отправлен из обычной HTML-формы, из которых сложнее проверить, что это не перекрестный домен без использования токенов. (Тем не менее проверка заголовка Origin
может быть опцией в поддерживаемых браузерах хотя вы оставите старые браузеры уязвимы.)
Обнаружен новый обход флагов
Вы можете пожелать объединить это с токеном, поскольку Flash, работающий в Safari на OSX может установите этот заголовок, если есть шаг перенаправления. Он выглядит он также работал в Chrome, но теперь исправлен. Подробнее здесь, включая различные версии.
OWASP Рекомендовать сочетать это с проверкой Origin and Referer:
Этот метод защиты специально обсуждается в разделе 4.3 Надежная защита для кросс-сайта. Однако обход эта защита с использованием Flash была зарегистрирована еще в 2008 году и снова как недавно в 2015 году Матиас Карлссон использовал недостаток CSRF в Вимео. Но мы считаем, что Flash-атака не может подделать Origin или Заголовки отправителей, поэтому, проверяя их оба, мы считаем, что это комбинация проверок должна предотвращать атаки CSRF с помощью обхода байпаса. (ЗАМЕТКА: Если кто-то может подтвердить или опровергнуть это убеждение, сообщите нам, чтобы мы может обновить эту статью)
Однако по причинам, которые уже обсуждались, проверка Origin может быть сложной.
Update
Написано более подробное сообщение в блоге CORS, CSRF и X-Requested-With здесь.
Ответ 2
Убедитесь, что вы прочитали ответ SilverlightFox. Это подчеркивает более важную причину.
Причина в том, что, если вы знаете источник запроса, вы можете немного его настроить.
Например, скажем, у вас есть веб-сайт с множеством рецептов. И вы используете настраиваемую среду jQuery для перетаскивания рецептов в контейнер на основе ссылки, которую они нажимают.
Ссылка может быть www.example.com/recipe/apple_pie
Теперь, как правило, это возвращает полную страницу, заголовок, нижний колонтитул, содержимое рецептов и объявления. Но если кто-то просматривает ваш сайт, некоторые из этих частей уже загружены. Таким образом, вы можете использовать AJAX для получения рецепта, который выбрал пользователь, но для экономии времени и полосы пропускания не загружаются верхний/нижний колонтитулы/объявления.
Теперь вы можете просто написать вторичную конечную точку для данных типа www.example.com/recipe_only/apple_pie
, но это сложнее поддерживать и делиться с другими людьми.
Но проще просто обнаружить, что это запрос ajax, делающий запрос, а затем возвращающий только часть данных. Таким образом, пользователь тратит меньше полосы пропускания, и сайт выглядит более отзывчивым.
Фреймворки просто добавляют заголовок, потому что некоторым может показаться полезным отслеживать, какие запросы являются ajax, а какие нет. Но он полностью зависит от разработчика, чтобы использовать такие методы.
На самом деле это похоже на заголовок Accept-Language
. Браузер может запросить веб-сайт, пожалуйста, покажите мне английскую версию этого веб-сайта без необходимости вставлять/ru/или подобное в URL-адрес.
Ответ 3
Некоторые фреймворки используют этот заголовок для обнаружения запросов xhr, например. grails spring использует этот заголовок для идентификации запроса xhr и дает ответ json или html-ответ в качестве ответа.
Большинство библиотек Ajax (Prototype, JQuery и Dojo от версии 2.1) включают заголовок X-Requested-With, который указывает, что запрос был сделан с помощью XMLHttpRequest вместо запуска, щелкнув регулярную гиперссылку или отправить форму кнопка.
Источник: http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html