Contact form 7 защита от спама без капчи
Недавно понадобилось защитить сайт от спама в форму обратной связи от Contact Form 7 для WordPress. Простая математическая капча не спасала, а рекапчу ставить не хотелось (тем более ее уже тоже пробивают).
При защите от спама я исходил из того, что бот не исполняет javascript, хотя это не совсем так, есть например Zennoposter, однако мое решение в первую очередь от ковровых бомбардировок, а не от точечных ударов поэтому задача сводилась к тому, чтоб создать поле без которого Contact Form 7 не отправляло бы форму, и оперировать его значением с помощью JS при отправке реальных пользователях.
Самым лучшим мне показалось использовать чекбокс — или в простонародье галочку. Логика работы галочки необычная — форма отправляется только если галочка снята, при этом дефолтное состояние галочки — checked. То есть если заходит бот он
- ничего сделает данному полю (если он его не знает)
- сделает ее checked
т.е. в результате галочка будет checked и форма не отправится, и спам соответственно тоже.
Если же заходит браузер исполняющий JS, то галочка снимается через JS и форма отправляется.
Реализация:
1. Создаем в Contact Form 7 чекбокс
[acceptance agree class:agree default:on invert]
acceptance — собственно сам чекбокс
default:on — по умолчанию checked
class:agree — class=»agree»
invert — отправлять форму только если checked снят
2. Убираем чекбоксу видимость через CSS
.agree {display:none}
3. Снимаем галочку через JS
<script language="javascript"> jQuery('.agree').prop('checked', false); </script>
или на нативном JS
<script language="javascript"> var x = document.getElementsByClassName("agree"); var i; for (i = 0; i < x.length; i++) { x[i].checked = false; } </script>
Скрипт нужно поместить ниже чем чекбокс, и лучше всего обернуть его document.ready.
Это собственно и всё. Защитить Contact Form 7 от спама как видите — несложно, сложнее было придумать логику, а делов по реализации — на 15 минут.
На третем шаге код скрипта прописывать прямо в форме?
И что значит обернуть в document.ready? Можно пример?
Такое ощущение, что на новой версии CF7 это работает только если поставить off
[acceptance agree class:agree default:off invert]
В новой версии нужно также использовать default:off