Используете test.php на своем сайте и Google Chrome?



    Про test.php уже была интересная статься хабре. Но в этом небольшом топике я расскажу об одной особенности Google Chrome, которая может подпортить жизнь владельцам test.php.

    Работая с очередным веб-приложением я наткнулся на странный баг: открываешь в Google Chrome скрипт http://example.com/test.php, а он выполняется несколько раз. Причина оказалась в стандартных настройках Google Chrome, а точнее во включенной опции «Предсказывать сетевые действия для ускорения загрузки страниц».

    Среди прочего, она позволяет хрому заранее загружать и рендерить веб-страницу еще до нажатия Enter в омнибоксе (адресной строке), тем самым создавая видимость мгновенной загрузки. Здесь пишут, что функция работает для часто посещаемых страниц (возможно достаточно хотя бы раз посетить страничку, чтобы она осталась в истории омнибокса), test.php у разработчиков часто подходит под этот критерий :)

    Неприятная особенность данной функций заключается в том, что если страница успела загрузиться до нажатия Enter, все работает как следует, и страница отображается мгновенно после ввода. Однако если test.php загружается дольше, чем время между отображением подсказки в омнибоксе и переходом на страницу, после нажатия Enter страница будет загружена повторно.

    Таким образом, тяжелые, долго выполняющиеся скрипты (например, обновляющие значение поля в очень большой таблице базы данных) могут быть вызваны несколько раз.

    Решение простое: в опциях убрать галочку с «Предсказывать сетевые действия для ускорения загрузки страниц»:



    Возможно, данная проблема есть и у других современных браузеров с «умной» адресной строкой. Также стоит отметить, что у меня предзагрузка не отображалась во вкладке «Network» в «Developer Tools».
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 28

      +7
      Хороший повод отвыкнуть от плохой привычки написания подобных тестов.
        +20
        Это не тесты. Это скорее эксперименты.
          –5
          Это повод оставлять их на продакшене? Хром не делает предзагрузку с локалхоста, там тестируйте сколько влезет.
            +10
            Ну как бы у некоторых есть тестовые VPS\VDS. Да и к локалхосту может быть привязан домен, причем тут продакшн?
              –3
              А у некоторых есть крупные сайты с test.php где лежит phpinfo, который позволяет провернуть LFI атаку через phpinfo (есть вектор такой редкий).
              А всё почему? Потому что деплоят все файлы. Давайте не будет разбирать все возможные варианты, хорошего в этом мало :).
              Даже если это на тестовой vds хранить, то папку лучше закрывать паролём, на тестовых vps бывают базы с реальными данными.
                +5
                что-то вы путаете. phpinfo максимум что позволяет — дать информацию о местоположении, которое может быть полезно для LFI.
                через сам <?php phpinf(); ?> скрипт ничего сделать нельзя.
                  0
                  rdot.org/forum/showthread.php?t=1134
                  Напутал ли? :)
                    0
                    rdot.org использует недействительный сертификат безопасности. Сертификат истёк 04.12.2013 16:38. Текущее время — 10.08.2014 14:53. (Код ошибки: sec_error_expired_certificate)

                    какой позор…
                    полгода давно прошло — до сих пор никто не пошевелился.
                      0
                      Форум полумёртвый, у основателей появилось много работы и заниматься им некому.
                      Но это не значит что из-за этого информация там устарела :)
                        0
                        Но это не значит что из-за этого информация там устарела :)

                        Мой комментарий касался только просроченного сертификата. Это два совершенно разных вопроса: а) сертификат просрочен б) информация некачественная или устарела. Я бы прямо написал, если бы видел связку от «а» к «б».
                      0
                      да, напутал. единственное, зачем там нужен phpinfo — это чтобы была страница, которая читает $_FILES чтобы файл «визуализовать» отправленный через $POST файл.
                      это способ загрузить «свой» файл, который уже инклудить через дырявый по LFI файл.
                      сам phpinfo — безопасен. а при наличии safe dir то еще и бесполезен — так как до move_uploaded_file его содержимое недоступно.
                        0
                        Ну да, я немного не ясно выразился, но написал, что это редкий вектор.
                        Способ этот сам давно проверял, поэтому понимаю как он работает.
                          0
                          так что вы так же знаете, что пойдёт любой другой скрипт, который обращается к $_FILES — например, загрузка аватара.
                          так что он далеко не всегда даёт какого-либо плюса.
                        0
                        Вы хотите сказать что человек может вставить что-то в пхпинфо, имея при этом доступ к консоли сервера? А ничего что имея доступ к консоли сервера можно все что угодно сделать? Вплоть до того что исправить скрипты сайта?
            –5
            Вы предлагаете разработчикам отключить эту опцию, чтобы они не видели глюки, которые появятся у пользователей?
              +8
              Зачем пользователям запускать test.php на выполнение?
                +1
                rushter, в принципе, правильно отметил, что test.php – это, наверное, не очень хороший стиль программирования. Но если для программиста еще допустимо выполнять какие-либо активные действия в отладочном скрипте test.php по обыкновенному GET-запросу, то в обычных скриптах, к которым имеет доступ любой пользователь, поисковая система или бот скайпа, такой запрос не должен приводить к каким-либо серьезным изменениям на сайте.
                +30
                Решение, как и писали выше, — не делать ничего неидемпотентного по GET-запросам. Если что-то меняется — то только POST/PUT/PATCH/DELETE запросы. И никаких глюков не будет.
                  +15
                  Вы еще предложите писать эффективный код, чтоб GET страницы не грузились по 40 секунд.
                    0
                    Это совсем другая история… но опять же — вызовется один и тот же скрипт дважды, ну потормозит немного — ничего страшного не произойдёт.
                      0
                      хром открывает до 6-8 соединений к одному хосту. в случае апач-prefork с maxclientvhost=10 получается, что 2 человека работают с сайтом, остальные тупят.
                    0
                    Вы путаете идемпотентность и безопасность (safe methods). PUT и DELETE идемпотентны.
                    –7
                    Ребята, есть же Selenium (и не только) для тестирования на стороне пользователя. Тем более, что его даже к PHPUnit можно прицепить.
                      +8
                      Тут, кажется, все же речь немного о другом.
                      +3
                      Даже при отключенной опции страница /test.php может срабатывать несколько раз. В свое время долго искал баг в своем «эксперименте», а вина лежала на каком-то SEO-расширении Хрома, который при обновлении страницы самостоятельно её запрашивал для каких-то своих темнейших нужд.
                        0
                        У меня так было с Firebug в Chrome. Как же я бесился, когда не мог понять, почему у меня появляется две записи в базе данных, когда я переходил на страницу только один раз!
                        +2
                        я год назад наткнулся на двойное выполнение скриптов. После меня ходил гуглобот. Теперь тестовые скрипты выполнчю в консоли. Кстати, таймаут тоже был причиной перехода в консоль.
                          0
                          Мне довелось про подобное читать в dev разделе одного известного развлекательного сайта. Посещаемость у них и так была приличная, а после того, как у пользователей обновился браузер на умную версию, кривая трафика резко подскочила — пришлось им очень быстро с этим разбираться.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое