Коли я місяць тому переробив блог, я поставив простеньку форму для додавання коментарів.. І що б ви думали? Ну звичайно що через цю форму поліз злісний спам! Так, є така проблема — Спам, і щоб її побороти можна поставити капчу. Але капча це додатковий напряг для користувача, тому я вирішив будь-що обійтись без неї, і ставити капчу лише при крайній необхідності.

Отож я подумав і зробив 4 приховані пастки для спам-робота:

  1. Приховане поле, яке має бути пустим. Дурний робот може подумати що це поле потрібно заповнити і заповнить його
  2. Поле, в яке javascript`ом вписується певне значення. Можливо робот не виконує javascript`ів і відповідно він не заповнить це поле
  3. Поле з підписом, згенерованим на основі часу. Тут я припустив, що боти можуть діяти наступним чином: бот знаходить форму на сайті, аналізує її і додає до своєї бази форм, а потім відсилає цю форму N раз на день. Якщо так, тоді він проіндексує цю форму з підписом, але підпис діє лише день, тому бот зможе насолоджуватись відсиланням спаму тільки доки не вийде термін придатності підпису, тобто 1 день. Але тут є небезпека нашкодити звичайному користувачу, який відкриє допис, а коментар вирішить написати через день..
  4. Провірка на українські букви. Так як мій блог є українським - то я провіряю чи є хоча б 1 українська буква, і якщо нема - значить це спам. Це відсікає значну частину англомовного спаму.

Отож я зробив вищеописані пастки і прикрутив статистику наскільки часто об які пастки спотикаються спам-боти. І ось що вийшло:

1 Пусте поле, 2 JavaScript, 3 Підпис, 4 Українська

Статистика зібрана за місяць, а пастки розставлені не послідовно, а паралельно, тобто бот міг потрапити в декілька пасток одночасно. Нажаль не записав статистики скільки взагалі було спроб додати коментар.. Але мені здається, що це було 864 разів.

А тепер спробую проаналізувати ці результати.

  1. Захист на пусте поле виявився ефективним, але як виявилось в більшості це було не через те, що боти заповнювали це поле, навпаки, в POST-запиті вони навіть не включали цього поля. А правильна поведінка браузерів - відсилати пустий рядок.
    Дуже дивно чому боти без проблем заповнювали поля author, email та content, але не заповнювали поля your_site (це якраз і було це «фейкове» приховане поле)... Можливо вони орієнтуються по назві полей? Тоді є сенс перейменувати фейкове поле на email, а всі решта полей на field1, field2, ... Тоді мабуть боти розгубляться і не будуть знати як заповнювати форму.
    Але все ж деякі боти відправляли пустий рядок, або навіть коректно (або не дуже коректно) заповнювали це поле, так що не всі боти такі дурні.
  2. Захист javascript`ом виявився панацеєю від усіх бід! Його ще досі не пройшов жоден бот на моєму сайті.
  3. Захист підписом зовсім себе не виправдав. Виявилось, що кожен раз коли бот хоче відіслати спам, він перед тим заходить на сторінку з формою і ще раз аналізує форму. А цифра 214 означає, що деякі боти подумали що туди треба текст вставляти і перетирали підпис своїми значеннями.
  4. Захист українською показав скільки було кириличного спаму. А його є ~38%.

Отож виявилось, що для захисту від ботів достатньо лише захисту javascript`ом. Зробити його дуже просто:

  1. робимо у формі пусте приховане поле, наприклад так: <input type="hidden" name="signature" id="signature" />
  2. після цього ставим такий скрипт: document.getElementById('signature').value = '123'
  3. На сервері перевіряємо чи прийшло нам значення signature=123

І па-па спам боти :)