Размер шрифта
Цвет фона и шрифта
Изображения
Озвучивание текста
Обычная версия сайта
ПрофиCRM
+7 495-256-29-09
+7 495-256-29-09
Заказать звонок
E-mail
sale@proficrm.ru
Адрес
г. Санкт-Петербуг, ул Кременчугская, д.11, к1

Режим работы
Пн. – Пт.: с 10:00 до 18:00
Подать заявку
Услуги
  • Внедрение CRM
    • Техподдержка CRM
    • CRM базовое внедрение
    • CRM для торговых компаний
  • Битрикс24
    • Аудит Битрикс24
    • Техническая поддержка Битрикс24
    • Интеграция 1С и Битрикс24
    • Бизнес-процессы Битрикс24
  • Веб-проекты
    • Магазин на готовом решении
    • Автоматический E-mail маркетинг
Лицензии
  • Битрикс24
    • Лицензии
    • Продление (коробка)
    • Переход (коробка)
  • SberCRM
  • amoCRM
  • Лицензии 1С-Битрикс
    • Лицензии
    • Переходы
    • Продление
  • Готовые решения
    • Интернет-магазины
    • Корпоративные сайты
    • Модули ПрофиCRM
Кейсы
  • Email-Маркетинг
  • Битрикс24
Документация
Блог
Акции
Компания
  • О компании
  • Руководители
  • Партнеры
  • Сертификаты и компетенции
  • Документы
  • Отзывы
  • Реквизиты
Контакты
0
ПрофиCRM
г. Санкт-Петербуг, ул Кременчугская, д.11, к1

+7 495-256-29-09
+7 495-256-29-09
Заказать звонок
E-mail
sale@proficrm.ru
Адрес
г. Санкт-Петербуг, ул Кременчугская, д.11, к1

Режим работы
Пн. – Пт.: с 10:00 до 18:00
Войти
0 Корзина
Услуги
  • Внедрение CRM
    Внедрение CRM
    • Техподдержка CRM
    • CRM базовое внедрение
    • CRM для торговых компаний
  • Битрикс24
    Битрикс24
    • Аудит Битрикс24
    • Техническая поддержка Битрикс24
    • Интеграция 1С и Битрикс24
    • Бизнес-процессы Битрикс24
  • Веб-проекты
    Веб-проекты
    • Магазин на готовом решении
    • Автоматический E-mail маркетинг
Лицензии
  • Битрикс24
    Битрикс24
    • Лицензии
    • Продление (коробка)
    • Переход (коробка)
  • SberCRM
    SberCRM
  • amoCRM
    amoCRM
  • Лицензии 1С-Битрикс
    Лицензии 1С-Битрикс
    • Лицензии
    • Переходы
    • Продление
  • Готовые решения
    Готовые решения
    • Интернет-магазины
    • Корпоративные сайты
    • Модули ПрофиCRM
Кейсы
  • Email-Маркетинг
  • Битрикс24
Документация
Блог
Акции
Компания
  • О компании
  • Руководители
  • Партнеры
  • Сертификаты и компетенции
  • Документы
  • Отзывы
  • Реквизиты
