Защита FormIt от спама


Вторник, Июнь 20, 2017

Проблема с которой сталкивается любой разработчик - это спам с сайта. Конкуренты, злоумышленники, боты и вирусы являются причиной бесконечного спама. В потоке бесполезных писем теряются важные, да и просто ежедневное посещение почтового ящика превращается в сущий ад. В статье мы рассмотрим, как защитить сайт от спама при помощи компонента FormIt, который чаще всего используется для отправки писем в CMF Modx.

Что делать если в Formit сыпится спам?

В сети существует множество различных способов по защите от спама. В ходе своей практике я выявил, какие из них действенны, а какие практически бесполезны и чаще всего не помогают. Итак, давайте рассмотрим, какие способы мы знаем:

  1. Скрытое поле, которое при валидации проверяется на пустоту. Наверно это самый известный способ защиты Formit от спама. У него есть один явный плюс – это то, что визуально для пользователя ничего не меняется и не требует от него, дополнительных действий. Согласитесь, когда вылезает капча и нужно в очередной раз доказывать роботу, что ты человек, пропадает и желание отправлять форму. Поэтому данным способом не стоит пренебрегать. В комплексе он даёт неплохой результат.
  2. Капча. Стандартный метод защиты. Применяется практически везде. Надёжно защищает от роботов. Однако, если человек вручную вбивает спам в вашу форму, то всё равно возможно обойти. Хотя можно считать, что это достаточно действенный метод защиты от спама.
  3. Нестандартные названия полей. Обычно поля в формах называются однотипно – name, phone, email и тд. Боты очень легко подбирают их и используют для вставки своей информации. Но! Если назвать поле не name, а например “oyhrctiorniowtmeriothweirtmxeritwerd”, то такое поле подобрать будет намного труднее. Этот метод проверен на практике множество раз и он практически на 100% защищает от роботов (на моём сайте, где вы сейчас читаете статью, за 2 месяца после внедрения метода пришло только одно спамерное письмо). Я всегда использую данный метод в своих проектах.
  4. Скрипт JavaScript. Необходим лишь в том случае, если какой-то человек пытается вручную отослать спам через вас. Скрипт можно придумать любой, в меру вашей изощрённости. У меня обычно алгоритм такой: в момент введения текста в textarea с комментариями я проверю строку на наличие ссылок (проверяем есть ли приставки www, http://, https:// либо доменные зоны), если что-то находится, то в невидимое поле, которое должно быть пустое при валидации я записываю какой-нибудь текста вроде «Я мошенник, я рассылаю спам». И всё. Видимость отправки производится, но до меня письмо просто не доходит. Позволяет спамеру сделать своё гадкое дело и благополучно уйти с вашего сайта.

Чуть ниже рассмотрим каждый способ отдельно, с примерами.

Нужна ли для Formit Modx капча?

Я считаю, что лучше обойтись без неё. В своё практике я использую сочетание нестандартный названий полей, скрытое поле и javascript. Это позволяет отлавливать все возможные спам-письма. Капча только нагружает лишними действиями пользователя.

Подробный разбор способов защиты от спама

Скрытое поле

Допустим у нас есть некоторая форма. В ней я выделил скрытое поле, которое нам нужно для проверки пустотности – это input c name=”nospam”. Оно скрытого типа hidden – т.е. невидимо для пользователя. Бот не замечает этого и заполняет его, после чего форма не проходит валидацию – принцип прост. Но для большей верности, скроем поле ещё и средствами css.

HTML:

<form action="" method="post" class="ajax_form af_example">
<input type="hidden" name="nospam" id="nospam" value="" />
    <div class="form-group">
        <label class="control-label" for="af_name">af_label_name</label>
        <div class="controls">
            <input type="text" id="af_name" name="name" value="" placeholder="" class="form-control"/>
            <span class="error_name"></span>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label" for="af_email">af_label_email</label>
        <div class="controls">
            <input type="email" id="af_email" name="email" value="" placeholder="" class="form-control"/>
            <span class="error_email"></span>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label" for="af_message">af_label_message</label>
        <div class="controls">
            <textarea id="af_message" name="message" class="form-control" rows="5"></textarea>
            <span class="error_message"></span>
        </div>
    </div>
    <div class="form-group">
        <div class="controls">
            <button type="reset" class="btn btn-default">af_reset</button>
            <button type="submit" class="btn btn-primary">af_submit</button>
        </div>
    </div>
</form>

CSS: 

#nospam {
display:none;
opacity:0;
}

MODX:

[[!AjaxForm?
     &amp;snippet=`FormIt`
     &amp;form=`MyForm`
     &amp;hooks=`email, spam`
     &amp;emailSubject=`Заголовок письма`
     &amp;emailTo=`test@mail.ru`
     &amp;emailFrom=`test@coder21.ru`
     &amp;emailTpl=`tpl.Email`
     &amp;validate=`name:required,email:required,nospam:blank`
     &amp;validationErrorMessage=`В форме содержатся ошибки!`
     &successMessage=`Ваше сообщение успешно отправлено.`
]]

Капча

Здесь необходимо использовать компонент ReCaptchaV2. Всё очень просто.

HTML:

[[!recaptchav2_render]]
[[!+fi.error.recaptchav2_error]]

MODX:

[[!FormIt?
     &hooks=`recaptchav2,email`
]]

Нестандартные названия полей

Возьмите форму из первого примера и измените в ней названия полей на "неассоциативно понятные", т.е. полную ерунду. Такая форма не будет пропускать спам отсылаемый роботами.

HTML:

<form action="" method="post" class="ajax_form af_example">
<input type="hidden" name="nospam" id="nospam" value="" />
    <div class="form-group">
        <label class="control-label" for="af_sdfglkjmwgopcrwwercg">af_label_sdfglkjmwgopcrwwercg</label>
        <div class="controls">
            <input type="text" id="af_sdfglkjmwgopcrwwercg" name="sdfglkjmwgopcrwwercg" value="" placeholder="" class="form-control"/>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label" for="af_sdgvrbrtvyyjyt">af_label_sdgvrbrtvyyjyt</label>
        <div class="controls">
            <input type="email" id="af_sdgvrbrtvyyjyt" name="sdgvrbrtvyyjyt" value="" placeholder="" class="form-control"/>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label" for="af_mfhkjtykutkuyikuyhik">af_label_mfhkjtykutkuyikuyhik</label>
        <div class="controls">
            <textarea id="af_mfhkjtykutkuyikuyhik" name="mfhkjtykutkuyikuyhik" class="form-control" rows="5"></textarea>
        </div>
    </div>
    <div class="form-group">
        <div class="controls">
            <button type="reset" class="btn btn-default">af_reset</button>
            <button type="submit" class="btn btn-primary">af_submit</button>
        </div>
    </div>
</form>

JavaScript

Отловите вхождения приставок http://, https://, www. и доменных зон: .ru, .com, .ua, .info и тд. Тогда вы поймёте, что посетитель вашего сайта использует форму для отправки спама. Скрипт при нахождении того или иного отрезка строки, вы можете смело вбивать любое значение в поле nospam, которое для успешной отправки должно быть пустым. Т.к. вы делаете это посредствам скрипта, то спамер не заметит ваш манёвр и благополучно уйдёт.

HTML:

Такой же, как в предидущем пункте

Jqery:

$('textarea').change(function(){
if($(this).text().indexOf('http://') + 1) {
$('#nospam').val("Я спамер и я хочу отправить тебе какую-то фигню");
}
});

Как вы понимаете в проверку можно добавить ещё и www., https://, .ru, .ua, .com и тд. и тп.

Заключание

На этом всё. Использование данных методов защиты от спама в FormIt поможет вам защитить ваши формы как от роботов, так и от живых спамеров. Если я где-то допустил ошибку в коде, вёрстке или стилях, или же не помог решить вашу проблему - пишите в комментариях.