Задать вопрос
@ruslite

Как запретить рассылку спама в форме?

Клиент жалуется, что спам падает вечно. Письма как с разных источников и как реклама какая-то. Есть вариант капчу поставить, но так скорее всего снизится конверсия (все не любят капчу). Есть варианты борьбы с этим без капчи?
Приходит спам такого рода:
www.xn----7sbbkgwzu0b5a9d0b.xn--p1ai/gruzija/tbilisi/279-ambasadori-otel.html; 
Дата заезда: Jeremyskync; 
Количество дней: ; 
Категория номера: 2- Double \ Twin; 
Кол-во взрослых человек: 0; 
ФИО: JeremyskyncZS; 
ФИО1: ; 
ФИО2: ; 
ФИО3: ; 
ФИО4: ; 
Кол-во детей: 0; 
ФИО Ребенка1: /Возвраст: 0; 
ФИО Ребенка2: /Возвраст: 0; 
ФИО Ребенка3: /Возвраст: 0; 
ФИО Ребенка4: /Возвраст: 0; 
EMAIL: farma@csdinterpretingonline.com; 
phone: 88726651656; 
comments: Привет всем участникам форума! класный у вас сайт! Интересная инфа: Лучшие фэнтези смотреть онлайн http://inspacefilm.ru/ Тут: Фиби из «Друзей» воскресит сериал «Возвращение» Здесь: Барак Обама рассказал, от каких сериалов фанатеет http://inspacefilm.ru/newskino/1192-barak-obama-rassk.. Тут: Дорога / The Road (2009) http://inspacefilm.ru/drama/3287-doroga-the-road-2009.. Здесь: http://inspacefilm.ru/raznoe/6380-zdraste-ya-vash-pap.. Здесь: лучшие драмы смотреть онлайн http://inspacefilm.ru/drama/ Здесь: новые 2017 лучшие мультфильмы Тут: лучшая фантастика 2017 онлайн ;
  • Вопрос задан
  • 567 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 3
IonDen
@IonDen
JavaScript developer. IonDen.com
1. Капча (поставьте ту что всем привычна: https://www.google.com/recaptcha/intro/invisible.html )
2. Генерируйте разные имена полей формы каждый раз (избавит от ботов, которые заполняют поля формы по известным алгоритам)
3. Введите регистрацию с подтверждением. Скажем писать без капчи можно только зарегистрированным пользователям.
Ответ написан
dubr
@dubr
пыхарь
Спам-боты (пока) не выполняют JS. При показе формы пишите в сессию код, передавайте на клиент в любом виде, на клиенте пишите из JS в скрытое поле. Пока оно не оформлено в массово используемый плагин, будет работать =)

Вот наивная реализация в 40 строчек. Здесь генерируется два числа - секретное значение и множитель, в атрибут формы пишется множитель и произведение чисел, в JS вычисляется частное и подставляется в скрытое поле.

<?php
session_start();
$secret_error = false;
$is_sent = count($_POST);
if (
    $is_sent && 
    (
        !isset($_POST['secret']) || 
        !isset($_SESSION['secret']) || 
        $_POST['secret'] !== $_SESSION['secret']
    )
) {
    $secret_error = true;
}

if ($is_sent && !$secret_error) {
    // обрабатываем, шлем письмо
    ?>
    Ваш звонок очень важен для нас!
    <?php
} else {
    if ($secret_error) {
        ?>
        <p>Вы бот или у вас не включен JavaScript, сделайте с этим что-нибудь!</p>
        <?php
    }
    $multiplier = rand(10, 99);
    $secret = (string) rand(1000,9999);
    $_SESSION['secret'] = $secret;
    ?>
    <form action="" method="post" data-secret="<?= $secret * $multiplier ?>" data-multiplier="<?= $multiplier ?>">
        <label>Ваше имя <input name="name" /></label>
        <input type="hidden" name="secret" />
        <input type="submit" />
    </form>
    <!-- вот это можно вынести в отдельный файл -->
    <script type="text/javascript">
        document.querySelectorAll('form[data-secret]').forEach(function(form) {
            var secret = form.getAttribute('data-secret') / form.getAttribute('data-multiplier');
            form.querySelector('[name="secret"]').value = secret;
        });
    </script>
    <?php
}


В принципе можно с тем же успехом написать

<script type="text/javascript">
        document.querySelector('[name="secret"]').value = "<?= $secret ?>";
</script>


Скорее всего кодеру, который делает бота, будет лень разбираться, как оно у вас работает, если оно работает только у вас (то есть не является тиражным решением). Магия со множителями или чем-то таким просто не позволяет вытащить значение одной регуляркой, еще немного снижая шансы заинтересовать злодея =)
Ответ написан
Adamos
@Adamos
Имхо, очевидное отличие рекламного бота от человека - ссылка на что-то в тексте.
Вам реальные люди вообще будут присылать что-то со ссылками?
Нет - выкидывайте этот мусор автоматически, и все тут.
Можете проверять это лишний раз на стороне клиента и предупреждать его о том, что ссылки не пройдут - конверсию это не уменьшит.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@nikfakel
Веб-разработчик
Поставить невидимое поле, которое будет пытаться заполнить спам-скрипт - если заполнено, то письмо не отправляем (плюс на сервере проверка).

по принципу honeypot - https://ru.wordpress.org/plugins/spam-honeypot/
Ответ написан
@kstyle
есть в wordpress плагин akisment - посмотрите как он работает
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Можно предварительно проверить сообщение на соответствие "чистому" тексту через API: здесь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы