Наша совместная команда Banwar.org

Связаться с нами

  • (097) ?601-88-87
    (067) ?493-44-27
    (096) ?830-00-01

Статьи

1С-Бітрікс. Кастомний валідатор поля веб-форми або захист від спаму в модулі «Веб-форми» без капчі

про захист від спаму в реєстрації без включення капчи я вже розповідав. На черзі боротьба з ботами в модулі Веб-форми у Бітрікс, а так же розповім як написати свій валідатор.

Захищатися будемо за схемою, описаною в замітці про реєстрацію, а саме: додаємо в форму невидиме поле, якщо поле заповнене - до нас прийшов бот.

Припустимо, форма у вас створена, поля (в понятті модуля форм - «питання») для неї заведені і налаштовані. Заведемо ще одне, службове, з типом 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] Порожній рядок»:

Після цього у поля на вкладці «Валідатори» з'явиться новий валідатор «[empty_string] Порожній рядок»:

Його-то і потрібно додати до нашого полю для захисту від спаму.

Останнє що залишилося: приховати це поле через CSS, щоб користувачі його не бачили.

Новости

Banwar.org
Наша совместная команда Banwar.org. Сайт казино "Пари Матч" теперь доступен для всех желающих, жаждущих волнения и азартных приключений.