1. PHP / Говнокод #8535

    +154

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    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 запрос!';

    Что-то смущает меня эта "поповщина"

    Запостил: bot-minurast, 16 Ноября 2011

    Комментарии (59) RSS

    • - Алло, это говнокод?
      - Нет, это ajax запрос!
      Ответить
    • > Если к нам идёт Ajax запрос, то ловим его
      -Ага, потом отжимаем у него мобилу, деньги и отпиздюливаем ногами.
      Ответить
    • вам вышел облом, это не ajax запрос
      Ответить
    • bot-minurast, по чём определили что это "поповщина" ?
      Ответить
    • Не знаю насчет Попова но говно. sset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH'])
      Сокращается до !empty($_SERVER['HTTP_X_REQUESTED_WITH'])
      А остальное надо снифиром смотреть. Не уверен что так.

      Да и какая разница Аякс или там хуякс. Запрос есть запрос пришел запрос отдай ответ. Если чего секурное хочешь вернуть проверяй права.
      Ответить
      • > хуякс
        khujax
        Ответить
      • >>Запрос есть запрос пришел запрос отдай ответ
        Пример: ссылка с onclick. При переходе перебрасывает на страницу с какой-то информацией, а по клику делается аякс запрос к этому же скрипту и информация подгружается в текущую страницу.
        Тогда PHP-скрипт должен отдавать полный HTML для простого запроса и JSON/чуть обернутые в HTML данные для аякса. Если сделать два скрипта, они будут по сути дублировать друг друга. Если сделать дополнительный параметр, задающий выходной формат... ну можно, конечно, но смысл? Браузеры, умеющие HttpRequest, всё равно посылают заголовок.
        Ответить
        • Для этого есть Accept.
          Ответить
          • А, т.е. проверять, спрашивают ли у нас text/html или application/x-javascript (application/json)?
            Хм, про этот заголовок я как-то забыл, спасибо что напомнили.
            Ответить
      • > Да и какая разница Аякс или там хуякс. Запрос есть запрос пришел запрос отдай ответ.

        Это какой-то тонкий троллинг или для вас правда нет разницы?
        Ответить
        • пхпешники просто слабо разбираются в HTTP
          Ответить
          • ИМХО, это одно из главных, в чем должен разбираться PHP-программист. Очень интересно было услышать, что человеку не важно, как данные пришли на обработчик.
            Ответить
            • Полностью согласен если на вход одной и той-же страницы приходит запрос на выдачу скажем списка новостей. Как bugmenot, Vindicar (разбирающиеся в http) определят, что выдавать полную версию html со списком новостей или фрагмент одной новости которую пользователь запросил через ajax?

              Заголовок - HTTP_X_REQUESTED_WITH
              отсылают большинство java script фрейморков которые и позволяет нам без особых усилий понять что пришел ajax запрос
              Ответить
            • Я действительно не вижу разницы как пришел запрос. Важнее что сними делать. Я в процентах 80% отдаю JSON. Вот и не важно кто его получит.
              Ответить
              • 1 все запросы приходят с помощью HTTP (HTTP_X_REQUESTED_WITH просто доп. заголовок)
                2. а остальны 20% как вы работате с ними?
                Ответить
              • > и не важно кто его получит

                еще интересней...

                А почему вам не интересно? Ну например, у вас есть обработчик ajax запросов, а вы вдруг решили проверить HTTP_X_REQUESTED_WITH и вдруг обнаружили, что заголовок такой не передается 99% ваших пользователей, а еще и куки не передаются и User-Agent пустой. Какова ваша реакция - фиг с ним, - зато я обрабатываю запросы правильно?
                Ответить
                • Ничего страшного, просто люди не разобравшись в сути, начинают поливать всех и вся говном. Что говорит об их низкой квалификации как минимум... Знатоки http бля
                  Ответить
                • Это намек на ботов грабящих контент ??? Я пишу периодически таких ботов. Бота на пустом User-Agent'е не поймаешь. Назовите хоть одну по настоящему вескую причину отличать Аякс запроса от обычного обращения.
                  Ответить
                  • mime-type и формат данных ответа.
                    Ответить
                    • А это как то относится к тому как пришел запрос?
                      Формат ответа стоит проверять всегда.
                      Ответить
                      • Конечно. Что тут не понятного?
                        Если запрос ajax, отдать XML/JSON/HTML и т.д.
                        Если не ajax, отдать HTML страницу.

                        > Формат ответа стоит проверять всегда
                        Каким образм?
                        Ответить
                        • > Если запрос ajax, отдать XML/JSON/HTML и т.д.
                          > Если не ajax, отдать HTML страницу.
                          Странный подход. Не знаю, как там в PHP, но в Java принято исходить из следующих факторов при выборе формата возвращаемого контента:
                          1. Значение Accept.
                          2. Расширение запрашиваемого документа.
                          3. Использовать тип ресурса по-умолчанию (html, к примеру).
                          Ответить
                          • У ajax запросов обычно Accept */* что отдавать в этом случае? :) Ну я могу конечно и application/javascript прописать, но почему просто не использовать x-requested-with?
                            Да и по большому счету то, что вы написали не конфликтует с моими словами. В чем странность моего подхода тогда?

                            Принимать во внимание Accept и расширение запрошенного документа стоит только в том случае, если вы самостоятельно отдаете все документы вашей информационной системы. В php эта практика далеко не всеми примелема. В частности я, например, не буду картинки отдавать через PHP, - я лучше подниму сервер под статику. Тем не менее, иногда удобно управлять любым контентом ИС централизовано - с этим я тоже согласен.

                            Полемика вокруг того, что я говорю, - нельзя не знать и не понимать то, как был запрошен документ (вы например смотрите на Accept), а Vasiliy говорит, что он не заморчивается по поводу любых HTTP-заголовков и считает, что важно только то, как данные обрабатываются - абсолютно неприемлемое мной мнение.
                            Ответить
                            • Я так понял, что Vasiliy просто считает не очень правильным разделять AJAX запросы и "обычные" HTTP-запросы, что производить выбор типа контента нужно на основании других факторов. И тут я с ним согласен.
                              Ответить
                              • Можно конечно создать отдельную страницу для асинхронных запросов никто вам не мешает сделать это. Можно конечно передавать отдельный параметр который бы подчеркивал того что это ассинхронный режим и нужны данные для этого.
                                Кто-то просто обращается к одной и той-же странице передавая доп. заголовок.

                                К примеру
                                my_site.com/get_news.php

                                my_site.com/get_news.php
                                отличий нет но если обратиться с этой странице посредством доп. заголовка то данные будут возвращенные в другом формате.

                                Методов уйма но это не говорит о том что метод проверки на доп. заголовок говно код. Кому как нравиться так и делайте
                                Ответить
                                • По мне так явное лучше неявного. В Java нет никаких проблем с тем, чтобы обращаться к серверу вот так:
                                  my_site.com/get_news.html
                                  my_site.com/get_news.json
                                  и получать разный тип контента. Более того, со Spring даже лишний код писать не придётся.
                                  Ответить
                                  • Никто не спорит что так можно, я и писал об этом выше. Более того в php тоже таких проблем нет. Повторюсь данный заголовок был добавлен из-за удобства разделений обычных запросов и ассихронных. Разницы между ними нет по сути
                                    Ответить
                          • Вы сами подумайте для чего разработчики js фреймворков добавили дополнительный заголовок. Я думаю люди они не глуппые и как минимум знают все о протоколе http :)
                            Ответить
                            • Наверное, для того, чтобы вы могли автоматически посылать XML-данные в ответ на такие запросы. Только это уже не актуально и AJAX-запросы используют наравне со старыми добрыми "обычными" HTTP запросами.
                              Ответить
                              • ну не только xml данные все, что угодно.
                                Что не актуально не понял - ассинхронные запросы или заголовок этот много страдальный?
                                Ответить
                              • Последнее, а в чем разница извините меня обычных http запросов и ajax?
                                Ответить
                                • С точки зрения сервера её нет, именно поэтому слово "обычные" заключено в кавычки. Разве что браузеры упомянутый заголовок в запрос засовывают.
                                  Ответить
    • > к нам идёт Ajax запрос
      к нам едет ревизор!
      (OMG)
      Ответить
    • ну и срач вы тут развели
      у меня по данному вопросу немного двоякая позиция:
      1. нужно тщательно проектировать API, и делать, чтобы по одному урлу отдавался контент строго определенного формата.
      my_site.com/get_news.html - отдает хтмл и хуяксом, и так
      my_site.com/get_news.json - отдает жсон и так и так.
      2. в случае хтмл детект заголовков может быть нужен, чтобы решить, отдавать ли необходимый кусок или полностью, лэйаут, так сказать - для graceful degradation. Как, например, на говнокодике "Комментарии"
      Ответить
      • То же самое хотел написать, только my_site.com/get_news.json - говно.
        JSON должен стучаться куда-нибудь вообще в свою дверь, допустим /json.php?act=news&id=15, а сама новость доступна как /news/15
        Кто вообще придумал, что один и тот же файл должен обслуживать все на свете? Неправильно поняли суть контроллера в MVC что ли?

        И еще
        >в случае хтмл детект заголовков может быть нужен, чтобы решить, отдавать ли необходимый кусок или полностью, лэйаут, так сказать - для graceful degradation. Как, например, на говнокодике "Комментарии"

        Можно просто передать очевидный параметр ?no_head и все. Нужно всегда делать очевидные решения.
        Допустим какой-то новичок хочет сделать агрегатор комментариев говнокода, ну захотелось ему.
        Вот он смотрит и ох*евает - как с одного урла приходят разные по структуре вещи. А с параметром все просто и понятно.
        Ответить
        • > JSON должен стучаться куда-нибудь вообще в свою дверь
          > Неправильно поняли суть контроллера в MVC
          You can not into REST.
          Ответить
        • Что нибудь слышали об паттерне - фронт котроллер? Так вот он и базируется на одном входном файле (точка входа)
          Ответить
          • И? Внутри можно реализовать как угодно.
            Я просто про то, что для разного контента пути должны быть обязательно различными.
            Ответить
            • Ну это я написал к вашей реплике - "Кто вообще придумал, что один и тот же файл должен обслуживать все на свете?". К примеру в фреймворке Zend система контроллеров работает на основе фронт контроллера. Т.е есть один файл index.php который принимает все запросы затем он уже на основе запроса вызывает тот или инной класс котроллера. Вообще тут спорный момент как лучше обрабатывать запросы, лучше я думаю оталкиваться от задачи
              Ответить
              • >лучше я думаю оталкиваться от задачи
                Абсолютно верно. У меня все запросы на выдачу пользователю html-контента всегда идут через единый контроллер.
                Но при этом не стоит фанатеть, пихая все через контроллер. Например, доступ к API логичнее реализовать через другой контроллер, при этом не стоит делать глобальный контроллер для этих двух - в этом просто нет смысла.
                Слепое следование MVC - далеко не всегда хорошо.
                Ответить
    • делаем:
      <?
      echo "$_SERVER[HTTP_X_REQUESTED_WITH]<br />";
      ?>
      результат
      Notice: Undefined index: HTTP_X_REQUESTED_WITH in Z:\home\mycms.rul\www\style\script\php\r eg_form.php on line 23
      вывод: HTTP_X_REQUESTED_WITH в топку )))
      Ответить
      • вывод: пхп в топку вместе с теми, кто на нем пишет
        Ответить
      • Делаем:
        <?
        dfskljgsd;lhjs;ohyiujt;slgk\lkfhjd;flhjf d;lhjrtoihjdl;tkhjdf;lghkjhg;hjgdf;hglkd ;
        ?>

        Результат:

        Notice: Use of undefined constant dfskljgsd - assumed 'dfskljgsd' in C:\__\b.php on line 2

        Notice: Use of undefined constant lhjs - assumed 'lhjs' in C:\__\b.php on line 2

        Notice: Use of undefined constant ohyiujt - assumed 'ohyiujt' in C:\__\b.php on line 2

        Fatal error: Undefined constant 'slgk\lkfhjd' in C:\__\b.php on line 2

        Вывод: пхп в топку.
        Ответить
    • показать все, что скрытоМгновенное финансирование онлайн

      <a href=http://mikrosaym.blogspot.ru><img>http://s015.radikal.ru/i332/1703/5e/143d0d0673f2.png</img></a>
      НЕ ВЫХОДЯ ИЗ ДОМА Деньги на банковскую карту
      КАК ЭТО РАБОТАЕТ?
      ОФОРМЛЯЕТЕ ЗАЯВКУ
      ПОЛУЧАЕТЕ ПОДТВЕРЖДЕНИЕ
      ПОЛУЧАЕТЕ ДЕНЬГИ

      <a href=http://mikrosaym.blogspot.ru><img>http://s020.radikal.ru/i711/1703/0d/40730bbd75ed.png</img></a>
      <a href=http://bit.ly/2oI4psW>ВЫДАВАЙ МИКРОЗАЙМЫ С ГАРАНТИРОВАННОЙ ДОХОДНОСТЬЮ ОТ 192% ДО 265% ГОДОВЫХ И ЗАБУДЬ О ФИНАНСОВЫХ ПРОБЛЕМАХ</a>

      -lu-
      Ответить
    • показать все, что скрытоЗАКАЖИ СРОЧНО ЛЕГЕНДАРНЫЕ СОЛНЕЧНЫЕ ОЧКИ RAY-BAN!
      ЛЮБЫЕ ВТОРЫЕ ОЧКИ RAY-BAN В ПОДАРОК!
      МОДЕЛИ и цвета НА ВЫБОР! Выберите свои Aviator, Wayfarer или Clubmaster!
      http://kshop2.biz/KKUYcW - http://s16.radikal.ru/i191/1703/50/899c19cb0fe0.png

      <a href=http://kshop2.biz/KKUYcW>брендовые солнцезащитные очки 2014</a>
      <a href=http://kshop2.biz/KKUYcW>солнцезащитные очки prada официальный</a>
      http://kshop2.biz/KKUYcW - очки ромео популяр купить
      http://kshop2.biz/KKUYcW - очки для компьютера купить днепр
      <a href=http://kshop2.biz/KKUYcW>широкие солнцезащитные очки купить</a>

      http://kshop2.biz/KKUYcW - http://s019.radikal.ru/i634/1703/80/511fb7c108bc.png


      =RAY BAN=
      Ответить
    • показать все, что скрытоЗАКАЖИ СРОЧНО ЛЕГЕНДАРНЫЕ СОЛНЕЧНЫЕ ОЧКИ RAY-BAN!
      ЛЮБЫЕ ВТОРЫЕ ОЧКИ RAY-BAN В ПОДАРОК!
      МОДЕЛИ и цвета НА ВЫБОР! Выберите свои Aviator, Wayfarer или Clubmaster!
      http://kshop2.biz/KKUYcW - http://s020.radikal.ru/i700/1703/63/e61a680fd4f0.png

      <a href=http://kshop2.biz/KKUYcW>золотые оправы очков купить екатеринбург</a>
      http://kshop2.biz/KKUYcW - очки виртуальной реальности для смартфона купить в москве
      http://kshop2.biz/KKUYcW - солнечные очки шаблон для фотошопа
      <a href=http://kshop2.biz/KKUYcW>каким лицам идут солнцезащитные очки</a>
      http://kshop2.biz/KKUYcW - alpina очки солнцезащитные

      http://kshop2.biz/KKUYcW - http://s019.radikal.ru/i634/1703/80/511fb7c108bc.png


      =RAY BAN=
      Ответить

    Добавить комментарий