$ _SERVER ['HTTP_X_REQUESTED_WITH'] существуют в PHP или нет?

На всем протяжении Интернета, включенного даже здесь в Переполнение стека, люди заявляют, что хороший способ проверить, является ли запрос Ajax или не должен сделать следующее:

if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {...}

Однако я не вижу $_SERVER['HTTP_X_REQUESTED_WITH'] в официальной документации PHP

И когда я пытаюсь сделать следующее:

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Ничто не производится.

Я делаю что-то не так? Поскольку я действительно хотел бы смочь использовать $_SERVER['HTTP_X_REQUESTED_WITH'] если это доступно.

68
задан brasofilo 22 August 2014 в 21:00
поделиться

4 ответа

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Чего вы ожидали от такого кода? Предположим, вы запускаете его прямо из браузера, не используя запрос AJAX. Итак, как получилось установить этот заголовок?

Ответ на главный вопрос жизни, Вселенной и всего остального - сниффер HTTP ! Возьмите себе такой и забудьте о выводе переменной $ _SERVER.

Firebug имеет один, или вы можете использовать Fiddler HTTP-прокси или плагин LiveHTTPHeaders Mozilla. Мне скучно делать ссылки, но это легко гуглить.

Таким образом, с HTTP-сниффером вы можете быть уверены в любом HTTP-заголовке.

Обратите внимание, что вы не можете предотвратить любой «прямой доступ» с помощью XHR, поскольку каждый HTTP-запрос к вашему серверу уже является «прямым».

3
ответ дан 24 November 2019 в 14:15
поделиться

Переменные в $ _ SERVER на самом деле не являются частью PHP, поэтому вы не найдете их в документации PHP.Они подготавливаются веб-сервером, который передает их языку сценариев.

Насколько мне известно, X-Requested-With отправляется функциями Ajax большинства основных фреймворков, но не всех (например, Dojo добавил его всего два года назад: № 5801 ). Таким образом, и принимая во внимание комментарии @bobince ', можно с уверенностью сказать, что это обычно не 100% надежный метод определения того, является ли запрос запросом AJAX или нет.

Единственный 100% безопасный способ - это отправить заранее определенный флаг (например, переменную GET) вместе с запросом и для принимающей страницы проверить наличие этого флага.

61
ответ дан 24 November 2019 в 14:15
поделиться

Ключи $ _ SERVER , которые начинаются с HTTP_ , генерируются из заголовков запросов HTTP. В этом случае заголовок X-Requested-With .

17
ответ дан 24 November 2019 в 14:15
поделиться

Этот заголовок находится в процессе стандартизации всех библиотек AJAX.

Это не будет описано в документации php как таковой, а скорее в различных библиотеках AJAX, которые устанавливают этот заголовок. Общие библиотеки отправляют этот заголовок: jQuery, Mojo, Prototype, ...

Обычно эта библиотека устанавливает заголовок, используя

xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
14
ответ дан 24 November 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: