Блог Дмитрия Волотко - Это нормально © Подпишись на обновления!

Как защитить свою форму обратной связи от атаки?

Представьте такую ситуацию.

Приходите вы на работу, садитесь проверить почту, рассчитывая увидеть ответ от партнёра, немного спама, а вместо этого видите вот такое: Входящие (164 532).

Картинка, естественно, фейковая.

Причём вся почта пришла с формы обратной связи вашего сайта. Вам приходиться разбираться в десятках тысяч писем, и даже если они легко идентифицируются и удаляются – вы потратите огромное количество времени на решение вопроса, тем более что надо быть внимательным, что бы не пропустить действительно нужную корреспонденцию.

Несложно посчитать, сколько писем может придти с формы обратной связи всего с одного компьютера злоумышленника за выходные.

В пятницу рабочий день заканчивается в 18.00, предположим в 18.30 офис закрывается на ключ. В понедельник рабочий день начинает в 9.00, ну а открывают офис, к примеру, в 8.00. Итого имеем 61.5 час на то, что бы злоумышленник не опасаясь быстрого разоблачения занялся делом. Предположим он спамит (а сделать это можно даже с помощью браузера) в 10 потоков, т.е. он одновременно может отсылать 10 писем. Если он будет отправлять письма раз в три секунды, то утром понедельника, в 8.00 мы обнаружим 738 000 писем. Естественно, потоков может быть больше, время между отправками писем меньше, да и компьютеров, вовлечённых в этот процесс может быть десятки, а то и сотни.

Но потеря времени не самое страшное, что может случиться, вы случайно можете удалить письмо клиента, или распоряжение директора, который находиться в длительной командировке. А потеря таких писем грозит не только взысканием с работника, но и серьёзными финансовыми потерями компании.

Также, из печальных последствий, могут возникнуть серьёзные проблемы с хостинг провайдером, на площадке которого размещён ваш сайт. А если сообщение из формы обратной связи уходит на почтовый ящик, который расположен на другой хостинг-площадке (особенно если она бесплатная), то ваш домен может попасть в чёрные списки, из которых выбираться довольно – таки хлопотно.

Подобные формы обратной связи буквально заполонили Рунет. Их десятки тысяч, а это значит, что среди них может оказаться и ваша компания. И в любой момент ваш рабочий процесс может остановиться по первому желанию злоумышленника. Ведь электронная почта в большинстве случаев самое важное средство коммуникации многих компаний.

К сожалению, наказать злоумышленника, даже если вы точно знаете кто это, практически невозможно. Вот как это комментирует один из сотрудников отдела по борьбе с компьютерными преступлениями города Санкт – Петербург:

Фактически, на сегодняшний день сфера компьютерных преступлений – слабое место в законодательстве РФ (да и в мировом, по большому счету тоже) и пока что не заметно существенных сдвигов в этой области.
На данный момент мы располагаем тремя основополагающими статьями УК РФ, касающимися напрямую данной области.

Глава 28 УК РФ.
Преступления в сфере компьютерной информации
Статья 272. Неправомерный доступ к компьютерной информации
Статья 273. Создание, использование и распространение вредоносных программ для ЭВМ
Статья 274. Нарушение правил эксплуатации ЭВМ, системы ЭВМ или их сети

И дополнительной поправкой к федеральному закону “О рекламе” от 13.03.2006 N 38-ФЗ, введённой 1 июля 2007 года:
Статья 18. Реклама, распространяемая по сетям электросвязи и размещаемая на почтовых отправлениях

Таким образом, данное действие, совершаемое преступником, попадает под действие статьи 274. Нарушение правил эксплуатации ЭВМ, системы ЭВМ или их сети, т.к. при достаточном количестве запросов, создается т.н. DDoS-атака, влекущая за собой
(цитата: блокирование охраняемой законом информации ЭВМ) и ВОЗМОЖНОЕ наказание, в виде
(цитата: лишения права занимать определённые должности или заниматься определённой деятельностью на срок до пяти лет, либо обязательными работами на срок от ста восьмидесяти до двухсот сорока часов, либо ограничением свободы на срок до двух лет. )

Но в данном конкретном случае дело будет прекращено практически сразу же, за фактическим отсутствием состава преступления, т.к. даже при изъятии ПК подозреваемого, на нем невозможно будет найти следы злонамеренности произведённых действий, которые бы нельзя было описать несовершенством данного конкретного программного обеспечения, установленного на данном ПК.

Даже в том случае, если пострадавшая сторона будет настаивать на продолжении расследования, будет необходимо со 100% точностью воссоздать ситуацию, при которой может происходить аналогичная ситуация, а также послать запрос разработчику ПО, вероятнее всего, вызвавшего сбой и разработчикам ПО, непосредственно взаимодействующего с ним, т.к. ситуация не обязательно была или может быть вызвана лишь одной из программ, а не ошибкой их взаимодействия. А это в свою очередь может занять не один и не два года. Поэтому наказать преступника просто не представляется возможным.

Теперь давайте посмотрим, как работает уязвимая форма обратной связи.

В большинстве случаев форма обратной связи отправляет информацию методом POST, либо сразу через функцию mail(). Не будем углубляться в дебри, но эти решения грешат возможностью автоматизации отправки огромного количества писем на ящик, в который уходят сообщения из формы обратной связи. Вот посмотрите предупреждение браузера Firefox2 о повторной отсылке информации на сервер:

Браузер Mozilla Firefox 2.0.0.12

Как вы сами понимаете, простое нажатие кнопки F5 на клавиатуре снова отправит вам письмо. Ну а автоматизировать данный процесс, повторюсь, совсем не сложно (хотя бы с помощью Opera).

А теперь давайте поговорим о том, как можно исправить положение, не отказываясь от формы обратной связи.

Я предлагаю пять вариантов, каждый вариант обладает как положительными сторонами, так и отрицательными.

Вариант номер 1:

Ajax.

Вот несколько из них:
AJAX contact form – [Описание][Демо]
An AJAX contact form – [Описание][Демо]
Ajax.Form.Mootools – [Описание + Демо]

Хорошо: множество готовых примеров; сообщение отправляется без перезагрузки страницы;

Плохо: если у пользователя отключён JavaScript – то форма работать не будет.

Вариант номер 2:

Редирект.

После отправки сообщения – моментальный редирект на любую другую страницу, к примеру на страницу с формой. Над формой можно вывести сообщение, что письмо отправлено.

Сделать это можно несколькими путями, самый топорный – это через META-теги:

<meta http-equiv="refresh" content="0; url=index.html">

Хорошо: работает, и в большинстве случае помогает;

Плохо: у этого решения отвратительное юзабилити.

Вариант номер 3:

Работа с БД.

Форма отправляет сообщение не на почтовый ящик, а складывает в базу данных. Соответственно можно отсекать попытки спама просто и незатейливо. К примеру запись не вноситься в БД, если содержимое полностью совпадает с содержимым предыдущего сообщения, при условии того, что IP у отправивших одинаковые, либо из одной подсети. Тут можно придумать массу вариантов. Сообщения из формы обратной связи могут быть интегрированы, к примеру, с CRM.

Хорошо: на мой взгляд очень хорошая защита;

Плохо: требуется база данных, увеличивается время работы скрипта, увеличиваются требования к мощностям (если сайт популярен, то особенно), обмануть всё-таки можно.

Вариант номер 4:

Cookie.

При нажатии на кнопку “отправить” можно записывать браузеру куку, при наличии которой повторно отослать сообщение можно только через некоторое время.

Хорошо: способ работает, потенциальное количество спама уменьшается;

Плохо: куки могут быть отключены (специально или нет – но вы же не запретите отправку сообщения только потому, что куки отключены), куки можно стирать автоматически.

Вариант номер 5:

Captch.

Капча (если он не кривая) спасёт от спама через форму обратной связи.

Вам помогут ссылки:
reCaptcha
CAPTCHA.ru
Cryptographp
w3captcha

Хорошо: способ действенный;

