Comments 117
а как насчет капчи? после отправки мессажа сбрасывать флаг наличия капчи в сессии - посетител получает сообщение "Вы ввели неверный код"
Ничего себе :)
На такую тему и такая объемная, серьезная статья.
Спасибо!
Кстати, о капчах. Одно время "администрировал" спортивный форум. На него в один прекраный момент начали рушиться боты, регистрироваться и постить спам. Учитывая весьма небольшой доступ к инструментам администрирования сделал следующее:
1) Создал поле в форме регистрации "В каком году Вы начали играть".
2) Сделал его обязательным
3) Ограничил ввод четырехзначными числами.
Больше ботов не было.
Способы про cookie и JavaScript (AJAX) лучше отбросить - дубовые браузеры все ж попадаются...
Редирект тоже не спасет от Робота.
Остается капча и БД...
Кстати, можно добавить протоколирование IP и разрешить отправлять запрос с интервалом, скажем, не менее 1 минуты. Это можно реализовать в сессии
Вариантов на самом деле тьма, буду стараться пополнять. Спасибо за помощь.
Угу, их тьма, а если предлагать варианты, которые вообще проблемы не решают, то их ещё больше будет.

А таковыми я бы назвал 1, 2 и 4. Ибо они обходятся скриптом в 20 строк, причём, без каких либо глубоких знаний. А первая предложенная форма в варианте 1 с сайта roscripts так вообще отправляется сколько хочешь раз путём простого нажатия на Ernter, то есть на 2 клика меньше чем предусматривала описанная выше "автоматизация".
Когда читал, то имел в виду это "Как вы сами понимаете, простое нажатие кнопки F5 на клавиатуре снова отправит вам письмо. Ну а автоматизировать данный процесс, повторюсь, совсем не сложно."

Сейчас внимательно прочитал смысл фразы. Понял, что она двухсмысленна. Я её прочитал как "Ну а автоматизировать нажатие на F5, повторюсь, совсем не сложно."
UFO landed and left these words here
Как-то пришло с формы обратной связи порядка двухсот писем спама. За небольшой промежуток времени. Все письма были отправлены с разных IP, но одним ботом.
Кроме того, не забывайте, что есть локальные сети с одним внешним IP. И не исключена вероятность того, что не 10 разрешенных Вами, а 11 пользователей в сутки из этой сети захотят отправить сообщение. Так что бан по IP - это далеко не панацея.
Эээ, я не понял, варианты с 1-го по 4-ый зачем? Кто-то будет сидеть и 60 часов тыкать в браузере F5, вместо того, чтобы за 10 секунд написать скрипт с зацикленным вызовом curl? Особенно умиляют варианты с куками и редиректами. Какая наивность!

Всю статью можно свести к двум словам: "IP, капча". Всё. Остальное - бесполезный информационный мусор, да еще и с картинками зачем-то.

Валяйте, минусуйте.
Вы прочли, что я написал, или нет? Про 60 часов тыкать F5 - это ересь, и в таком ключе я ничего не писал.
Писал вам длинное сообщение, а браузер, как назло, вылетел, не выдержав моего раздражения.

Вкратце: вы описываете отправку путем нажатия F5, приводите картинку браузера - зачем? Вы вспоминаете про автоматизацию процесса, но слабо представляете как это происходит. Скрипт плевать хотел на ваши куки и редиректы, он даже не загружает страницу, которую сервер ему выдает в ответ на запрос POST. Записывать в БД - плохая идея, база забьет место на хостинге и весь сайт остановится. Все сообщения можно делать с разным случайным текстом, проверка сообщений на одинаковость - ерунда.

