Я, наверное как и многие, стал жертвой спама, который лился через плагин wordpress «contact form 7»
С одной стороны без этого плагина никуда, а с другой — такое кол-во спама (до 20 писем в день).
Я пробовал и капчу ставить и вопросы в стиле 5+5=?, но ничего не помогало. Решение в конечном итоге нашлось.
Суть описываемого способа проста.
Как работают спам боты?
Они делают запрос через HTTP соединение и отправляют данные.
При таких запросах боты не обрабатывают скрипты и не нажимают кнопку отправить.
Этим мы и воспользуемся.
Сделаем так, чтобы при нажатии кнопки отправить заполнялось невидимое для пользователя поле.
У пользователя (в браузере) будет отрабатывать javascript, а у спамбота — не будет.
А потом будем проверять так заполнено это поле или нет.
Для этого нам понадобиться ftp доступ и блокнот.
- В админке открываем форму и добавляем поле «[text* antispam]»
Это обязательное текстовое поле.
«antispam» — имя поля. Рекомендую дать этому полю свое имя.
Имя этого поля будет использоваться и в дальнейшем.
Если измените его имя — поменяйте везде! - Открываем стили. И там добавляем
.antispam {
display:none;
}
Это нужно для того, чтобы пользователь не видел этого поля. - Тут зависит от версии. Не знаю с какой версии они убрали функцию «beforeSerialize». Но если Вы не нашли этой функции — переходите к плану б.
а) Для старых версий. Открываем файл «\wp-content\plugins\contact-form-7\includes\js\scripts.js»
И добавляем в функцию «beforeSerialize: function($form, options) {» следующую строку:1$form.find('input[name="antispam"]').val('nospam');б) Для новых версий. Открываем файл «\wp-content\plugins\contact-form-7\includes\js\scripts.js».
И добавляем в функцию «wpcf7.submit = function( form ) {» после строки «var $form = $( form );» следующую строку:1$form.find('input[name="antispam"]').val('nospam');Тут antispam — имя поля, которое мы обозначили в п.1.
‘nospam’ — наше кодовое слово, которое мы будем дальше проверять.
Тоже рекомендую его изменить. - В функции темы добавляем следующий код:
123456789add_filter( 'wpcf7_validate_text*', 'custom_text_validation_filter', 20, 2 );function custom_text_validation_filter( $result, $tag ) {$spam_text = isset( $_POST['antispam'] ) ? trim( $_POST['antispam'] ) : '';if ( $spam_text != 'nospam' ) {$result->invalidate( $tag, "Spam?" );}return $result;}
Готово. Спам больше не приходит.
6 комментариев
Приветствую.
Есть вопрос по данному примеру, как с Вами можно связаться?
Спасибо.
Спасибо! Помогло!
Добрый день. у меня в scripts.js нет строки «beforeSerialize:…… как быть?
Дополнил статью. Там только 3 пункт стал выглядить по-другому. Разделил его на «Старую версию» и «Новую версию»
Не работает… Поле ввода имени определяет как спам… Как исправить?
Здравствуйте!
Не работает… Поле ввода имени определяет как спам…
Как исправить?