Звернутися до підтримки

Відповідаємо електронною поштою, зазвичай протягом двох днів.

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.

Два з дванадцяти місць лишилися порожніми і з ідентифікатором браузера: стовпець ботів, слушно, і список переходів, який не прийняв надісланого переходу. Друге тут не пояснюється, бо до нього ще не дійшли руки. Воно згадане тому, що інакше довелося б показати таблицю з одинадцяти рядків і назвати її дванадцятьма.

Реклама