Всем привет. На одном из моих проектов на имеются формы созданные при помощи cform7, через которые в почту приходит просто неимоверное количество СПАМа.
Вы скажете — так есть же Google капча ! И в принципе будете правы, но …
Так как эта форма используется клиентами, то решение с Google капчей оказывается не совсем удобным, потому что есть какой то процент ложных срабатываний и в таком случае пользователю придется выбирать из картинок какие нибудь гидранты, велосипеды или пешеходные переходы со светофорами, что лично меня очень раздражает. В идеале хотелось сделать так чтобы СПАМ с помощью ботов отсекался автоматом, а ручной СПАМ был бы геморойным и бессмысленным для СПАМеров. Akismet тоже отпал, т.к. он платный — бесплатный он только для некоммерческих сайтов.
Проанализировав кучу СПАМных сообщений выявил закономерность:
- Во первых 90% СПАМ сообщений содержат ссылки на левые сайты
- СПАМ в принципе не бывает в пару строк, т.е. типичное СПАМ сообщение в длину имеет больше символов чем вопрос от клиента.
- Когда Ваша форма содержит только поля Имя и телефон, СПАМ обязательно напишут в поле Имя.
- Авто СПАМ (это когда СПАМ рассылают боты) заполняют все поля, чтобы прям 100% всё отправилось
- Имя у СПАМ ботов в 99% случаев на английском — типа RodneyLiand, Richardkek, MichaelJem и т.д. имён может быть миллион но они все на английском.
И так : Врага изучили, пора действовать.
- Первым делом ограничиваем поле имя от 3х до 20 символов. В итоге поле Имя стало выглядеть так: [text your-name minlength:3 maxlength:20 placeholder “Ваше имя”]
- Поле вопрос ограничиваем до 140 символов. У меня получилось вот так: [textarea your-message maxlength:140 placeholder “Кратко опишите Ваш вопрос или пожелания”]
- Далее ставим плагин Honeypot for Contact Form 7 он делает невидимое для посетителей поле, которое СПАМ боты “видят” и обязательно заполнят (они заполняют все поля) и если это поле заполнено, то сообщение отправлено не будет. После установки в форму добавляем : [honeypot имя_поля]
- И последнее, запрещаем английские символы в Имени. Сделать это можно прописав в файл function.php вышей темы следующее:
function my_wpcf7_validate_text( $result, $tag ) { $type = $tag['type']; $name = $tag->name; $Name = (strpos(strtolower($name), 'name') !== false)?true:false; $value = isset( $_POST[$name] ) ? (string) $_POST[$name] : ''; if ( $tag->is_required() && empty($value) ) { $result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) ); } elseif ( $Name && (!preg_match('/^[А-Яа-яё]+$/iu', $value) || strlen ($name)<2)) { $result->invalidate( $tag, wpcf7_get_message( 'invalid_name' ) ); } return $result; } add_filter( 'wpcf7_validate_text', 'my_wpcf7_validate_text' , 10, 2 ); add_filter( 'wpcf7_validate_text*', 'my_wpcf7_validate_text' , 10, 2 ); add_filter( 'wpcf7_messages', 'mywpcf7_text_messages' ); function mywpcf7_text_messages( $messages ) { return array_merge( $messages, array( 'invalid_name' => array( 'description' => __( "Используйте только РУССКИЕ символы в имени", 'contact-form-7' ), 'default' => __( 'Используйте только РУССКИЕ символы в имени.', 'contact-form-7' ) ) )); }
На этом первоначальную СПАМ оборону можно считать настроенной: нам не смогут писать СПАМ в поле Имя, нам не смогут писать длинные сообщения, что присуще СПАМу и у нас будет отсекаться весь СПАМ отправленный ботами.