Контакты
    Подать заявку
    ПрофиCRM
    Услуги
    • Внедрение CRM
      Внедрение CRM
      • Техподдержка CRM
      • CRM базовое внедрение
      • CRM для торговых компаний
    • Битрикс24
      Битрикс24
      • Аудит Битрикс24
      • Техническая поддержка Битрикс24
      • Интеграция 1С и Битрикс24
      • Бизнес-процессы Битрикс24
    • Веб-проекты
      Веб-проекты
      • Магазин на готовом решении
      • Автоматический E-mail маркетинг
    Лицензии
    • Битрикс24
      Битрикс24
      • Лицензии
      • Продление (коробка)
      • Переход (коробка)
    • SberCRM
      SberCRM
    • amoCRM
      amoCRM
    • Лицензии 1С-Битрикс
      Лицензии 1С-Битрикс
      • Лицензии
      • Переходы
      • Продление
    • Готовые решения
      Готовые решения
      • Интернет-магазины
      • Корпоративные сайты
      • Модули ПрофиCRM
    Кейсы
    • Email-Маркетинг
    • Битрикс24
    Документация
    Блог
    Акции
    Компания
    • О компании
    • Руководители
    • Партнеры
    • Сертификаты и компетенции
    • Документы
    • Отзывы
    • Реквизиты
    Контакты
      +7 495-256-29-09
      Заказать звонок
      E-mail
      sale@proficrm.ru
      Адрес
      г. Санкт-Петербуг, ул Кременчугская, д.11, к1

      Режим работы
      Пн. – Пт.: с 10:00 до 18:00
      0
      Подать заявку
      ПрофиCRM
      Телефоны
      +7 495-256-29-09
      Заказать звонок
      E-mail
      sale@proficrm.ru
      Адрес
      г. Санкт-Петербуг, ул Кременчугская, д.11, к1

      Режим работы
      Пн. – Пт.: с 10:00 до 18:00
      0
      ПрофиCRM
      • Услуги
        • Услуги
        • Внедрение CRM
          • Внедрение CRM
          • Техподдержка CRM
          • CRM базовое внедрение
          • CRM для торговых компаний
        • Битрикс24
          • Битрикс24
          • Аудит Битрикс24
          • Техническая поддержка Битрикс24
          • Интеграция 1С и Битрикс24
          • Бизнес-процессы Битрикс24
        • Веб-проекты
          • Веб-проекты
          • Магазин на готовом решении
          • Автоматический E-mail маркетинг
      • Лицензии
        • Лицензии
        • Битрикс24
          • Битрикс24
          • Лицензии
          • Продление (коробка)
          • Переход (коробка)
        • SberCRM
        • amoCRM
        • Лицензии 1С-Битрикс
          • Лицензии 1С-Битрикс
          • Лицензии
          • Переходы
          • Продление
        • Готовые решения
          • Готовые решения
          • Интернет-магазины
          • Корпоративные сайты
          • Модули ПрофиCRM
      • Кейсы
        • Кейсы
        • Email-Маркетинг
        • Битрикс24
      • Документация
      • Блог
      • Акции
      • Компания
        • Компания
        • О компании
        • Руководители
        • Партнеры
        • Сертификаты и компетенции
        • Документы
        • Отзывы
        • Реквизиты
      • Контакты
      Подать заявку
      • Кабинет
      • 0 Корзина
      • +7 495-256-29-09
        • Телефоны
        • +7 495-256-29-09
        • Заказать звонок
      • г. Санкт-Петербуг, ул Кременчугская, д.11, к1

      • sale@proficrm.ru
      • Пн. – Пт.: с 10:00 до 18:00

      Документация ПрофиCRM: Маркетинговые рассылки

      Главная
      —
      Документация
      Выбрать курс
      • ПрофиCRM: Маркетинговые рассылки
      • ПрофиCRM: AI-контроль качества звонков
      33  /  34
      • Описание курса
      • Демо-режим
      • Установка модуля
      • Активация купона
      • Компоненты
        • sotbit.mailing.email.get
        • sotbit.mailing.products.mail
      • Настройка модуля
        • Системные настройки
        • Администрирование
          • Сценарии рассылок
          • Сообщения
          • Группы подписчиков
          • Импорт подписчиков
          • Подписчики
          • Отписавшиеся email
          • Черный список email
          • Статистика
        • Список сценариев рассылок
          • Новинки товаров бренда, оповестим подписчиков
          • Рассылка по группе подписчиков модуля маркетинговые рассылки
          • Универсальная рассылка по заказам - таргетинговые продажи
          • Просим оставить отзыв в яндекс-маркет о магазине
          • Пользователь давно не заходил, отправим приглашение
          • Новинки категории товаров, оповестим подписчиков
          • Универсальная рассылка по пользователям - индивидуальный подход
          • Уведомление пользователя зарегистрированных модулем маркетинговые рассылки
          • Поздравляем пользователей с Днем Рождения
          • Пользователь зарегистрирован, но ничего не купил.
          • Брошенная корзина - мотивируем оформить заказ
          • Благодарственное письмо при смене статуса заказа
          • Универсальная рассылка по инфоблоку - используем собственные базы
      • Для разработчиков
        • Инструкция по обновлению для безопасности до версии 3.7.6
      • Видео-уроки

      Инструкция по обновлению для безопасности до версии 3.7.6

      Если на сайте установлена версия модуля ниже 3.7.6, рекомендуем установить обновление через Bitrix Marketplace.

      Если обновление доступно в Marketplace, используйте штатное обновление модуля. После установки очистите кеш Bitrix и проверьте основные сценарии рассылок.

      Если обновление временно недоступно из-за срока обновлений, локальных доработок или ограничений проекта, разработчик может сверить и обновить затронутые участки по инструкции ниже.

      Перед внесением правок

      Перед изменениями подготовьте тестовую копию сайта и резервную копию файлов модуля и базы данных. Не переносите изменения вслепую, если файлы были изменены на проекте.
      • Проверьте, есть ли локальные доработки в файлах модуля.
      • Сравнивайте не только отдельную строку, но и окружающий участок кода.
      • Вносите изменения сначала на тестовой копии сайта.
      • После внесения правок очистите кеш Bitrix и проверьте основные сценарии модуля.

      Карта правок для разработчика

      Откройте файл, найдите указанный фрагмент и замените его на безопасный вариант из соседней колонки.

      Номера строк ориентировочные. Если код в вашей версии отличается, сверяйте обработчик, параметр и окружающую логику.

      Обработка шаблонов

      Файл: admin/sotbit_mailing_template_ajax.php

      Что сделать: проверить права доступа, привести входные ID к числу, добавить безопасную обработку сериализованных данных и разрешить подключение preset только по безопасному имени.

      НайтиЗаменить

      Примерно строки 1-9: начало обработчика, где подключается административный пролог и проверяются права.

      define("NOT_CHECK_PERMISSIONS", true);
      require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_admin_before.php');

      Примерно строки 1-9: подключить модуль и проверить права пользователя.

      require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_admin_before.php');
      $module_id = "sotbit.mailing";
      require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$module_id."/include.php");
      
      if($APPLICATION->GetGroupRight($module_id) <= "D")
      {
          $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
      }

      Примерно строки 14-15: получение события и параметров шаблона.

      $res = CSotbitMailingEvent::GetByID($_REQUEST['event_id']);
      $res['TEMPLATE_PARAMS'] = unserialize($res['TEMPLATE_PARAMS']);

      Примерно строки 14-15: привести ID к числу, параметры читать с ограничением классов.

      $res = CSotbitMailingEvent::GetByID((int)$_REQUEST['event_id']);
      $res['TEMPLATE_PARAMS'] = unserialize($res['TEMPLATE_PARAMS'], array('allowed_classes' => false));

      Примерно строки 21-22: получение шаблона по ID.

      $res = CSotbitMailingTemplateTable::getRowById($_REQUEST['template_id']);

      Примерно строки 21-22: передать в метод числовой ID.

      $res = CSotbitMailingTemplateTable::getRowById((int)$_REQUEST['template_id']);

      Примерно строки 34-36: подключение preset-файла.

      include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sotbit.mailing/preset/".$_REQUEST['template_id']."/theme.php");

      Примерно строки 34-36: перед подключением разрешить только безопасное имя preset.

      if(preg_match('/^[A-Za-z0-9_-]+$/', $_REQUEST['template_id']))
      {
          include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sotbit.mailing/preset/".$_REQUEST['template_id']."/theme.php");
      }

      Примерно строки 37-62: получение сообщения и параметров сообщения.

      $ID = $_REQUEST['message_id'];
      ...
      $InfoSend['PARAM_MESSEGE'] = unserialize($InfoSend['PARAM_MESSEGE']);

      Примерно строки 37-62: привести message_id к числу, параметры читать с ограничением классов.

      $ID = (int)$_REQUEST['message_id'];
      ...
      $InfoSend['PARAM_MESSEGE'] = unserialize($InfoSend['PARAM_MESSEGE'], array('allowed_classes' => false));

      Запуск и остановка рассылки

      Файл: admin/sotbit_mailing_start_ajax.php

      Что сделать: добавить проверку сессии Bitrix после проверки прав и до действий, которые запускают или останавливают рассылку.

      НайтиЗаменить

      Примерно строки 8-20: после проверки прав начинается обработка запуска или остановки.

      $CONS_RIGHT = $APPLICATION->GetGroupRight($module_id);
      if($CONS_RIGHT <= "D")
      {
          $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
      }
      
      if($_GET['ID'] && $_GET['MAILING_START'] == 'Y')
      {
          ...
      }

      Примерно строки 8-20: перед действием добавить проверку сессии Bitrix.

      $CONS_RIGHT = $APPLICATION->GetGroupRight($module_id);
      if($CONS_RIGHT <= "D")
      {
          $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
      }
      
      if(!check_bitrix_sessid())
      {
          die();
      }
      
      if($_GET['ID'] && $_GET['MAILING_START'] == 'Y')
      {
          ...
      }

      Список рассылок

      Файл: admin/sotbit_mailing_list.php

      Что сделать: привести входные значения к безопасному типу и экранировать значения перед выводом в HTML и JavaScript.

      НайтиЗаменить

      Примерно строки 129-132: получение parent из запроса.

      $parentID = 0;
      if(isset($_REQUEST["parent"]) && $_REQUEST["parent"])
      {
          $parentID = $_REQUEST["parent"];
      }

      Примерно строки 129-132: хранить parent как числовое значение.

      $parentID = 0;
      if(isset($_REQUEST["parent"]) && $_REQUEST["parent"])
      {
          $parentID = (int)$_REQUEST["parent"];
      }

      Примерно строки 551-552: сборка ссылок редактирования и копирования.

      $editUrl = "sotbit_mailing_detail.php?T=".$f_T."&ID=".$f_ID."&parent=".$parentID."&lang=".LANG;
      $copyUrl = "sotbit_mailing_detail.php?T=".$f_T."&TEMPLATE=".$f_TEMPLATE."&ID_COPY=".$f_ID."&parent=".$parentID."&lang=".LANG;

      Примерно строки 551-552: ограничить тип, привести ID к числу, шаблон передать через urlencode.

      $editUrl = "sotbit_mailing_detail.php?T=".(($f_T == "S") ? "S" : "R")."&ID=".(int)$f_ID."&parent=".$parentID."&lang=".LANG;
      $copyUrl = "sotbit_mailing_detail.php?T=".(($f_T == "S") ? "S" : "R")."&TEMPLATE=".urlencode($f_TEMPLATE)."&ID_COPY=".(int)$f_ID."&parent=".$parentID."&lang=".LANG;

      Примерно строки 567-571: вывод названия в HTML.

      <span>'.$f_NAME.'</span>

      Примерно строки 567-571: экранировать значение перед выводом.

      <span>'.htmlspecialcharsbx($f_NAME).'</span>

      Примерно строка 612: вывод описания в textarea.

      $sHTML = '<textarea name="FIELDS['.$f_T.$f_ID.'][DESCRIPTION]">'.$f_DESCRIPTION.'</textarea>';

      Примерно строка 612: подготовить имя поля и экранировать описание.

      $sHTML = '<textarea name="FIELDS['.(($f_T == "S") ? "S" : "R").(int)$f_ID.'][DESCRIPTION]">'.htmlspecialcharsbx($f_DESCRIPTION).'</textarea>';

      Примерно строки 723 и 736: передача имени шаблона в JavaScript-переход.

      "ACTION" => "window.location = 'sotbit_mailing_detail.php?parent=".$parentID."&lang=".LANG."&TEMPLATE=".$arRes["NAME"]."';"

      Примерно строки 723 и 736: подготовить значение для URL и JavaScript-контекста.

      "ACTION" => "window.location = 'sotbit_mailing_detail.php?parent=".$parentID."&lang=".LANG."&TEMPLATE=".CUtil::JSEscape(urlencode($arRes["NAME"]))."';"

      Примерно строка 883: скрытое поле parent.

      <input type="hidden" name="parent" value="<?=$_REQUEST["parent"]?>" />

      Примерно строка 883: использовать подготовленный parentID.

      <input type="hidden" name="parent" value="<?=$parentID?>" />

      Переходы и сохраненные параметры

      Файл: classes/general/CSotbitMailingHelp.php

      Что сделать: привести ID к числу, добавить безопасную обработку сериализованных данных, заменить прямые переходы на проверенный helper и добавить безопасное чтение массивов.

      НайтиЗаменить

      Примерно строки 1617-1719: получение и обновление сообщения по ID из запроса.

      $mailing_message = CSotbitMailingMessage::GetByIDInfoStatic($_GET['MAILING_MESSAGE']);
      ...
      CSotbitMailingMessage::Update($_GET['MAILING_MESSAGE'],$arrFields);

      Примерно строки 1617-1719: использовать числовой ID при чтении и обновлении.

      $mailing_message = CSotbitMailingMessage::GetByIDInfoStatic((int)$_GET['MAILING_MESSAGE']);
      ...
      CSotbitMailingMessage::Update((int)$_GET['MAILING_MESSAGE'],$arrFields);

      Примерно строки 1650-1654: чтение сохраненных статистических массивов.

      $arrFields['STATIC_USER_BACK_DATE'] = unserialize($mailing_message['STATIC_USER_BACK_DATE']);
      $arrFields['STATIC_USER_ID'] = unserialize($mailing_message['STATIC_USER_ID']);
      $arrFields['STATIC_PAGE_START'] = unserialize($mailing_message['STATIC_PAGE_START']);

      Примерно строки 1650-1654: читать массивы с ограничением классов.

      $arrFields['STATIC_USER_BACK_DATE'] = unserialize($mailing_message['STATIC_USER_BACK_DATE'], array('allowed_classes' => false));
      $arrFields['STATIC_USER_ID'] = unserialize($mailing_message['STATIC_USER_ID'], array('allowed_classes' => false));
      $arrFields['STATIC_PAGE_START'] = unserialize($mailing_message['STATIC_PAGE_START'], array('allowed_classes' => false));

      Примерно строки 1719 и 1730: переход по URL из обработчика.

      $APPLICATION->RestartBuffer();
      LocalRedirect($user_came_where_redirect, true);
      ...
      LocalRedirect($_GET['MAILING_FILE_REDURECT'], true);

      Примерно строки 1719 и 1730: передать URL через helper, который проверяет значение перед переходом.

      self::redirectToSafeHeaderLocation(
          isset($_GET['MAILING_FILE_REDURECT']) ? $_GET['MAILING_FILE_REDURECT'] : $user_came_where_redirect,
          isset($_GET['MAILING_MESSAGE']) ? (int)$_GET['MAILING_MESSAGE'] : 0
      );

      Примерно строки 1902-1933: отдельного helper для проверенного перехода не было.

      // отдельного helper для проверенного перехода не было

      Примерно строки 1902-1933: добавить helper, который проверяет URL и связь с сообщением перед переходом.

      protected static function redirectToSafeHeaderLocation($url, $mailingMessageId = false)
      {
          if(!is_string($url) || $url === '' || preg_match('/[\r\n]/', $url))
              return false;
      
          $parts = parse_url($url);
          if(!is_array($parts) || empty($parts['scheme']) || empty($parts['host']))
              return false;
      
          $scheme = strtolower($parts['scheme']);
          if($scheme !== 'http' && $scheme !== 'https')
              return false;
      
          if($mailingMessageId !== false)
          {
              $mailingMessageId = (int)$mailingMessageId;
              if($mailingMessageId <= 0)
                  return false;
      
              $mailingMessage = CSotbitMailingMessage::GetByID($mailingMessageId);
              if(!$mailingMessage || empty($mailingMessage['MESSEGE']))
                  return false;
      
              if(strpos($mailingMessage['MESSEGE'], 'MAILING_FILE_REDURECT='.urlencode($url)) === false)
                  return false;
          }
      
          global $APPLICATION;
          $APPLICATION->RestartBuffer();
          header("Location: ".$url, true, 302);
          exit;
      }

      Примерно строки 92, 1552, 1578: чтение сохраненных параметров события, шаблона и настроек.

      $EVENT_PARAMS = unserialize($arrData['EVENT_PARAMS']);
      ...
      'TEMPLATE_PARAMS' => unserialize($res_activeTemp['TEMPLATE_PARAMS'])

      Примерно строки 92, 1552, 1578: ограничить чтение сериализованных параметров.

      $EVENT_PARAMS = unserialize($arrData['EVENT_PARAMS'], array('allowed_classes' => false));
      ...
      'TEMPLATE_PARAMS' => unserialize($res_activeTemp['TEMPLATE_PARAMS'], array('allowed_classes' => false))

      Примерно строки 1935-1945: единый helper для чтения массивов.

      // единого helper для безопасного чтения массивов не было

      Примерно строки 1935-1945: добавить helper для JSON и serialized arrays.

      public static function DecodeArrayValue($value)
      {
          if(is_string($value) && is_array($tmp = json_decode($value, true)))
              return $tmp;
      
          if(is_string($value) && $value !== '' && is_array($tmp = unserialize($value, array('allowed_classes' => false))))
              return $tmp;
      
          return array();
      }

      Статистика открытия письма

      Файл: admin/sotbit_mailing_img.php

      Что сделать: безопасно читать сохраненный массив дат открытия письма.

      НайтиЗаменить

      Примерно строка 27: чтение массива дат открытия.

      $arrFields['STATIC_USER_OPEN_DATE'] = unserialize($mailing_message['STATIC_USER_OPEN_DATE']);

      Примерно строка 27: читать массив с ограничением классов.

      $arrFields['STATIC_USER_OPEN_DATE'] = unserialize($mailing_message['STATIC_USER_OPEN_DATE'], array('allowed_classes' => false));

      Основная логика отправки

      Файл: include.php

      Что сделать: во всех местах чтения сохраненных параметров рассылки и сообщения ограничить десериализацию.

      НайтиЗаменить

      Примерно строки 123-132: параметры шаблона и исключения подписчиков.

      $templateInfo = unserialize($mailingInfo['TEMPLATE_PARAMS']);
      $templateInfo['MAILING_EXCLUDE_UNSUBSCRIBED_USER_MORE'] = unserialize($mailingInfo['EXCLUDE_UNSUBSCRIBED_USER_MORE']);

      Примерно строки 123-132: читать параметры с ограничением классов.

      $templateInfo = unserialize($mailingInfo['TEMPLATE_PARAMS'], array('allowed_classes' => false));
      $templateInfo['MAILING_EXCLUDE_UNSUBSCRIBED_USER_MORE'] = unserialize($mailingInfo['EXCLUDE_UNSUBSCRIBED_USER_MORE'], array('allowed_classes' => false));

      Примерно строки 226 и 416: параметры рассылки и сообщения перед отправкой.

      $MailingInfo['EXCLUDE_UNSUBSCRIBED_USER_MORE'] = unserialize($MailingInfo['EXCLUDE_UNSUBSCRIBED_USER_MORE']);
      $InfoSend['PARAM_MESSEGE'] = unserialize($InfoSend['PARAM_MESSEGE']);

      Примерно строки 226 и 416: использовать безопасное чтение массивов.

      $MailingInfo['EXCLUDE_UNSUBSCRIBED_USER_MORE'] = unserialize($MailingInfo['EXCLUDE_UNSUBSCRIBED_USER_MORE'], array('allowed_classes' => false));
      $InfoSend['PARAM_MESSEGE'] = unserialize($InfoSend['PARAM_MESSEGE'], array('allowed_classes' => false));

      Примерно строки 631, 648 и 700: параметры активных шаблонов и сообщений.

      $arParams = unserialize($res_activeTemp['TEMPLATE_PARAMS']);
      $message['PARAM_MESSEGE'] = unserialize($message['PARAM_MESSEGE']);
      $resGetMessage['PARAM_MESSEGE'] = unserialize($resGetMessage['PARAM_MESSEGE']);

      Примерно строки 631, 648 и 700: читать только массивы без создания классов.

      $arParams = unserialize($res_activeTemp['TEMPLATE_PARAMS'], array('allowed_classes' => false));
      $message['PARAM_MESSEGE'] = unserialize($message['PARAM_MESSEGE'], array('allowed_classes' => false));
      $resGetMessage['PARAM_MESSEGE'] = unserialize($resGetMessage['PARAM_MESSEGE'], array('allowed_classes' => false));

      Подписчики и настройки

      Файлы: classes/general/CsotbitMailingSubTools.php, classes/general/CModuleOptions.php

      Что сделать: подготовить значения из cookies, безопасно читать настройки категорий и использовать штатную генерацию случайной строки.

      НайтиЗаменить

      Примерно строки 10-13: значение страницы перехода из cookies.

      $arFields["STATIC_PAGE_CAME"] = $_COOKIE['MAILING_USER_CAME'];

      Примерно строки 10-13: подготовить значение перед сохранением.

      $arFields["STATIC_PAGE_CAME"] = htmlspecialcharsbx($_COOKIE['MAILING_USER_CAME']);

      Примерно строки 52-53: группы и списки подписок категории.

      $categoriesItem['SUNC_USER_GROUP'] = unserialize($categoriesItem['SUNC_USER_GROUP']);
      $categoriesItem['SUNC_SUBSCRIPTION_LIST'] = unserialize($categoriesItem['SUNC_SUBSCRIPTION_LIST']);

      Примерно строки 52-53: читать массивы с ограничением классов.

      $categoriesItem['SUNC_USER_GROUP'] = unserialize($categoriesItem['SUNC_USER_GROUP'], array('allowed_classes' => false));
      $categoriesItem['SUNC_SUBSCRIPTION_LIST'] = unserialize($categoriesItem['SUNC_SUBSCRIPTION_LIST'], array('allowed_classes' => false));

      Примерно строка 126: генерация пароля для нового пользователя.

      $USER_PASSWORD = randString(10, array("abcdefghijklnmopqrstuvwxyz","ABCDEFGHIJKLNMOPQRSTUVWXYZ","0123456789"));

      Примерно строка 126: использовать штатный генератор случайной строки.

      $USER_PASSWORD = \Bitrix\Main\Security\Random::getString(10);

      Примерно строка 97 в CModuleOptions.php: чтение множественной настройки.

      $this->arCurOptionValues[$opt] = unserialize($this->arCurOptionValues[$opt]);

      Примерно строка 97 в CModuleOptions.php: читать настройку с ограничением классов.

      $this->arCurOptionValues[$opt] = unserialize($this->arCurOptionValues[$opt], array('allowed_classes' => false));
      Для шаблонов компонента правки повторяются по одному принципу: AJAX-обработчики принимают POST-запрос, проверяют сессию Bitrix и подготавливают входные значения; template.php экранирует вывод и передает sessid в запрос.

      AJAX формы подписки

      Файлы: install/components/sotbit/sotbit.mailing.email.get/templates/.default/ajax.php, field/ajax.php, popup_click/ajax.php, popup_time/ajax.php

      Что сделать: принимать отправку только POST-запросом, проверять сессию Bitrix и приводить входные значения к ожидаемому формату.

      НайтиЗаменить

      Примерно строки 12-20 в ajax.php: обработка отправки формы через REQUEST.

      if($_REQUEST['getemail']=='Y' && !empty($_REQUEST['EMAIL_TO'])){
          $EMAIL_SAVE = array(
              "EMAIL_TO" => $_REQUEST['EMAIL_TO'],
          );
      }

      Примерно строки 12-25 в ajax.php: принимать POST, проверить sessid и подготовить email.

      if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['getemail']=='Y' && !empty($_POST['EMAIL_TO'])){
          if (!check_bitrix_sessid()) {
              echo json_encode(array('error' => 'invalid_sessid'));
              die();
          }
      
          $EMAIL_SAVE = array(
              "EMAIL_TO" => trim($_POST['EMAIL_TO']),
          );
      }

      Примерно строки 20-30 в ajax.php: категории передаются как есть.

      if($_REQUEST['CATEGORIES_ID']) {
          $EMAIL_SAVE['CATEGORIES_ID'] = $_REQUEST['CATEGORIES_ID'];
      }

      Примерно строки 24-28 в ajax.php: привести ID категорий к числам.

      if(!empty($_POST['CATEGORIES_ID'])) {
          $EMAIL_SAVE['CATEGORIES_ID'] = array_map('intval', (array)$_POST['CATEGORIES_ID']);
      }

      Шаблоны форм подписки

      Файлы: install/components/sotbit/sotbit.mailing.email.get/templates/.default/template.php, field/template.php, popup_click/template.php, popup_time/template.php

      Что сделать: экранировать текстовые параметры, передавать параметры в JavaScript через штатные функции, добавлять sessid в AJAX-запрос и проверять цвета по формату.

      НайтиЗаменить

      Примерно первые строки template.php: вывод текста и email в HTML.

      <label><?=$arParams["PANEL_TEXT"]?></label>
      <input type="text" value="<?=$arResult['SUBSCRIBER_INFO']['EMAIL_TO']?>" name="EMAIL_TO">

      Экранировать текст и значение поля перед выводом.

      <label><?=htmlspecialcharsbx($arParams["PANEL_TEXT"])?></label>
      <input type="text" value="<?=htmlspecialcharsbx($arResult['SUBSCRIBER_INFO']['EMAIL_TO'])?>" name="EMAIL_TO">

      Примерно блок JavaScript: параметры передаются строкой, sessid не добавляется.

      var params = "<?=$arResult['STR_PARAMS']?>";
      ...
      data: 'getemail=Y&EMAIL_TO=' + email +'&'+ params,

      Передать параметры через JS-объект и добавить sessid в запрос.

      var params = <?=CUtil::PhpToJSObject($arResult['STR_PARAMS'])?>;
      ...
      data: 'getemail=Y&EMAIL_TO=' + email +'&'+ params + '&sessid=' + BX.bitrix_sessid(),

      Примерно блок успешной отправки: текст вставляется как HTML.

      $('.bottom_pannel_in label').html('<?=$EMAIL_SEND_END?>');

      Выводить текст как текстовое значение и подготовить для JS.

      $('.bottom_pannel_in label').text('<?=CUtil::JSEscape($EMAIL_SEND_END)?>');

      Примерно блок CSS: цветовые параметры выводятся напрямую.

      background-color: #<?=$arParams["COLOR_PANEL"]?>;

      Проверить цвет по формату и использовать значение по умолчанию.

      background-color: #<?=preg_match('/^#?[0-9A-Fa-f]{6}$/', $arParams["COLOR_PANEL"]) ? ltrim($arParams["COLOR_PANEL"], '#') : '2B5779'?>;

      Проверка после правок

      Проверку выполняйте на тестовой копии сайта. Реальную рассылку во время проверки не запускайте.
      Что проверитьОжидаемый результат
      Настройки модуля и права доступаАдминистративные страницы открываются только пользователям с нужными правами.
      Сценарии рассылок и карточка сценарияСценарии открываются, сохраняются и не теряют параметры.
      Шаблон письма и предпросмотрШаблон загружается из допустимого preset или из сохраненного шаблона, предпросмотр отображается корректно.
      Статистика и графикиСтраница статистики открывается, значения отображаются без ошибок JavaScript.
      Формы подписки и AJAXФорма принимает корректные данные, отклоняет некорректные и показывает штатное сообщение.
      Редиректы из писемРазрешенные ссылки открываются, некорректные значения не приводят к переходу.
      Описание курса


      назадДля разработчиков Видео-урокивперед
      Компания
      Лицензии
      Услуги
      Кейсы
      Блог
      Акции
      Документация
      Контакты
      Подписаться на рассылку
      +7 495-256-29-09
      +7 495-256-29-09
      Заказать звонок
      E-mail
      sale@proficrm.ru
      Адрес
      г. Санкт-Петербуг, ул Кременчугская, д.11, к1

      Режим работы
      Пн. – Пт.: с 10:00 до 18:00
      Заказать звонок
      sale@proficrm.ru
      г. Санкт-Петербуг, ул Кременчугская, д.11, к1

      © ПрофиCRM 2026
      Политика конфиденциальности
      0 Корзина

      Ваша корзина пуста

      Исправить это просто: выберите в каталоге интересующий товар и нажмите кнопку «В корзину»
      Перейти в каталог