«Современные маркетинговые инструменты» требуют, чтобы пользователь делал меньше телодвижений для того, чтобы расстаться со своими контактными данными. Именно поэтому на страницах появилась куча форм через каждые пол-экрана и все без капчи. Пользователи стремительно тупеют и им лень даже набрать номер телефона, а о том, чтобы самостоятельно написать письмо и вовсе речи не идет. Периодически по сайтам пробегаются пауки на предмет тестирования отправок форм, потом, видимо, пишется какой-то обработчик, который скачивает страницу и делает POST-запрос. В логах сервера это видится примерно вот так
Затем бот сбегает с сайта, а в почту приходит какое-то очередное «оно».
Варианты решения проблемы без внедрения капчи
Рассматриваю только отмену отправки, а не пост-обработку. Сразу оговорюсь, что я не программист, и такие решения, может быть и весьма неидеальные, но зато лезть глубоко в кишки не нужно.
0. Для всех случаев такого рода лично я отключил вывод [+validationmessage+] и занулил requiredClass и invalidClass для усложнения изучения ответа при неправильной отправке. Пре-валидацию в простой форме можно сделать и на JS и аттрибута required достаточно. ИМХО.
1. По совету
Dmi3yy создание пустого поля, обязательного к
незаполнению. Например, такого:
<input value="" name="phone" id="phone" class="special" type="text" eform="Спец:date:0" placeholder="Phone*">
Необходимо спрятать это поле с глаз долой через CSS и дать ему часто используемое имя. В моем случае, после того, как стал сыпаться спам у одного из клиентов — не прокатило. Только позже я понял, почему. Скорее всего, простой бот считает количество элементов в DOM, и пишет в поля по счету, не ориентируясь на ID и name. Поле надо вставить так, чтобы сломать текущий порядок элементов внутри формы. Неплохо было бы делать это в случайном порядке, но eForm не любит, чтобы кто-то копался в шаблоне формы без его ведома, а на JS этого не сделать, потому что бот не скачивает JS.
2. Хардкор. Так я сделал на некоторых статичных сайтах, где форма отправляется не очень сложным скриптом на PHP. Сделать поле имя только на русском языке.
через eForm это делается так
<input type="text" class="inptext" name="name" id="name" eform="Ваше имя::1::#REGEX /^[А-Яа-яЁё ]+$/u" placeholder="Ваше имя*">
По понятным причинам — «трудно недооценивать всю предсказуемость тупизны» не самое идеальное решение. Но внезапно оказалось, что действенное.
3. Сделать форму подгружаемой в блок на странице скриптом и отправку через ajax. Вариантов реализации можно придумать несколько, у кого на что фантазии хватит. Или в форме заменить action на несуществующий, а POST на GET и по факту показывать вместо формы только ее верстку, которую «чинить» яваскриптом при отправке, а сам правильный вызов eForm сделать на странице, куда форма отправляется. Не спасет, если эту страницу с «чистым» вызовом eForm найдет бот. Но и тут тоже возможны варианты. Например, не отображать форму, если страницу не передано какого-нибудь интересного GET-параметра, содержащего неведомую строку. Забить значение этого параметр можно куда-нибудь в настройки через cfgTV или globalPlaceholders и периодически его менять.
4. Похоже на пункт 1, но к полю пишется атрибут required и мусор в value. Так как поле по условию проверки обязано быть пустым — форма не отправится. При отправке по событию submit через JS снимается атрибут required и чистится значение. Без скриптов отправка невозможна. Аналогично можно сделать проверку на соответствие строго заданному значению и проставлять это значение при загрузке страницы, но мне кажется, это менее интересно.