И уберите из текста "дерби" и 3 глагола с лишним мягким знаком.
Про Ф5:
В некоторых браузерах можно тыкнуть галку - обновлять страницу каждые хх секунд.
Ещё можно положить что-нибудь тяжёлое на саму Ф5 :).
Сделать это гораздо проще, чем написать скрипт.
Конечно! Однако пункт 3 я всё-таки бы не сбрасывал со счетов, разумеется как дублирование сообщений в почту. Обойти ограничение по ip при желании можно. И искать в куче мусора нужное письмо будет довольно сложно. Да и почтовик может начать брыкаться. База всё-же удобнее и надёжней.
а кстати что бы убить все письма с фидбэка можно было бы просто отсортировать письма по отправителю и убить всю пачку. и времени убито былобы значительно меньше:) но йет так, к слову)
Проблем с фильтрацией можно избежать, если письма с формы слать на отдельный ящик, если такой возможности нет, то добавлять к письму нужный заголовок или фразу в тему письма.
дабы избежать F5, как правило ставят внутри реврайт руль на ту же страницу, только с #message
правда, эта страница загружается заново и необходимо каким-либо образом помнить о том, что в предварительной загрузке было совершено.
честно говоря не проверял, смогут ли они так быстро передаться и забраться назад )
наверно да, но я чаще использую свистки (.../?action=[чё_там_было]), хотя это неверное решение.
не просто "как всегда" после обработки поста редиректить куда нужно?
зависит от потребности, функционала, ситуации.
правил в поведении как таковой не существует, надо по месту головой думать.
все связанное с ф5 это бред. веб-программист, который после _любого_ пост запроса не отдает редирект через header location, профнепригоден.
а от спам-скрипта, занимающего от 2 до 10 строк в зависимости от сложности "защиты", поможет только капча.

вот более интересная тема - это рассылка спама через фидбэк-формы, путем инъекции заголовков (пример: subject=\r\nCc: user@aol.com\r\n). в связи с обилием "похапе-программистов", пишущих что-то вроде mail('my@mail',$_POST['subject'],...) это уже довольно распространенная практика.
ха!
посмотрел и понял, что у меня во всех формах всегда заголовок стандартный, заданный заранее - для удобства визуального восприятия, а вся получаемая инфа, в т.ч. контакты - в теле письма )))
а можно про профнепригодность поподробнее, да с аргументами? а то пока что это выглядит бредом.
ну и вы, конечно же, профпригодны, правда? ))
Ну, помните, миркосовты рассылали бесплатные диски с сервиспаком для хп? Вот там и был пример профнепригодности - заполняешь форму один раз, сабмитишь, потом Ф5 пока не надоест и получаешь потом по почте пачку дисков. Где-то тогда проскакивала история про одного чудака, которому не лень было тыкать на кнопку очень много раз и его фотка с несколькими сотнями этих дисков. Уж не знаю что он с ними потом делал.
Это реально работало - я раз пять ткнул, пять дисков и получил. Что удивительно, все диски в одном почтовом отправлении, то есть кто-то все заказы потом сливал в один. Конечно, это был верх профпригодности :).
Сделал на своих сайтах простенькую проверку, которая пока что справляется со спамом: добавил в форму тестовое поле с CSS-классом, которому в таблице стилей задал "display: none;". В скрипте, обрабатывающем отправку сообщения, сделал проверку на это поле — если переменная имеет ненулевое значение, значит письмо является спамом, ибо человек в невидимое поле значение ввести не может.
помоему там и type="hidden" можно просто применить, однако если отправлять скриптом - пофигу, что угодно любому полю можно присвоить.
в случае CSS - можно отключить стили вовсе.
> однако если отправлять скриптом - пофигу, что угодно любому полю можно присвоить

Не совсем понял, что ты этим хотел сказать? О том и речь, что скрипт чаще всего заполняет ВСЕ поля формы. В моём случае даже те, которые не надо.
очень просто.
серверный скрипт.
если твой алгоритм виден на клиенте - не имеет значения, каков он, спасёт только от неумелых шалунов.
Серьёзные дяди с формой пока не баловались. Неумелые шалуны, да и только...
Написал же, "пока что справляется".
Спасает не только от шалунов, основной спам на блоги идет с ботов которые либо сами ищут цель, либо работают по базе целей.
Такая простейшая проверка отсекает практически все стандартные боты, мне кажется, им просто смысла нет париться с проверкой стилей поскольку целей тысячи. Есть и такие которые проходят, но после создания небольшого списка спам фраз и ip они отрезаются. Получается вполне пригодное, но не универсальное решение.