Плохо: лично мне капча неудобна, особенно сложные, капчу могут распознать и обойти.

Стоит учесть, что абсолютной панацеи всё равно нет, просто эти способы (которые, кстати, легко можно модернизировать, совмещать и т.п.) помогут отгородиться от проказ молодых и неопытных сетевых хулиганов.

Удачи.

Так же можно почитать:

# 18 March 2008 в 22:31

Emm

А куки? :) ведь можно же, после первой отправки сообщения поставить куку на минутку другую времени), а при следующей отправке проверять на ее существование…

# 19 March 2008 в 0:49

Волотко Дмитрий

Emm, точно, не подумал – сейчас допишу, спасибо!

# 19 March 2008 в 4:25

Greignar

Все это надумано. Заспамление такой страницы возможно в случае если она сгенерирована древним скриптом или сам скрипт написан школьником “на коленке”!

Ищите современные скрипты или заказывайте их у профессионалов…

# 19 March 2008 в 4:48

Волотко Дмитрий

Greignar, ну лично у меня таких проблем нет, а 8 из 10 форм, найденных в Яндексе по запросу “форма обратной связи” – бажная.

# 19 March 2008 в 5:49

Greignar

Если с вами такое не случается, тогда для чего сгущать краски?

Какая разница вам, что они бажные? Думаете они сразу после этой статьи пошли все исправлять? Может вы и готовое решение привели? Ничего у вас нет, просто это рассуждение на актуальную тему…

# 19 March 2008 в 6:01

Волотко Дмитрий

Greignar, да, это рассуждения на актуальную тему, а почему нет?

# 19 March 2008 в 13:02

Greignar

Было бы намного лучше, если бы эти рассуждения несли что-то новое, что в случае реализации принесло ощутимую пользу.

1. Аякс хорош, но возможны проблемы с кросбраузерностью.
2. Редирект? Он не спасает от кнопки “назад” браузера.
3. БД? При наличии капчи проверки в БД не нужны. Мало кто будет вводить капчу подряд 164 532 раз.
4. Cookie? Нужны, но только не для времени хранения последнего комментария, а вот для хранения хэша капчи – в самый раз. Почему капчу не стоит привязывать к ip? Да потому, что с одного ip могут зайти несколько посетителей, которые будут конфликтовать м-у собой. Именно поэтому не стоит налагать бан на ip.
5. Капча? Она во многих случаях просто незаменима!

И от себя…
1. Блокировка по черным спискам сайтов, тех что СПАМер вводит в поле url формы
2. Блокировка нежелательных выражений в сообщении, например при вводе двух и более url адресов, на viagra, xxx и прочее (при желании на мат и албанизмы)…
3. Запрет копипаста – это когда считаются нажатия клавишь, и если их количество меньше определенной доли от длины сообщения – блокировка. Спорное решение, но достаточно действенное
4. Преобразование url формы в графическое представление. Аналогично спорное решение, но кому нужны неосмысленные комментарии?

P.S. Один, наиболее действенный и безотказный вариант афишировать не буду…

# 22 March 2008 в 0:49

aedus

вряд ли кто вручную спамит формы, тут ты перегнул.
Капча – выход, нормальный вполне. Главное он перешел в стандарт. Еще вариант – ниспадающий список. Это из самых примитивных. Как ни странно у одного моего буржуйского клиента оказался самым верным, когда с капчей возиться неохота было.
User Agent + IP / кука – средства вполне нормальные, но только для таймаута, никак не сообщения.

# 22 March 2008 в 1:01

Волотко Дмитрий

2_aedus, я писал это под впечатлением от того, что форму обратной связи и заказа услуги целенаправленно забили письмами одинакового содержания. Мастеров вычистить всё не нашлось, пришлось им просить хостинг-провайдера помочь с проблемой, но как итог – работа в офисе стояла почти целый день. Контора маленькая, веб и коммуникации у них неряшливые во всех смыслах, сам знаешь, наверняка встречал таких в сети.

# 22 March 2008 в 7:39

Greignar

