Pull to refresh

1С: Битрикс, защита произвольных форм от спама

Reading time2 min
Views11K
Модуль Антиспам без CAPTCHA от CleanTalk для 1С: Битрикс позволяет, кроме защиты описанных форм, легко сделать защиту любой формы. Методы модуля были написаны специально с учётом возможного расширения функционала. Здесь я приведу пример, как это сделать.


Предположим, нужно сделать проверку на спам формы со следующими полями:
email, nickname, title и message.
Всё, что нужно, это поместить код вызова метода CleantalkAntispam::CheckAllBefore с нужными параметрами в /bitrix/php_interface/init.php.

/bitrix/php_interface/init.php
<?php
/*
You can place here your functions and event handlers

AddEventHandler("module", "EventName", "FunctionName");
function FunctionName(params)
{
        //code
}
*/

AddEventHandler('form', 'onBeforeResultAdd', 'my_onBeforeResultAdd');
CModule::IncludeModule('cleantalk.antispam');

function my_onBeforeResultAdd($WEB_FORM_ID, $arFields, $arrVALUES) {
 $ct_status = COption::GetOptionString('cleantalk.antispam', 'status', '0');
 if ($ct_status == 1) {
  global $APPLICATION;
  $aParams = array();
  $aParams['type'] = 'comment';
  $aParams['sender_email'] = isset($arrVALUES['email']) ? $arrVALUES['email'] : '';
  $aParams['sender_nickname'] = isset($arrVALUES['nickname']) ? $arrVALUES['nickname'] : '';
  $aParams['message_title'] = isset($arrVALUES['title']) ? $arrVALUES['title'] : '';
  $aParams['message_body'] = isset($arrVALUES['message']) ? $arrVALUES['message'] : '';
  $aResult = CleantalkAntispam::CheckAllBefore($aParams, FALSE);
  if (isset($aResult) && is_array($aResult)) {
   if ($aResult['errno'] == 0) {
    if ($aResult['allow'] == 1) {
        //Not spammer - just return;
        return;
    } else {
     if (preg_match('//u', $aResult['ct_result_comment'])) {
      $err_str=preg_replace('/^[^\*]*?\*\*\*|\*\*\*[^\*]*?$/iu','',$aResult['ct_result_comment']);
      $err_str=preg_replace('/<[^<>]*>/iu', '', $err_str);
     } else {
      $err_str=preg_replace('/^[^\*]*?\*\*\*|\*\*\*[^\*]*?$/i','',$aResult['ct_result_comment']);
      $err_str=preg_replace('/<[^<>]*>/i', '', $err_str);
     }
     $APPLICATION->ThrowException($err_str);
     return false;
    }
   }
  }
 }
}
?>


Собственно, код очень прост: сбор параметров от формы, вызов проверки, анализ результата. Именно по такому пути сделаны все методы самого модуля для проверки форм. При необходимости добавить защиту для очередной нужной клиентам формы мы просто добавляем метод, похожий на приведённый. В этом можно убедиться, посмотрев сам код модуля.

Параметр $WEB_FORM_ID не проверяется, его проверку можно добавить при необходимости.

Отмечу, что при проверке внутри функции CleantalkAntispam::CheckAllBefore() используется JavaScript-тест. Код теста устанавливается автоматически на страницы сайта при включенном модуле (в т.ч. в настройках модуля), и вызывать CleantalkAntispam::CheckAllBefore() нужно также при включённом модуле, иначе тест JavaScript будет провален.

Также отмечу, что здесь не анализируется флаг ответа $aResult['stop_queue']. Этот флаг говорит о явном спаме и используется, например, в одобрении комментариев: если он установлен, то комментарий отвергается, если сброшен, то отправляется на ручную модерацию. Такую проверку вы можете легко добавить сами. Подробная информация о CleanTalk API находится здесь.
Tags:
Hubs:
Total votes 8: ↑1 and ↓7-6
Comments12

Articles

Information

Website
cleantalk.org
Registered
Founded
Employees
2–10 employees
Location
Россия