Проблем больше с биоботами, от которых защититься несколько проблематичнее.
массовые спамы по гостевым и блогам меня мало интересуют .эти вообще редко проскакивают где либо.
а вот что уже касается индивидуально направленного скрипта, после изучения сайта - это то вот и есть проблема.
и я не считаю проблему решённой, пока есть хоть один вариант обойти защиту.
н еимеет значения придумал я или кто-то этот вариант или нет, смог реализовать или нет - меня лично она будет сверлить до последнего, пока не будет решена.
Из опыта скажу что капча тоже не спасает, если задействован человеческий фактор.
Самый оптимальный вариант генерировать UID формы и хранить его в хешфайле на сервере со сроком жизни скажем 15 минут.

Как только произошел пост - хеш грохается и повторного поста с таким UID уже не будет. Подробно есть здесь, и ещё полезное здесь.
УИД формочки как раз полезен для предотвращения от повторной отправки данных при заполнении формы в браузере. Как уже сказали, никто не будет ночь напролет давить F5, а для работа не проблема получить HTML-код формы, выдрать УИД и запостить данные.
P.S.
Ссылки одинаковые.
Не хочу вас не в чём убеждать, но ссылки которые я привёл вы либо не прочитали, либо читали невнимательно. Вторая ссылка описывает алгоритм действенного метода защиты формы.
Что до общей темы, спаммеры тоже читают ваши топики :)
> Вторая ссылка описывает алгоритм действенного метода защиты формы.
еще раз: ссылки одинаковые.
адреса ссылок совпадают. но за задание направления поиска спасибо
На самом деле решение очень простое.
Панацея - таймауты.

Формой обратной связи на сайте с одного и того же IP в течение суток редко пользуются дважды. Ещё реже - большее количество раз. Можно просто выставить таймаут после первого сообщения полчаса, после второго - 6-12 часов.
по моему это первая по-настоящему здравая мысль из всех тех, что здесь уже написали
Скорее после первого сообщения таймаута не надо, потому что нормальный пользователь может прислать небольшое дополнение к своему предыдущему сообщению. Ну, забыл что-то, бывает. А после второго сообщения - да, большой таймаут.
Зависит от сайта, где размещена форма. Если это обычный сайт какой-то компании, то вероятность, что какой-то клуб всем составом решит написать что-то в форме обратной связи, очень низка.
У некоторых операторов сотовой связи внешний IP (GPRS) один и тот же для огромного числа пользователей.
Я вот думая в одном из проектов убрать капчи с форм комментов. Неправильно это — пользователь должен оставлять сообщения, а не доказывать, что он не робот. Защиту хочу сделать на основе бейсовского алгоритма. Как защита от спама в рекламых объявлениях технология хорошо себя зарекомендовала, сейчас есть желание проверить на комментариях.
Ну грубо говоря черный и белый список слов. Сперва обучаемся, ручками говорим, что вот это комментарий хороший, а вот этот плохой. В итоге получает базу слов с весом каждого слова. Потом, после обучения, анализируем слова в комментарии и исходя из общего веса всех слов в комментарии решаем является он спамом или нет.
Смотря какой комментарий, если очень большой, то подтормозит, но не сильно, а если нормальный, то незаметно никакого торможения.
Нужно уметь искать
http://ru.wikipedia.org/wiki/Теорема_Байеса
Дальше в гугле по словам "Байес спам" находится несколько тысяч ссылок
Извращенски для защиты комментариев.
Почтовый спам фильтруют Байесом, потому что других способов просто нет. А в формах комментария можно и проще поступить.

Однако ваша фраза про робота чертовски верна. Я ее нигде никогда не использовал.
Это интересно в первую очередь мне. А если это уберет преграду для пользователей, то я буду вообще доволен. Говорю же, такая система работает у нас при добавлении объявлений. И нареканий нет.
В дополнении MODx по управлению формами (eForm) изначально встроена проверка на возможную повторную отправку (для этого есть специальное контрольное поле, которое содержит код для проверки). То есть банальный F5 не прокатывает однозначно. Но это фактически не мешает организовать две независимые отправки. Из прочих замеченных моментов.

1) Содержимое спама все же разное, поэтому хранить хэши писем не выход однозначно.
2) Письма отсылаются не за раз пачкой, а с временными промежутками (несколько часов, день, два), поэтому всякие таймауты не спасут.

