Ви так захистили свою форму що самі не завжди можете розібрати що намалювала CAPTCHA?
- Ви встановили хорошу CAPTCHA і все одно час від часу у себе в feedback-і читаєте новини
про подовжувачі деяких органів, дешеву віагру тощо?
Ну тоді пропоную під іншим кутом поглянути на проблему захисту Web-форм.
Я припускаю, що ви вже знаєте що таке CAPTCHA, можливо, багато хто з Вас використовує цю технологію в своїх проектах.
Нещодавно я качав файл з rapidshare.com, там потрібно вказати літери на які причеплений кіт.
(Правильна відповідь «X6VK»).
Так от, ні з першого ні з другого разу я капчу «не розпізнав». Невже немає іншого способу ідентифікувати реального користувача? Ймовірно, він є, але ж rapidshare бореться не з ботами а з хакерами, які цілеспрямовано «пробивають» RapidShare.
Так от, в моїй статті мова піде саме про боти, тобто системи автоматичного пошуку Web-форм для їх авто-сабміта, тому що я впевнений що при цілеспрямованій атаці можна засабмитить будь-яку форму, в цьому випадку дії розробника повинні бути спрямовані на максимальне збільшення вартості одного сабміту.
Я проти втягування в цю «війну» користувачів сайту, адже у випадку з RapidShare я став заручником «війни роботів» того що «захищає» і того що «пробиває».
Міф про «непробивність» CAPTCHA
Проблеми злому CAPTCHA добре описав Владислав Мисла. Я раджу скептикам прочитати цю топіку. Нижче я коротко перерахую основні акценти статті.
Немає сенсу зупинятися на програмних вразливостях при реалізації CAPTCHA, коли розробник забуває про те, що
- час існування сесії має бути обмежено
- після отримання форми сесія повинна бути негайно вилучена
- треба перевіряти отримані дані на порожні значення
Основний спосіб обійти CAPTCHA - це її розпізнати. На сьогоднішній день вже існує багато проектів, що займаються виключно розпізнаванням CAPTCHA. Найбільш відомими з них є два: “UC Berkeley Computer Vision Group” и “PWNtcha”. Ступінь успішного розпізнавання в обох проектів досить високий (список CAPTCHA, який вже зараз навчилися розпізнавати).
Для дуже складної CAPTCHA СПАМ-ери практикують використання людського ресурсу. У процесі розпізнавання задіють любителів безкоштовного порно, яким пропонують відповісти на CAPTCHA тест, для перегляду наступної фотографії або відео-ролика. Сам тест, вибирається з форми сервера, на який проводиться СПАМ-атака, відповідь користувача, відповідно вставляється в ту ж форму. Схема дуже проста в технічній реалізації, крім того, любителів порно теж вистачає:).
На чому можна «підловити» Spam Bot
Рік тому, копаючись в phpclasses.org, я натрапив на досить оригінальне рішення на PHP, яке називається Form Spam Bot Blocker. Розробник цього php-класу пішов іншим шляхом, його підхід не вимагає ніякого додаткового введення даних користувачем.
Ця методика базується на тому, як поводиться користувач, а не на тому, що він вводить. Клас створює/> теги із зашифрованими значеннями або візуально приховує поля (засобами CSS), які бачить СПАМ-бот. Комбінація декількох методів може дійсно звести з пантелику СПАМ-бот, навіть якщо він тільки-що прочитав html код. Треба зазначити, що ніякі Capthca-, Session-, Cookie - або Javascript-засновані методи тут не використовуються. Тільки чистий (x) html і маленька вставка CCS.
Базові ідеї:
- Користувач (людина або робот) повинен мати такий же IP і такий же http user agent ID, як на сторінці з HTML-формою, так і на сторінці-обробнику за методом POST або GET. Користувач завжди спочатку відвідує сторінку з HTML-формою, потім переходить на сторінку обробник, роботи так роблять не завжди, оскільки вони часто тільки звертаються до цільової сторінці з обов'язковими параметрами. Іншими словами: сторінка, що містить html форму, повинна бути завантажена перед тим, як передати параметри цільовій сторінці (сторінці, яка приймає параметри. IP і браузер споживача повинен бути однаковими на обох сторінках.
Spambot змушений використовувати такий же IP і агент ID, скануючи і нападаючи
- На користувача не впливатимуть приховані теги, імена яких змінюються щодня.
По суті справи, на користувача вони могли б впливати, якби, наприклад, він зашол на сторінку з формою в 23.57 а послав запит в 0.06 (на наступний день), але є просте рішення цієї проблеми. Ще одна ручна робота для роботи використовувати прескан (попереднє сканування) html сторінки, що містить форму, і надсилати запит з просканованими параметрами. Щоденна зміна прихованих імен параметрів вимагає від робота виробляти прескан html сторінки перед нападом.
Spambot змушений попередньо сканувати форму в день нападу
- Форму потрібно засабмитити в межах певного часового відрізка. Якщо час від завантаження форми до сабміту занадто мало або занадто велике то ми швидше за все маємо справу з роботом. Наприклад, користувач не може заповнити 6 полів менш ніж за 2 секунди...
Spambot змушений засабмитити форму в межах певного часового відрізка,
скануючи і нападаючи
- Spambot буде пробувати заповнити кожен елемент форми деяким значенням.
Це найкраще гарантують успішний сабміт. Якщо стандартний input тег розміщений у формі і візуально прихований від користувача засобами CSS, користувач нічого не введе в це поле. Але дуже ймовірно, що spambot це не «просіче» і заповнить це поле.
Spambot змушений ідентифікувати елементи візуально прихованих форм пасток і знехтувати ними, при нападі
Досвід використання Form Spam Bot Blocker
Кілька тижнів тому я поставив цей клас на досить відвідуваний і навантажений проект в моїй організації. У день реєструється понад 1500-1700 «провалених» спроб засабмитити форму ботом. При кількості легальних сабмітів близько 1200-1400. Поки що відсоток спаму досить низький (швидше за все не від ботів а від «тематичних» спамерів), які частково автоматизують свою працю за допомогою плагінів до браузера.
Можливо, з часом і цей захист будуть «пробивати» багато бот. Але мені сподобався підхід, його можна модифікувати, доставити ще пасток.
У дуже відповідальних формах можна комбінувати з CAPTCHA. Одне іншому не заважає.
Як використовувати цей клас
- Створіть необхідні теги на сраниці, що містить форму
- Опціонально встановіть типові значення у початковому коді класу (public variables)
- Увімкніть клас до вашого скрипту
- Створіть об'єкт: $blocker=new formSpamBotBlocker();
- Опціонально виконайте public-методи або встановіть змінні public для адаптації змінних за замовчуванням до вашої веб-форми
- Виведете в вшей html-формі: print $blocker->makeTags();
Перевірте $ _ POST або $ _ GET масиви на предмет того, чи містять вони
дійсні (valid) параметри html-форми
if ($ _ POST) {//or $ _ GET
$ blocker = new formSpamBotBlocker ();
$ nospam = false;
$ nospam = $ blocker- > checkTags ($ _ POST) ;//or $ _ GET
if ($ nospam) print «it
»






