FormIt + AjaxForm = Спамеры пробивают защиту

Добрый день!

На сайте стоит FormIt и AjaxForm, для защиты от спама используется способ, предложенный Ильей Уткиным (вот этот способ).

Все работает, пока спамеры не начинают в скрытое поле вводить цифру «0».

Скажите, как поправить вот этот код, чтобы письмо считалось спамом при вводе любого символа или буквы в скрытое поле?

<?php
if ($_POST['input-message']) { // проверяем наше поле на пустоту
    echo $AjaxForm->success('Ваше сообщение отправлено.');
    die();
} else {
    return true;
}
Victor
16 сентября 2019, 14:14
modx.pro
2
175
0

Комментарии: 6

Артем
16 сентября 2019, 16:31
1
+2
Можно так
<?php
if ($_POST['input-message'] != '') { // проверяем наше поле на пустоту
    echo $AjaxForm->success('Ваше сообщение отправлено.');
    die();
} else {
    return true;
}
я делаю такую проверку
<?php
$isAjax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
if (!$isAjax) {
    // Выставляем плейсхолдер ошибки
    $hook->addError('name', 'Спам!');
    return false;
}

$pageId = $hook->getValue('pageId');
if (empty($pageId)){
    $hook->addError('name', 'Спам!');
    return false;
}
return true;
    Victor
    16 сентября 2019, 16:37
    0
    Спасибо!

    А можете про свой метод подробнее рассказать? А то первый способ мне не очень нравится, т.к. возникает куча проблем с автозаполнением форм в браузере и есть большой риск, что нормальные письма могут попасть в спам
      Артем
      16 сентября 2019, 17:06
      0
      Проверка на ajax и на наличие pageId, который добавляется AjaxForm'ом при отправке
        Александр Быковский
        27 сентября 2019, 09:44
        0
        Я правильно понимаю что вы этот код
        <?php
        $isAjax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
        if (!$isAjax) {
            // Выставляем плейсхолдер ошибки
            $hook->addError('name', 'Спам!');
            return false;
        }
        
        $pageId = $hook->getValue('pageId');
        if (empty($pageId)){
            $hook->addError('name', 'Спам!');
            return false;
        }
        return true;
        вставляете в сниппет и вызываете этот сниппет перед хуком mail в formit?
          Артем
          27 сентября 2019, 09:47
          0
          Да, верно
    Максим
    27 сентября 2019, 15:22
    0
    А зачем нужен отдельный хук?
    Там же можно в validate прописать field:blank
    Это проверка, что поле должно быть не заполненным.

    А насчет автозаполнения. Нужно прописать к скрытому полю autocomplete=«new-password»
    Тогда поле не будет автозаполняться

    Также пара советов.
    Не стоит скрывать стилями само поле.
    Лучше обернуть его в блок со стилями вроде width: 0;height: 0;overflow: hidden;

    И стоит атрибут name у поля сделать вроде phone или tel, на случай если спамеры проверяют «полезность» поля.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      6