Защита формы обратной связи от спама на PHP и JavaScript

    11 комментариев 1307

Спам не пройдет

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

Защита формы от спама. Теория

Что бы будем делать?

  • Добавим к форме input с типом hidden и пустым значением (value)
  • По нажатию на кнопку отправки данных формы будем подставлять какое-то значение в скрытый input
  • На стороне сервера примем данные из скрытого инпута
  • Сделаем проверку. Если значение скрытого поля не равно тому, что мы в него передали через JS, то форма отправлена не будет.

Как правило боты не делают нажатие на кнопку отправки и это легко проверить, установив в Яндекс Метрике соответствующие цели. Поэтому такой способ должен защитить сайт от спама если не совсем, то ограничить его поступление до минимума. То есть будут приходить сообщения только если живой человек отправит форму самостоятельно, то есть нажмет на кнопку. Итак, приступим. Добавляем в форму скрытое поле:

Защита контактной формы от спама. Практика

<input type="hidden" name="code" value="" id="code"/>

В JavaScript пишем следующее:

1
2
3
4
let code = document.querySelector('#code'); // Получаем скрытый input
  document.querySelector('.btn').onclick = function(){ // Клик по кнопке отправки
    code.value = 'NOSPAM'; // Подставляем значение в value инпута
  };

После клика скрытое поле будет выглядеть примерно так:

<input type="hidden" name="code" value="NOSPAM" class="code"/>

Теперь сделаем проверку на PHP.

1
2
3
if ($_POST['code'] != 'NOSPAM') {
  exit;
}

На этом защиту от спама можно было бы завершить, но как быть с движками типа WordPress? Для CMS существует огромное количество плагинов по защите от различного рода взломов, атак и спама, но при желании можно внедрить и этот способ, но это тема для отдельной статьи или целого видео-урока. Возможно в ближайшее время я выпущу материал на эту тему. А какие способы защиты от спама знаете вы?

Добавить страницу в закладки

11 комментариев
  1. Интересно, есть-ли у Вас на сайте пример создания ФОС для установки на HTML страницу?

    • Александр Маврин:

      Пока нет. А что это?

      • Форма обратной связи для заинтересованного посетителя с возможностью обратного звонка. В сети есть примеры платные и бесплатные, рабочие и не рабочие — устаревшие.Часто на одностраничниках, и на моей странице тоже стоят такие ФОС. Хотелость бы иметь современную ФОС без использования БД.

        Особенно интересно создать скрипт комментариев с возможностью редакции на таком же одностраничнике. В сети есть аналог такого комментария, но всего ОДИН!

        Привлекать сторонние сервисы со своими скриптами, это их реклама и потеря веса. Хотя, я пользуюсь и этим на своих одностраничниках.

        Всё дело в том, что ряд моих страниц уже несколько лет стоят в топ 10 по вч запросам и это ощутимо в вопросах бизнеса. В Google, клиенты, не смотря на раздел МОЙ БИЗНЕС, не проявляют желания писать отзывы. Да, и не умеют. А тут же на странице — пожалуйста. Но нет такой возможности.

        И ещё такой нюанс, если по вч запросу РЕМОНТ ХОЛОДИЛЬНИКОВ ХАРЬКОВЕ, мой сайт стоит на шестой позиции в поиске Гугла моего региона, заказов 1-2, если вывожу на 3-4 место,
        заказов 3-4. Если 1-3 место , заказов море. Поэтому каждое хорошее слово в отзыве играет роль. Извините, написал много, хотел донести.

  2. Интересное решение. Учитывая, что на моей странице 80 000 знаков как бы защитится от текстовых ботов на всякий случай. У Вас была публикация по ограничению по буквам записей на JS.

    Видимо я и запомнил вашу эту публикацию, что она одна в инете. Спасибо за ваши практики.

  3. Макс:

    о) написал огромный коммент со своим вариантом защиты от ботов, и ничего не опубликовалось. Ладно!

  4. Максим:

    когда создавал защиту от ботов на своем сайте, то использовал следующий алгоритм. Язык PHP.

    1. Список 1. Массив со списком HTML сущностей, которых легче всего можно спрятать в токене из рандомных символов.
    2. Список 2. Массив со списком декодированных HTML сущностей из списка 1.
    3. При открытии страницы формируется рандомный токен из символов »&;0123456789&;abcdefghijklmnopqrstuvwxyz&;ABCDEFGHIJKLMNOPQRSTUVWXYZ&;()#%», я использовал сложность 50, т.е. строка на 50 символов.
    4. Выбираем случайный элемент из списка 1, и заменяем им случайный символ из токена, предварительно сохранив в сессию НОМЕР_СТРОКИ в токене, в которую мы поместили HTML сущность и НОМЕР_ЭЛЕМЕНТА в массиве списка 1.
    5. Помещаем полученный токен в форму на странице.
    6. После того, как мы получили токен от формы, получаем соответствующий символ из токена по НОМЕРУ_СТРОКИ и сравниваем его с элементом из списка 2 по НОМЕРУ_ЭЛЕМЕНТА
    7. Если они совпадают, значит, форма отправлена человеком.
    8. Если нет, значит, форма отправлена роботом.
    Принцип защиты основан на том, что браузер всегда декодирует HTML сущности, и одна и та же HTML сущность будет иметь разный вид, в зависимости от того, получена она от браузера или от бота, не использующего браузер.
    Пример:
    & iexcl; = Бот отправит этот код как есть, состоящий из 7 символов.
    ¡ = человек отправит этот же код в таком виде.

    Токен в 50 символов используется, чтобы не было очевидно, что защита основана на принципе отображения браузером HTML сущностей.
    Реализовывал эту защиту на разных сайтах, которые жаловались на спам, и хотели защиту без капчи, включая свой собственный сайт. Ни разу боты не прошли эту защиту.

  5. Nikita:

    Классный материал. Спасибо

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *