Связаться с поддержкой

Мы отвечаем по электронной почте, обычно в течение двух дней.

Для защиты от злоупотреблений Google reCAPTCHA проверяет эту отправку; при этом данные передаются в Google. Скрипт загружается только при открытии этой формы.

← Все записи

Проверка через curl проверяет не то

Обращение к счётчику, пришедшее без опознавателя браузера, пишет в два из двенадцати мест, которые обычно затрагивает засчитанный визит. Оно отвечает 200. Оно отдаёт настоящую картинку счётчика. Нигде не сказано, что десять из двенадцати были пропущены.

без опознавателя — 2 из 12 curl по умолчанию — 2 из 12 с опознавателем браузера — 10 из 12 все три ответили 200 рабочей картинкой счётчика

Зачем нужен фильтр и во что он обходится

Счётчики здесь отделяют роботов от людей, и отделяют по опознавателю, который клиент сообщает о себе. Список признаков короткий и намеренно однозначный, и curl/ в нём есть. Пустой опознаватель тоже, с рассуждением, что обращение вовсе без опознавателя — не браузер.

И то и другое верно. Служба не ошибается, считая голый curl роботом; он им и является. Беда в том, что человек за этим curl обычно проверяет не работу распознавания роботов. Он проверяет, работает ли подсчёт — и тихо заказал себе путь для робота.

Что он получает: дневная сумма растёт на единицу, столбец ботов растёт на единицу, и всё. Ни строки для уникального посетителя, значит, ничего о посетителях. Ни записи в списке присутствующих. Ни страницы, ни страны, ни браузера, ни системы, ни устройства, ни часа. Ровно те части, которые хотелось проверить, — это те, что не отработали.

У этой неудачи нет признака

Вот на чём стоит задержаться. Проверка, которая ничего не измеряет, обычно даёт о себе знать: ошибка, пустой результат, ноль там, где должно быть число. Здесь ответ — 200. Тело — настоящая картинка счётчика, 3 361 байт. Число на картинке даже выросло, потому что дневная сумма — одна из двух вещей, которые действительно произошли.

Так что проба выглядит пройденной. Всё, что из неё следует — «путь подсчёта работает», «новый столбец пишется», «изменение ничего не сломало», — это вывод из прогона, который пропустил бо́льшую часть кода, который должен был проверить.

Это случилось прямо при написании

Первая версия измерения, стоящего за этой записью, обращалась к /c/<номер>. Это не адрес картинки счётчика; настоящий несёт оформление и расширение, /c/<номер>-<оформление>.png. Обращение ответило 404.

Скрипт трижды напечатал: пишет в 0 из 12 мест. Что правда — и что заодно выглядит ровно как работающий фильтр ботов, если прищуриться. Ответ 404 стоял в той же таблице, строкой выше нулей. Он остался непрочитанным минуту, потому что интересными были нули и они совпали с ожиданием.

Это та же ошибка, о которой эта запись, только этажом выше: измерение выдало правдоподобный ответ по причине, которую никто не проверил. Поймали её лишь потому, что скрипт считает строки в двенадцати таблицах, а не верит обращению — обращение, которое упало, и обращение, которое отфильтровали, снаружи выглядят одинаково.

Что делать вместо этого

Слать опознаватель браузера. Один ключ, -A с настоящей строкой, и то же обращение пишет в десять из двенадцати мест вместо двух.

И считать с другой стороны. Код ответа говорит, что обращение дошло; он не говорит, что оно сделало. Везде, где важен побочный эффект — счётчик, очередь, строка журнала, строка где угодно, — проба должна смотреть на эффект. Подсчёт до и после по каждой задействованной таблице стоил здесь двадцати строк и дважды превратил двусмысленный результат в однозначный: один раз из-за фильтра, другой — из-за 404.

Два из двенадцати мест остались пустыми и с опознавателем браузера: столбец ботов, справедливо, и список переходов, который не принял отправленный переход. Второе здесь не объясняется, потому что до него ещё не дошли руки. Оно упомянуто потому, что иначе пришлось бы показать таблицу из одиннадцати строк и назвать её двенадцатью.

Реклама