про захист від спаму в реєстрації без включення капчи я вже розповідав. На черзі боротьба з ботами в модулі Веб-форми у Бітрікс, а так же розповім як написати свій валідатор.
Захищатися будемо за схемою, описаною в замітці про реєстрацію, а саме: додаємо в форму невидиме поле, якщо поле заповнене - до нас прийшов бот.
Припустимо, форма у вас створена, поля (в понятті модуля форм - «питання») для неї заведені і налаштовані. Заведемо ще одне, службове, з типом text (поля типу hidden боти іноді ігнорують і не заповнюють). У властивостях «Символьний ідентифікатор» йому треба придумати, як звичайному полю, наприклад user або name. Не варто називати його antibot.
В поле «Текст відповіді» щоб не писати назву, можна счітеріть і вписати нерозривний пробіл (в юникоде: Alt + 0160).
Як ви пам'ятаєте, нам потрібно перевіряти поле на порожнечу. За замовчування доступні валідатори:
- [Number_ext] Число в межах
- [Text_len] Довжина рядка
- [Number] Ціле число
- [INN] Перевірка ІПН
Начебто підходить валідатор text_len. У нього в налаштуваннях є 2 параметри: «Мінімальна довжина», «Максимальна довжина». Але для настройки «Максимальна довжина» мінімум можна вказати 1, а нам потрібно 0. Можна поставити і 1, але я вирішив написати свій валідатор, тим більше, що я ніколи цього не робив.
Документація по написанню своїх валідаторів тут . Там все просто: пишемо PHP-клас з потрібними методами і підвішуємо його на потрібну подію.
Вийшов ось такий клас валідатора:
namespace Olegpro; use \ Bitrix \ Main \ EventManager; class FormValidatorStringEmpty {function getDescription () {return array (NAME => empty_string, DESCRIPTION => Порожній рядок, TYPES => array (text), SETTINGS => array (__CLASS__, getSettings), CONVERT_TO_DB => array (__CLASS__, toDB), CONVERT_FROM_DB => array (__CLASS__, fromDB), HANDLER => array (__CLASS__, doValidate)); } Function getSettings () {return array (); } Function toDB ($ arParams) {return serialize ($ arParams); } Function fromDB ($ strParams) {return unserialize ($ strParams); } Function doValidate ($ arParams, $ arQuestion, $ arAnswers, $ arValues) {global $ APPLICATION; foreach ($ arValues as $ value) {if (strlen (trim ($ value))> 0) {$ APPLICATION -> ThrowException (Помилка заповнення полів форми. Код помилки [FKWF1].); return false; }} Return true; }}
Поклав я його по шляху: /bitrix/php_interface/handlers/form_validator_string_empty.php
Ну а підключити його потрібно в файлі /bitrix/php_interface/init.php
use \ Bitrix \ Main \ EventManager; use \ Bitrix \ Main \ Loader; EventManager :: getInstance () -> addEventHandlerCompatible (form, onFormValidatorBuildList, array (Olegpro \ FormValidatorStringEmpty, getDescription)); Loader :: registerAutoLoadClasses (null, array (Olegpro \ FormValidatorStringEmpty => /bitrix/php_interface/handlers/form_validator_string_empty.php,));
Після цього у поля на вкладці «Валідатори» з'явиться новий валідатор «[empty_string] Порожній рядок»:
Його-то і потрібно додати до нашого полю для захисту від спаму.
Останнє що залишилося: приховати це поле через CSS, щоб користувачі його не бачили.