Нужна однозначно капча. Причем грамотная. На сколько я понимаю, капча Гугла (ветер в шрифте, затрудняющий выделение одного символа) считается пуленепробиваемой :-)
Видать за них просто взялись сурьезно. Вот и приходится делать что-то вроде этого.
Я думаю если бы их не долбили целыми днями, они были бы рады вообще без капчи обойтись.
Здорово, когда я там регистрировался,
китайских иероглифов еще не было.
Недавно читал, что капча Гугла уже не такая пуленепробиваемая - вскрывается каждая 5-я.
Кстати, в одном блоге поставил ajax reply для комментариев - ни одного спам-комментария не видел с тех пор :)

Хотя явно для спама регистрируется большое количество ботов.
Очень удобно получать обратную связь с сайте не на почту, а в RSS.
UFO landed and left these words here
А можно добавить в секцию капчи, благородную и полезную reCaptcha? =)
Она помогает делу распознавания книг :)
хм любая картинка, которая показывается - уже как-то распознана до нас для проверки вводимого слова. Они их уже давно распознали)
на сайте, вот тут, подробно описан алгоритм: человеку для распознавания представляется капча составленная из 2-х элементов: искуственно искажённая и фрагмент, нераспознанный системой OCR. если человек распознаёт первую часть, то считается, что он как-то распознал и вторую. решение о корректности распознавания второй части принимается по рейтингу совпадений (в результате нескольких попыток разных людей).
Хоспади... понаписывали тут такого...
Толковая капча, и редирект - все, что нужно. Зачем выдумывать велосипеды на квадратных колесах?
Бред какой-то, не судьба не вешать на нормальную почту форму обратной связи,
а создать отдельный ящик и сразу нет проблем пропустить важное письмо от начальства и только небольшой шанс от заказчика (да и то только нового, который будет пользоваться злощастной формой).
насчёт редиректа - бывает так что он не нужен или не стоит изгаляться с ним. Т.е. данные обработаны, всё занеслось - получите спасибо, а не редирект на слово спасибо. Способы 3 и 4 тоже обходимы. А вот капча... Капча это капча и с ней уже ничего не поделаешь. Цифровые чтобы прочитать - придётся очень умного робота писать для различия. Да и сейчас уже приходят к капчам вида "нажмите это, сочитайте это".
редирект надо делать через заголовок Location, а не мета-тегом, тогда и POST в контексте сохранен не будет, и клиент ничего не заметит. и редирект, как кто-то правильно выше заметил, стоит делать при любом успешном POST'е.
Вы случайно не Владимир из транспортной компании? ( http://habrahabr.ru/blog/spam/37816.html ) :)
Использую формы с тупым вопросом в конце, вроде "Как звали Ивана Грозного?" и т.п. Помогает безотказно.
Про Каптчу на последнем РИТе говорили на семинаре про юзабилити: "Простая взламывается, а сложная - сложна самому посетителю. Не стоит использовать Каптчу." На очевидный вопрос, что же делать со спамом, лектор сказал: "не морочьте голову, всё это решается техническими способами".

Программист _должен_ построить защиту от агрессивного дурака. Любая форма без защиты - это не форма, а сырая заготовка.

Решать проблему через БД - оптимально, имхо. Хранить в отправляемых сообщениях параметры отправителя (ИП, браузер и т.п.). И на уровне триггеров внести запрет для записи дубликатов, либо часто отправляемых, либо в большом количестве отправляемых с одной подсети и т.п.

Триггеры фильтруют, а скрипты по крону отфильтрованное отправляют на почту.
я вот тут подумал, но в несколько другом направлении... Есть форма коментариев, защищена капчей, нельза ли сделать так чтоб после первого удачного ввода капчи в кукисах или в сесии прописывалось чтото вроде captch=off и на протежении дня следующие комментарии можно вводить без капчи...
Куки можно подделать. Разве что, если в нем не записано значение той же сессии.
Да без разницы что там написано, зашел браузером, заполнил, отправил, получил куку и отдал боту.
"атака" через F5... конечно, повеселил автор :) соответственно, все его методы, кроме капчи - от реальной атаки вообще никак не спасают (ну способ с базой спасает почтовый ящик, но как защитить саму базу?)
Пожалуйста, читайте внимательней.
Я не предлагаю атаковать через F5.
ну тогда объясните - от чего защищают способы 1-4?

