Повторяю способы защиты, выбирайте любой, который нравится:
Начнем со случая, когад у вас маленький (меньше 100 тыс юников в день/1 млн зарегистрированных юзеров) сайт.
1) Сделать невидимое поле с именем email. 98% ботов-дебилов его заполнят, дальше вы понимаете, что с ними делать и куда вносить их IP. Чтобы не палиться, не пишите style=display:none, а скройте его чуть хитрее.
Этот способ у меня отсеивает практически всех ботов на одном сайте. Правда, там боты, не заточенные под сайт, а просто, которые ходят и заполняют все формы подряд своей рекламой. Типа Хрумера наверно.
2) Заполняемое яваскриптом поле типа hidden. Куча ботов не выполняют яваскрипт. Куки, кстати, наоборот, большинство ботов исправно присылают. Реферер и юзер-агент тоже обычно у них правильный.
3) Более радикальный подход — убрать кнопку submit, заменив ее на div, который по событию onclick собирает значения полей формы и отправляет их аяксом. Аттрибут action тега form сделать указывающим на скрипт-ловушку. Если бот не написан специально под ваш сайт, он тупо не сможет отправить такую форму.
Ок, допустим, вам не повезло, и ваш сайт с миллионами пользователей атакуют спамеры специально написанными скриптами. Что мы можем вам предложить?
4) Добавлять вычисляемые/расшифровываемые яваскриптом поля. Внезапная смена алгоритма шифрования в 2 часа ночи скорее всего сдаст тех ботов, которые смогли через нее пробиться, но не успели переписать алгоритм.
5) Проверять поддержку клиентом Flash (загружать флешку и через нее подписывать форму кодом).
6) Проверять соответствие User-Agent и уровня поддержки технологий HTML5/CSS3 (например, определенные версии браузеров не поддерживают border-radius, другие поддерживают, и тд.)
Более серьезные возможности дают методы статистического анализа. Например, можно вычленять из сообщений несловарные слова (это будут ссылки например) и анализировать источники их отправки. Например, если 1000 пользователей начинает за час отправлять по 100 сообщений не-друзьям с одним и тем же словом super-shop — это явный признак спам-рассылки. Для таких систем надо собирать статистику и писать белые/черные правила, вводить негласные лимиты подозрительных действий, в общем. серьезная работа.
Можно, как вконтакте, привязывать аккаунты к телефонам. это работает.
Еще немного рассуждений на эту тему тут:
habrahabr.ru/qa/16920/#answer_70019
А использование капчи в формах говорит о лени/низкой квалификации/урезанном бюджете или непрофессионализме и причиняет неудобства пользователям.