Захист від спаму без капчі

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

Статистика зібрана за місяць, а пастки розставлені не послідовно, а паралельно, тобто бот міг потрапити в декілька пасток одночасно. Нажаль не записав статистики скільки взагалі було спроб додати коментар.. Але мені здається, що це було 864 разів.
А тепер спробую проаналізувати ці результати.
- Захист на пусте поле виявився ефективним, але як виявилось в більшості це було не через те, що боти заповнювали це поле, навпаки, в POST-запиті вони навіть не включали цього поля. А правильна поведінка браузерів - відсилати пустий рядок.
Дуже дивно чому боти без проблем заповнювали поля author, email та content, але не заповнювали поля your_site (це якраз і було це «фейкове» приховане поле)... Можливо вони орієнтуються по назві полей? Тоді є сенс перейменувати фейкове поле на email, а всі решта полей на field1, field2, ... Тоді мабуть боти розгубляться і не будуть знати як заповнювати форму.
Але все ж деякі боти відправляли пустий рядок, або навіть коректно (або не дуже коректно) заповнювали це поле, так що не всі боти такі дурні. - Захист javascript`ом виявився панацеєю від усіх бід! Його ще досі не пройшов жоден бот на моєму сайті.
- Захист підписом зовсім себе не виправдав. Виявилось, що кожен раз коли бот хоче відіслати спам, він перед тим заходить на сторінку з формою і ще раз аналізує форму. А цифра 214 означає, що деякі боти подумали що туди треба текст вставляти і перетирали підпис своїми значеннями.
- Захист українською показав скільки було кириличного спаму. А його є ~38%.
Отож виявилось, що для захисту від ботів достатньо лише захисту javascript`ом. Зробити його дуже просто:
- робимо у формі пусте приховане поле, наприклад так: <input type="hidden" name="signature" id="signature" />
- після цього ставим такий скрипт: document.getElementById('signature').value = '123'
- На сервері перевіряємо чи прийшло нам значення signature=123
І па-па спам боти :)
Це прописано в якомусь стандарті? Тестив на всіх популярних браузерах? Я б краще на це не зав'язувався, бо є ризик натрапити на виключення з цього правила. Думаю з точки зору HTTP пусте поле еквівалентне його відсутності і цим можуть користуватись якісь проксі, стискалки трафіку і тому подібні штуки.
Захист кирилицею - це, вибачте, фашизм. От полечу я в штати, зайду з їх компа без кирилиці і спробую щось написати транслітом. І що? Треба хоча б чесно попереджати про це і давати віртуальну клавіатуру для обділених кирилицею.
П.С. ІМХО джаваскріпта має вистачати з головою.
2 mace: звичайно що пробував, усі браузери відсилають пустий рядок. я деколи переглядаю логи і дивлюсь випадки коли не змогли додати коментар - поки що через Це не було проблем.
Щодо трансліту, то я його не дуже "переварюю", але згідний, про це треба попереджати.
Тепер я не тільки "думаю" а й "емпірично визначив" що джаваскріпта з головою вистачає :) так що найближчим часом зменшу кількість перевірок до цієї одної. А ще перероблю форму на ajax.
А ще я тепер переробив коменти на AJAX і перевіряю чи запит прийшов через AJAX чи через тупий POST, тепер всі боти на цьому валяться.