способ 1: улучшает юзаблити, не спасает от атаки
способ 2: улучшает юзабилити (конечно, редиректить нужно в хедере), не спасает от атаки
способ 3: ухудшает юзабилити на стороне адресата, облегчает задачу ДОС-атаки на сервер
способ 4: ухудшает юзабилити, не спасает от атаки
способ 5: ухудшает юзабилити, сильно затрудняет атаку

делаю вывод, что содержимое поста не соответствует заголовку
Редирект как раз юзабилити улучшает. Ибо если я нормальный человек, отправил форму и нажимаю F5 - наверняка я не хочу отправить точно такую же форму еще раз. Очень справедливо для любых форумов, гостевых и книг и т.п. Только я бы делал через заголовки (в php header('location: ......'); )
От атаки не спасёт. :) Тут только капча и база данных.
Для противников капчи:
Можно сделать как сделал гугл в гмейл. Если несколько раз вводишь не правильно логин и/или пароль, вываливается капча.
В нашем случае можно сделать так - первый раз отправляеться на мыло. Айпи адрес заноситься в сессию/куки/базу. Если человек(бот). Если человек(бот) попытаеться зайти на страницу для отправки сообщения еще раз уже выводиться капча. В итоге мы получим 1 нежелательно письмо от одного айпишника. Можно пойти дальше, определять бота заранее. Выводить невидемое поле в форму, которое человек не под каким предлогом не смог бы заполнить, так как просто ее не видит, а бот может, поэтому фильтруем эти сообщения. Защита работает только в том случае, если спамеры не хотят заспамить конкретно ваш ящик, а если хотят нам поможет способ с капчей описаный выше.
Все равно база данных используется :)
Хотя такой вариант, конечно, для людей лучше
UFO landed and left these words here
Блокировать два сообщения подряд по IP - это не корректно. Если кто-то хочет написать PS или что-то добавить к письму, это уже будет невозможно благодаря вашей защите.

Достаточно поставить капчу - со всеми остальными мерами не согласен. Не буду повторяться, так как они уже были раскритикованны выше.

Спасибо за статью и удачи в борьбе с гнусными спамерами :)
>Ajax.Form.Mootools - [Описание + Демо]

спасибо за эту линку! очень замечательный ресурс!!
Я вот только одного не пойму - какой смысл присылать спам через форму сообщений?
А какой смысл каждый день по 10 раз предлагать мне купить недвижимость в Москве или быстро изучить английский? :) Это спам, тут не надо искать смысл - надо строить оборону
А я не понимаю - зачем светить РАБОЧИЙ е-майл?
Неужели нельзя завести отдельный только для формы сообщений?
Неплохая идея, но спам есть спам - все равно придется разгребать :)
Еще вариант: На стороне сервера создается сессионная переменная, которая прибавляется к именам полей форм.
именно так делается в рейлз 2.0, если форма старая вываливается сообщение. token - меняется
через некоторое время.
Мы добавляли session.id и вполне успешно :)
Главное, не придавать элементам формы в коде никакой уникальности, кроме name, иначе бот легко обучаем находить нужное поле без использования name. Также можно произвольно менять местами поля формы в html, а визуальное позиционирование задавать через css.
В этом случае у бота один вариант - заполнить все найденне инпуты наобум и сабмитить форму.
Здесь для надежности можно добавить несколько фейковых полей, не визуализируемых у пользователя, но заполнение которых воспринимается сервером как действие бота.

Кто-нибудь видит в этом минусы, кроме плясок с бубном для разработчика?:)
Сессия в большинстве случаев будет работать только при установке COOKIE (для бота это не проблема, просто принять и сохранить переданные заголовки). Менять имена и параметры полей — хороший выход.
Прежде всего, забудьте о браузерах. Спамеры посылают прямые HTTP-запросы пачками через специально написанные проги и им пофигу браузеры с их F5 и даже F13:). Не нужна для этого никакая Опера. Функционал нужно реализовать ТОЛЬКО НА СТОРОНЕ СЕРВЕРА.

Во-первых, это тесты на человечность. Если уже делаем капчу, то стоит добавить к ней звуковой вариант, о чем уже говорилось на хабре.