aedus, спамят именно вручную, по крайней мере такие сообщения проходили! Ради эксперимента я убирал капчу за пределы формы, крутил символы – не помогало. Изменял шрифт так, что даже посетители жаловались – не помогало.

По ip я не баню, по крайней мере на автомате. И капчу к ip не привязываю. На одном ip может сидеть не одна тысяча посетителей.

Таймингами вообще не пользуюсь, каждый раз вводить по 6 символов экзотического шрифта, мало кто додумается из хулиганских побуждений.

# 22 March 2008 в 17:28

Волотко Дмитрий

2_Greignar
Просто это ещё раз говорит о том, что нельзя подходить с одним решением к различного уровня ресурсам. Нужно анализировать, что за ресурс. как часто планируется обращение через форму обратой связи или он-лайн заказ.

# 23 March 2008 в 3:16

Greignar

Волотко Дмитрий, изначально разговор велся о форме обратной связи сайта. Соответственно, разговора о предварительной регистрации посетителя перед отправкой быть не должно.

Описанная мной “защита” работает достаточно давно, и не только у меня (больше года лежит в открытом доступе). Раньше даже логировал причины отторжения сообщений, в основе – неправильный ввод графического кода, реже черные списки “полей”, маты, албанизмы, нежелательные выражения…

# 23 March 2008 в 3:27

Волотко Дмитрий

2_Greignar
Подведите пожалуйста черту. Какая метода для вас лучшая? Просто капча?

# 23 March 2008 в 8:51

Greignar

1. Капча
2. Проверка сообщения на нежелательные выражения (маты, албанизмы, фрагменты рекламы)
3. Проверка полей на соответствие черным спискам (url, email, name)
4. Проверка посетителя на наличие ip в черных списках
5. Проверка посетителя на “временный” бан, автоматически (без участия владельца ресурса) установленный в п.2 и п.3
6. Проверка наличия копипаста (было, но сейчас отключено)

Последний, седьмой пункт “светить” не хочу…

# 23 March 2008 в 18:13

Волотко Дмитрий

2_Greignar, почему? :)

# 24 March 2008 в 2:49

Greignar

Волотко Дмитрий, почему последний пункт не указываю? Да потому, что до него можно самому додуматься. Если к вам действительно приходило так много СПАМа, то вы могли найти в ней некоторую закономерность. “Приманка” стоит практически в любой форме интернета (и вашей тоже), остается только парой строк на Перле эту ловушку “захлопнуть”…

Если эта методика будет использоваться “в промышленных масштабах”, то СПАМеры быстро к ней адаптируются, в итоге работать она не будет ни у меня, ни у других…

# 24 March 2008 в 2:57

Волотко Дмитрий

2_Greignar, я думаю я понял о чём вы говорите, правда не до конца в этом уверен. Спасибо за объяснения.

# 27 March 2008 в 22:50

Emm

Есть еще вариант со скрытым полем, т.к. спам-боты заполняют все что начинается на input, можно сделать проверку, и если поле не пустое – блокируем отправку. :)

# 28 March 2008 в 9:47

Волотко Дмитрий

Такой вариант тоже можно считать решением, но я ему не верю.
Ибо есть боты, которые заполняют все поля, а есть те, которые заполняют только имя, вебсайт и мыло.

# 28 March 2008 в 17:33

Emm

>>>а есть те, которые заполняют только имя, вебсайт и мыло.

Интересно, а как они определяют такие поля, на вкус?? :)))

# 28 March 2008 в 17:39

Волотко Дмитрий

2_Emm
name у input и textarea?

# 15 April 2008 в 11:00

Павел

Спасибо, Дима! Замечательный пост!

# 15 April 2008 в 20:52

Волотко Дмитрий

2_Павел,
Паш, да на здоровье!

# 27 Augu 2008 в 21:17

Alexandr

Любопытно. Значит нужно какие-нибудь поправки вносить.



* Должны быть заполнены.
Из-за дикого спама, и нежелания ставить капчу оставлять ссылку у комментария вообще нельзя. Точно так же нельзя оставлять ссылки в теле комментария.