Http x requested with php
В чем смысл заголовка X-Requested-With?
jQuery и другие фреймворки добавляют следующий заголовок:
зачем это нужно? Почему сервер хочет обрабатывать запросы AJAX иначе, чем обычные запросы?
обновление: Я только что нашел реальный пример, используя этот заголовок:https://core.spreedly.com/manual/payment-methods/adding-with-js. Если платежный процессор запрашивается без AJAX, он перенаправляет вернемся к первоначальному сайту, когда все будет сделано. Когда он запрашивается с помощью AJAX, перенаправление не выполняется.
3 ответов
хорошая причина для безопасности-это может предотвратить CSRF атаки, потому что этот заголовок не может быть добавлен в кросс-домен AJAX-запроса без согласия сервера через CORS.
только следующие заголовки разрешены для кросс-домена:
любые другие вызывают запрос «pre-flight», который будет выдан в браузерах, поддерживаемых CORS.
без CORS невозможно добавить X-Requested-With к запросу XHR кросс-домена.
если сервер проверяет наличие этого заголовка, он знает, что запрос не инициировался из домена злоумышленника, пытающегося сделать запрос от имени пользователя с помощью JavaScript. Это также проверяет, что запрос не был отправлен из обычной HTML-формы, из которой сложнее проверить, что это не кросс-домен без использования токенов. (Однако, проверка Origin заголовок может быть опция в поддерживаемых браузерах,хотя вы оставите старые браузеры уязвимы.)
обнаружен новый Flash-байпас
вы можете пожелать объедините это с токеном, потому что Flash работает на Safari на OSX можно установить этот заголовок, если есть шаг перенаправления. Он появляется он также работал на Chrome, но теперь исправлено. подробнее здесь включая различные версии затронуты.
этот метод защиты специально обсуждается в разделе 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 вместо того, чтобы запускаться нажатием обычной гиперссылки или формы отправки кнопка.
All over the Internet, included even here at Stack Overflow, people state that a good way to check if a request is AJAX or not is to do the following:
And when I try to do the following:
Nothing is outputted.
11 Answers 11
As far as I know, the X-Requested-With is sent by the Ajax functions of most major Frameworks but not all (Dojo, for example, added it only two years ago: #5801). As such, and taking into considerations @bobince’ comments, it’s safe to say it’s not generally a 100% reliable method to determine whether a request is an AJAX request or not.
The only 100% secure way is to send a pre-defined flag (e.g. a GET variable) along with the request and for the receiving page to check for the presence of that flag.
don’t forget that you can easily spoof any header with cURL like so
$_SERVER keys that start with HTTP_ are generated from HTTP request headers. In this case, the X-Requested-With header.
This header is a standardization-in-progress from all of the AJAX libraries out there.
Usually these library will set the header using
Here’s a quick function with example usage:
What’d you expect from such a code? Assume you’re running it directly from the browser, not using AJAX request. So, how come this header could be set?
Firebug has one, or you may want to use Fiddler HTTP proxy or LiveHTTPHeaders Mozilla plugin. I’m bored to make links but it easily googled.
So, with HTTP sniffer you can be sure of any HTTP header ever.
Note that you can’t prevent any «direct access» by using XHR, as every HTTP request to your server is already «direct».
IE also having caching issue which is more serious then detection of request method.
I agree Pekka. There is no reliable native method between front side and back side that can auto-detect if a client is really calling an endpoint using AJAX.
For my own use, I have few main ways to check if a client is requesting one of my endpoint:
I can use HTTP_X_REQUESTED_WITH when I’m not in cross domain context.
Как прочитать заголовок запроса в PHP
Как я должен читать любой заголовок в PHP?
14 ответов
если: вам нужен только один заголовок, вместо все заголовки, самый быстрый метод-это:
ТО ЕСЛИ: вы запускаете PHP как модуль Apache или, начиная с PHP 5.4, используя FastCGI (простой метод):
другое: в любом другом случае вы можете использовать (реализация userland):
к примеру X-Requested-With можно найти в:
начиная с PHP 5.4.0 вы можете использовать getallheaders функция, которая возвращает все запрошенные заголовки в виде ассоциативного массива:
ранее эта функция работала только тогда, когда PHP работал как модуль Apache/NSAPI.
strtolower отсутствует в нескольких предлагаемых решениях, RFC2616 (HTTP/1.1) определяет поля заголовка как объекты, нечувствительные к регистру. Все это, а не только стоимостью часть.
поэтому предложения, как только разбор соответствующий http_ записи неверны.
обратите внимание на тонкие различия с предыдущими предложениями. Функция здесь также работает на php-fpm (+nginx).
передать ключ заголовка эта функция вернет его значение вы можете получить значение заголовка с помощью for loop
чтобы сделать вещи простыми, вот как вы можете получить только один вы хотите:
или когда вам нужно получить по одному за раз:
я использовал CodeIgniter и использовал код ниже, чтобы получить его. Может пригодиться кому-то в будущем.
это выглядит намного проще, чем большинство примеров, приведенных в других ответах. Это также получает метод (GET/POST / etc.) и URI, запрошенный при получении всех заголовков, которые могут быть полезны, если вы пытаетесь использовать его в журнале.
$_SERVER[‘HTTP_X_REQUESTED_WITH’] существует в PHP или нет?
По всему Интернету, включая даже здесь, в Stack Overflow, люди утверждают, что хороший способ проверить, является ли запрос AJAX или нет, это сделать следующее:
И когда я пытаюсь сделать следующее:
Ничего не выводится.
10 ответов
Насколько я знаю, X-Requested-With отправляется функциями Ajax большинства основных фреймворков, но не всеми (например, Dojo добавил его только два года назад: # 5801). Таким образом, принимая во внимание комментарии @bobince, можно с уверенностью сказать, что это не является на 100% надежным методом определения того, является ли запрос запросом AJAX или нет.
Не забывайте, что вы можете легко подделать любой заголовок с помощью cURL, вот так
$_SERVER ключи, которые начинаются с HTTP_ генерируются из заголовков HTTP-запроса. В этом случае X-Requested-With заголовок.
Этот заголовок является стандартной стандартизацией всех библиотек AJAX.
Обычно эти библиотеки устанавливают заголовок, используя
Вот быстрая функция с примером использования:
Что вы ожидаете от такого кода? Предположим, вы запускаете его прямо из браузера, не используя AJAX-запрос. Итак, как же этот заголовок может быть установлен?
У Firebug есть такой, или вы можете использовать HTTP-прокси Fiddler или плагин LiveHTTPHeaders Mozilla. Мне скучно делать ссылки, но это легко гуглил.
Таким образом, с помощью сниффера HTTP вы можете быть уверены в любом HTTP-заголовке.
Обратите внимание, что вы не можете предотвратить любой «прямой доступ» с помощью XHR, так как каждый HTTP-запрос к вашему серверу уже «прямой».
IE также имеет проблему с кэшированием, которая более серьезна, чем обнаружение метода запроса.
Вы должны установить его специально в своем объекте запроса ajax (то есть, если вы не используете фреймворк, такой как jQuery), но основной Javascript; вот так:
где xhr это ваш объект запроса.
Примечание: в вашем javascript убедитесь, что вы установили заголовки после открытия запроса. Я имею в виду после xhr.open() метод.
Я согласен, Пекка. Между передней и задней сторонами нет надежного собственного метода, который бы мог автоматически определять, действительно ли клиент вызывает конечную точку с помощью AJAX.
Для собственного использования у меня есть несколько основных способов проверить, запрашивает ли клиент одну из моих конечных точек:
Я могу использовать HTTP_X_REQUESTED_WITH, когда я не в междоменном контексте.
What’s the point of the X-Requested-With header?
JQuery and other frameworks add the following header:
Why is this needed? Why would a server want to treat AJAX requests differently than normal requests?
UPDATE: I just found a real-life example using this header: https://core.spreedly.com/manual/payment-methods/adding-with-js. If the payment processor is requested without AJAX, it redirects back to the original website when it’s done. When it is requested with AJAX, no redirection is done.
3 Answers 3
Only the following headers are allowed across origins:
any others cause a «pre-flight» request to be issued in CORS supported browsers.
Without CORS it is not possible to add X-Requested-With to a cross domain XHR request.
If the server is checking that this header is present, it knows that the request didn’t initiate from an attacker’s domain attempting to make a request on behalf of the user with JavaScript. This also checks that the request wasn’t POSTed from a regular HTML form, of which it is harder to verify it is not cross domain without the use of tokens. (However, checking the Origin header could be an option in supported browsers, although you will leave old browsers vulnerable.)
New Flash bypass discovered
You may wish to combine this with a token, because Flash running on Safari on OSX can set this header if there’s a redirect step. It appears it also worked on Chrome, but is now remediated. More details here including different versions affected.
This defense technique is specifically discussed in section 4.3 of Robust Defenses for Cross-Site Request Forgery. However, bypasses of this defense using Flash were documented as early as 2008 and again as recently as 2015 by Mathias Karlsson to exploit a CSRF flaw in Vimeo. But, we believe that the Flash attack can’t spoof the Origin or Referer headers so by checking both of them we believe this combination of checks should prevent Flash bypass CSRF attacks. (NOTE: If anyone can confirm or refute this belief, please let us know so we can update this article)
However, for the reasons already discussed checking Origin can be tricky.
Update
Written a more in depth blog post on CORS, CSRF and X-Requested-With here.
Make sure you read SilverlightFox’s answer. It highlights a more important reason.
The reason is mostly that if you know the source of a request you may want to customize it a little bit.
For instance lets say you have a website which has many recipes. And you use a custom jQuery framework to slide recipes into a container based on a link they click. The link may be www.example.com/recipe/apple_pie
Now normally that returns a full page, header, footer, recipe content and ads. But if someone is browsing your website some of those parts are already loaded. So you can use an AJAX to get the recipe the user has selected but to save time and bandwidth don’t load the header/footer/ads.
Now you can just write a secondary endpoint for the data like www.example.com/recipe_only/apple_pie but that’s harder to maintain and share to other people.
But it’s easier to just detect that it is an ajax request making the request and then returning only a part of the data. That way the user wastes less bandwidth and the site appears more responsive.
The frameworks just add the header because some may find it useful to keep track of which requests are ajax and which are not. But it’s entirely dependent on the developer to use such techniques.
It’s actually kind of similar to the Accept-Language header. A browser can request a website please show me a Russian version of this website without having to insert /ru/ or similar in the URL.