Во-вторых, тайм-аут. Можно сделать его гибким (2 сообщения в 10 мин, 3 сообщения в час и т. д.).

В-третьих, это фильтры. Если в форме на сайте не предусмотрена возможность вставки картинок - то любые сообщения с графикой сразу же убиваем. Большая часть остального фильтруется с помощью регэкспов (viagra, v1@gr@ и т.д.).

Как действуют спамеры? Сегодня уже известно, что они перекладывают разгадку капч на "леммингов", за деньги. Логично, что по мере фильтрации целевыми серверами массовых запросов с одного IP спамеры и рассылку перекладут на плечи леммингов, то есть лемминг должен будет скачать программку с базой сайтов и скриптов для подхода к ним, которая после разгадки капчи будет слать адресату спам, укладываясь в тайм-аут, с IP-шника лемминга. Для учета и контроля капча вместе с отгадкой передается спамеру. Но! при таком методе добросовестный лемминг может скачивать и разгадывать капчи, отправляя их спамеру для контроля, но не отправляя сообщений жертвам - и спамер не сможет это проконтролировать! Еще и других леммингов подобьет на это, а реализовать подобный фильтр можно с помощью обычного файрвола.

Таким образом получается, что залогом существования и процветания спамеров и прочей нечистой силы интернета является:
1) массовая компьютерная неграмотность пользователей, приводящая к заражению их ботнет-вирусами (классический спам, DDoS);
2) массовое желание заработать на тупой и в общем-то дешево оплачиваемой РАБоте леммингами (и отсутствие мозгов для более экологичного и выгодного их применения);
3) гражданская пассивность этих самых леммингов, неосознание последствий своих действий (чему они своими действиями способствуют).

И спам (вместе с вирусами, DDoS-атаками и т. д.) из технической проблемы в конечном итоге превращается в социальную. Спам существует потому, что мы все позволяем ему существовать. Посмотрите, что происходит при реализации всех технических средств. Владелец сайта предоставляет каждому пользователю-человеку возможность один раз высказаться (отслеживая по IP, времени и капче). Несознательный пользователь же продает свое слово спамеру, за доли цента, и вместо полезной обратной связи несет сайтовладельцу рекламный мусор. Чтобы бороться с этим, нужны не только технические методы, но и просвещение пользователей, и предоставление им альтернативных более экологичных и выгодных способов заработать. Спам - это вопрос экологии: важно не только заводские трубы фильтровать, но и чтобы рядовые юзеры налево и направо не сорили.
Сегодня буквально столкнулся с данной проблемой. Все комментарии на моем сайте автоматически отправлялись на мою почту, ну и естественно не обошлось от доброжелателей с сообщениями типа "cool website" и "xxx". Пришлось написать спам фильтр, который, кстати, хорошо себя показал. Со вчерашнего для ни одно спамерское сообщение не попало мне на почту (собственно как и на сайт), но они были (сделал спец.ловушку для этого, если срабатывает спам-фильтр - срабатывает соответствующий счетчик). Вот так вот.
В довесок к IP-ограничениям (или вместо их) можно добавить совсем-не-юзабельную проверку введенного e-mail'а.
Перед отправкой сообщения у пользователя требуется ввести свой реальный e-mail, на который отправляется ссылка для подтверждения сообщения. Бот, конечно, может и получать почту, и читать её, и даже переходить по ссылке, но тут уже можно фильтровать по email'у - не более 2-х сообщений с одного домена, исключая популярные почтовые домены вроде @yandex, @yahoo, @gmail, @etc.
Плюс: без особых ухищрений можно реально ограничить количество "подтвержденных" сообщений
Минус: юзабилити ни к черту, база тоже нагружается не слабо

PS. Вариант от "foboss 19 марта 2008 11:21" использую и сам кое-где, реально помогает. И даже лучше чем графическая капча, потому как пока мне не втречался бот, умеющий это дело проходить. Дополнительно варианты вопросов можно разнообразить с помощью опечаток или Йода-style.
Как-то так...
Остаются био-боты (лемминги-китайцы, заполняющие каптчу), с которыми черт знает, как боротся.
Боты импортные? Лемминги импортные? Аудитория ресурса — рунет?
Делаем капчу на русском языке и не паримся! :))
Only those users with full accounts are able to leave comments. Log in, please.