Определяем, что к нам идёт Ajax запрос с помощью PHP

Сегодня мы познакомим с небольшим фрагментом кода, который позволит вам проверить тип запроса, который направляется к вашим PHP скриптам, а именно мы покажем вам как определить Ajax запрос.

Для того чтобы определить идёт ли к нам ajax запрос, следует использовать следующий параметр суперглобального массива $_SERVER['HTTP_X_REQUESTED_WITH']. Для тех кто не в курсе, Ajax запрос = запросу xmlhttprequest. Внимание! Нет никакой уверенности в том, что каждый веб сервер будет предоставлять данное значение в суперглобальном массиве $_SERVER. Для просмотра всех параметров $_SERVER, перейдите сюда.

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    // Если к нам идёт Ajax запрос, то ловим его
    echo 'Это ajax запрос!';
    exit;
}
//Если это не ajax запрос
echo 'Это не ajax запрос!';

Данный фрагмент кода будет понятен всем, кто когда-то отслеживал тип запроса. В этом примере мы проверяем запрос на тип xmlhttprequest. Так как в данный момент Ajax становится всё более популярным и часто используемым, применение данной техники очень важно в вопросах безопасности. Не мне вам объяснять… Юзайте на здоровье!

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.papermashup.com/detecting-an-ajax-request-with-php/
Перевел: Станислав Протасевич
Урок создан: 7 Апреля 2011
Просмотров: 73914
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 7 Апреля 2011 22:59
    Никита Никитин
    Не ново, но спасибо. Новичкам полезно будет.
  • 7 Апреля 2011 23:45
    SerginhoLD
    зачем одновременно isset и !empty ? Чего-нить одного вполне хватит
    • 8 Апреля 2011 11:41
      kindofbear
      вот именно
    • 8 Апреля 2011 13:03
      zxspectr
      Если в массиве нет элемента, проверка на пустоту кинет варнинг. Автор всё правильно сделал.
      • 8 Апреля 2011 14:27
        SerginhoLD
        чем это писать, сначала проверь
        • 12 Апреля 2011 15:31
          zxspectr
          Блин, перепутал с считыванием значения :)
    • 28 Ноября 2014 21:29
      rijen
      Не лучше сделать так? В случае с !isset и empty будет возвращено пустое значение.
      function ajax_test()
      {	$rq = filter_input(5, 'HTTP_X_REQUESTED_WITH');	return $rq === 'xmlhttprequest';
      }
      
  • 8 Апреля 2011 09:31
    notbot
    "в вопросах безопасности" ЖЖОШ!!!11 Это подделывается так же, как и referer...
    • 8 Апреля 2011 11:41
      kindofbear
      я тоже в шоке о_О
  • 8 Апреля 2011 11:41
    kindofbear
    ЭТО _что_ ВООБЩЕ такое?!
  • 8 Апреля 2011 14:30
    MopuC
    А зачем?
  • 9 Апреля 2011 01:19
    turin
    На самом деле, спасибо. На данный момент переделываю cms фирменную под 5.3 php и $_SERVER['HTTP_X_REQUESTED_WITH'] очень помогает, при валидации контроллера ajax. Для начинающих очень советую проверку проводить!
    • 9 Апреля 2011 02:00
      xakepmega
      что за такая фирменная cms?
      • 9 Апреля 2011 22:52
        turin
        CMS (http://ru.wikipedia.org/wiki/CMS) которую использует наша фирма для создания сайтов. В принципе, ныне написанная полностью устраивает, но она создана для php5.2, а мы щас переписываем для использования 5.3 версии с namespace, что сильно упрощает работу системы.
        • 10 Апреля 2011 19:34
          pipec123
          Спросили, что такое фирменная CMS)) видимо потому, что сами пишем свои CMS на codeigniter или yii или там зенде)
          • 11 Апреля 2011 13:24
            turin
            Ну, это замечательно :) и мы бы на этом бы писали, еслиб директор разрешил... по его мнению, лучше всё с нуля делать, чтоб уж точно копирайт поставить... так и живём...
  • 13 Апреля 2011 02:52
    Alex_sin
    Автор забыл отметить, что данный заголовок может быть просто не отправлен JS библиотекой, если в нем не предусмотрен такой функционал. Я о том, что стандартные средства браузера для ajax (xmlHttpRequest) не отправляют его.
  • 13 Апреля 2011 11:02
    ax64
    зачем нужно писать
    isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH'])
    
    ? второе определение уже включает первое. достаточно только
    !empty($_SERVER['HTTP_X_REQUESTED_WITH'])
    
  • 8 Августа 2012 18:43
    aivars116
    umina problema v tom 6to
    $_SERVER['HTTP_X_REQUESTED_WITH']
    v lumbom zaprosi pystoj!
  • 6 Августа 2013 23:23
    MaXFull
    Подскажите как сделать тоже самое на Perl?
  • 28 Ноября 2014 21:24
    rijen
    UFO delete this message
  • 18 Января 2015 00:31
    SamTest Biryuktest
    // делаю AJAX-запрос к серверу
    function ajaxRexueqst () { var request=new XMLHttpRequest(); request.onload=function(){ // ???	if(request.status==200){	// todo	var div=	document.getElementById("ajaxtest");	document.write(request.responseText);	} }; var url="/test.ua3/allfile/test.php"; request.open("GET",url);
    request.send();
    }
    функция для запроса, но ни один браузер не показал что ето AJAX запрос. немного погуглив нашел что переменная $_SERVER['HTTP_X_REQUESTED_WITH'] суть добровольной и на основе вышеуказаного можно сделать вывод что такая проверка не будет 100% эфективной. Если я не прав подправте.
  • 7 Июня 2016 20:48
    maks_zavalishin
    а если написать
    if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'xmlhttprequest')
    
    это не тоже самое будет? если в массиве не будет нужного индекса вернется false и результат сравнения будет тоже false ? или я ошибаюсь?
^ Наверх ^