Каталог решений

Покупка продления купона

Продолжительность:
Общая сумма:
0 руб.
Ваш запрос успешно отправлен!

Я согласен с условиями активации продлений
Продлить
Продолжить покупки

Лоджик: Корпоративный сайт интернет-провайдера

Лоджик: Корпоративный сайт интернет-провайдера

Лоджик: Корпоративный сайт интернет-провайдера

Купить: 74 900 руб.
Попробовать (10 дней) Онлайн-демо
Купить продление
Скриншоты
Описание

Технические данные

Опубликовано:
19.05.2025
Обновлено:
22.09.2026
Версия:
2.0.0
Установлено:
Менее 50 раз
Подходящие редакции:
«Первый сайт», «Старт», «Стандарт», «Малый бизнес», «Бизнес»
Адаптивность:
Да
Поддержка Композита:
Нет
Совместимо с Сайты24
Нет

Пользовательское соглашение

Описание













Отзывы (0)
Обсуждения (0)
Здесь пока никто ничего не написал. Будьте первым.
Что нового
2.0.0 (22.09.2026) Версия 2.0.0 — безопасность, Яндекс SmartCaptcha, PHP 8.5 и рефакторинг Внимание. В версии есть несовместимые изменения (см. последний раздел). Перед обновлением рабочего сайта сделайте резервную копию. 1. Исправление уязвимостей
  • Неаутентифицированный захват чужого заказа по e-mail. В ajax/submit.php при USE_CREATE_ORDER=Y покупатель искался в UserTable по значению EMAIL из запроса, и заказ создавался на найденного пользователя: анонимный посетитель, зная чужую почту, оформлял заказ в личном кабинете этого пользователя. Владелец заказа теперь определяется только по текущей сессии — авторизованный пользователь или анонимный покупатель корзины, а тип плательщика, товар для покупки в один клик и поле комментария берутся из подписанных параметров компонента, а не из запроса.
  • Неаутентифицированная запись в произвольный инфоблок. IBLOCK_ID, SECTION_ID, IBLOCK_ITEM_NAME и ACTIVE принимались прямо из запроса, а в PROPERTY_VALUES попадали все POST-ключи, для которых нашлось свойство с таким кодом. Введена подпись серверных параметров формы (\Logicloud\Connect\Security\FormSigner на базе Bitrix\Main\Security\Sign\Signer): браузер возвращает подписанную строку, подменить её нельзя. Инфоблок дополнительно проверяется на принадлежность текущему сайту, свойства принимаются только из списка полей, объявленных в настройках формы. Вызов htmlspecialchars_decode() для имени элемента убран — он восстанавливал HTML-теги из сущностей.
  • Инъекция в письмо через произвольный шаблон почтового события. Имя события приходило из запроса, а в C_FIELDS складывались все POST-значения без очистки — атакующий выбирал любой зарегистрированный на сайте шаблон и подставлял в макросы символы перевода строки, добавляя собственные заголовки письма. Имя события теперь берётся только из подписанных параметров, из всех значений удаляются символы \r и \n, тело письма экранируется.
  • Неаутентифицированный вызов произвольных обработчиков событий ядра. Код выполнял GetModuleEvents("main", $_POST['EVENT_ID'], true) и передавал обработчику весь $_POST, то есть анонимный клиент вызывал любой обработчик, зарегистрированный на модуль main, с произвольными аргументами. Имя события берётся из подписанных параметров, область поиска ограничена модулем logicloud.connect, в обработчик передаётся отфильтрованный по белому списку набор полей.
  • Неаутентифицированная загрузка файлов в web-доступную область. Перебирались все элементы $_FILES (имя поля выбирал атакующий), файлы сохранялись в корень /upload/ и в /orders/ без ограничения расширения, размера и количества. Теперь загрузка возможна только в поля типа «Файл», объявленные в настройках компонента; действует белый список расширений, ограничение 10 МБ на файл и 10 файлов на поле, проверка is_uploaded_file(), файлы складываются в отдельный каталог /upload/logicloud.connect.forms/ и привязываются к модулю.
  • CSRF и mass assignment на сохранение настроек модуля. Обе точки входа — options.php и admin/logicloud.connect.php — записывали в настройки ВСЕ пришедшие POST-ключи без белого списка и без проверки sessid: сторонняя страница могла переписать любую настройку от имени администратора, включая ключи капчи и опцию scripts, которая выводится на каждой странице сайта без экранирования. Добавлены check_bitrix_sessid(), bitrix_sessid_post() в обеих формах, проверка права «W» на модуль и белый список сохраняемых настроек.
  • CSRF на удаление произвольного файла. Эндпоинт property/image/ajax/imageUpdate.php выполнял CFile::Delete($_POST['id']) без проверки sessid — сторонняя страница могла заставить браузер администратора удалить любой файл из b_file: логотипы, изображения товаров, документы. Добавлены проверка sessid и прав, удаление разрешено только для файлов, загруженных этим модулем; загрузка ограничена белым списком расширений и размером.
  • Неаутентифицированная запись в настройки модуля. Эндпоинт tools/set.preview.option.php подключал prolog_before.php, то есть был доступен анонимно и без sessid: любой посетитель бесконечно перезаписывал настройку произвольной структурой. Эндпоинт нужен только админской странице, поэтому переведён на prolog_admin_before.php с проверкой sessid и права «W»; принимаемая структура жёстко валидируется.
  • unserialize() без ограничения классов. Значение настройки connect-temp-file-options читалось через unserialize() без allowed_classes в options.php, admin/logicloud.connect.php, tools/upload.file.php и lib/Admin/Options.php, а записать в эту настройку произвольную строку можно было через mass assignment выше — то есть при наличии подходящей цепочки гаджетов это PHP Object Injection. Все чтения переведены на \Logicloud\Connect\Settings::getArray() с allowed_classes = false и проверкой типа.
  • Загрузка файла настроек без проверок. tools/upload.file.php сохранял файл по имени поля из запроса без sessid, прав и белого списка расширений. Добавлены проверка sessid и права «W», приём только объявленных файловых настроек, белый список расширений и ограничение размера.
  • Неаутентифицированный доступ к элементам произвольного инфоблока. Страницы include/ajax/tariff, include/ajax/equipment и include/ajax/channels передавали в компоненты ELEMENT_ID, IBLOCK_ID и SECTION_ID прямо из запроса при USE_PERMISSIONS => "N", что позволяло читать содержимое инфоблоков, не предназначенных для публичного показа. Инфоблок тарифов принимается только из списка инфоблоков решения, инфоблок оборудования зафиксирован макросом, раздел каналов проверяется на принадлежность инфоблоку каналов, все идентификаторы приводятся к числу.
  • XSS в JS-контексте шаблонов форм. Значения выводились внутрь строкового литерала в одинарных кавычках через JSON.parse(''), а json_encode() по умолчанию одинарную кавычку не экранирует; туда же без экранирования попадали FUNCTION_JS и публичный ключ капчи. Во всех восьми шаблонах формы блок инициализации переписан на CUtil::PhpToJSObject() и CUtil::JSEscape(), два почти одинаковых блока сведены в один.
  • XSS через значения полей формы. Скрытые поля печатались как '<input type="hidden" name="<?= $input['CODE'] ?>" value="<?= $input['VALUE'] ?>">' без экранирования, а значения приходят из инфоблоков (например имя тарифа) — кавычка в значении разрывала атрибут. Экранирование добавлено во всех восьми шаблонах формы, а также в component.php, где собираются готовые атрибуты value и placeholder.
  • Создание файла по пути из параметров компонента. Параметр AREA_ID подставлялся в путь как есть, и последовательности '../' позволяли создать пустой PHP-файл в любой точке document_root. Значение очищается до символов [A-Za-z0-9_-].
  • Отладочный лог в корне сайта. Мастер установки при каждом запуске писал /log.txt в document_root, файл оставался доступен по HTTP. Запись убрана.
Дополнительно по отчёту о проверке безопасности Следующие четыре группы замечаний пришли отдельным отчётом проверки и исправлены в этой же версии. 1.1. Отражённый XSS в блоке тарифов
  • Шаблон catalog.section.list/tariff.tabs печатал значение REGION_ID внутрь HTML-атрибута data-ajax-region без экранирования, а значение приходило из $_REQUEST публичного неаутентифицированного эндпоинта include/ajax/tariff.tabs/. Кавычка в значении закрывала атрибут, и ссылка вида /include/ajax/tariff.tabs/?REGION_ID="><script>... исполняла произвольный JS в контексте домена сайта. Значение теперь приводится к числу и экранируется.
  • Эндпоинт include/ajax/tariff.tabs/index.php нормализует все входные значения до передачи в компонент: REGION_ID и ACTIVE_TAB приводятся к целому числу, SUBURBAN — к фиксированному набору true/false. Шаблон больше не рассчитывает на то, что приведение типов выполнит кто-то другой: он повторяет нормализацию у себя, поскольку может быть переопределён отдельно.
  • Сравнение активной вкладки переведено на числовое: после приведения ACTIVE_TAB к int строгое сравнение со строковым ID секции перестало бы срабатывать.
  • В том же шаблоне экранирован остальной вывод: CODE, NAME и ID разделов.
1.2. Вывод значений инфоблока без экранирования
  • Шаблон news.detail/tariff.modal выводил NAME, PREVIEW_TEXT и значения свойств INET_EXTRA, INET_SPEED, MAIN_OPTION (включая DESCRIPTION), PRICE, PRICE_MARK и OLD_PRICE прямо в разметку. Весь вывод переведён на htmlspecialcharsbx().
  • Убран вызов html_entity_decode() для значения MAIN_OPTION: он возвращал сохранённые HTML-сущности в реальные теги, то есть снимал экранирование, выполненное при сохранении элемента.
1.3. Ссылки и иконки соцсетей
  • Шаблон news.list/social печатал адрес ссылки без проверки схемы: значение вида javascript:... исполнялось при клике по иконке. Теперь разрешены только схемы http, https, mailto, tel и относительные адреса, значение экранируется, ссылке добавлен rel="noopener noreferrer".
  • Содержимое файла иконки вставлялось в разметку через file_get_contents() как есть: SVG со скриптом или обработчиком события исполнялся inline на странице. Добавлен санитайзер \Logicloud\Connect\Security\Svg — он разбирает SVG и оставляет только графические теги и атрибуты по белому списку, отбрасывая script, foreignObject, обработчики событий, ссылки с javascript:/data: и DOCTYPE с внешними сущностями (XXE). Inline-вставка сохранена, поэтому перекраска иконок через CSS продолжает работать; растровые иконки и не прошедший разбор SVG выводятся через <img>.
  • Элементы без ссылки или без иконки пропускаются, а не выводятся пустыми.
1.4. Настройка «Дополнительные скрипты и счетчики»
  • Значение настройки scripts выводилось в footer.php через htmlspecialcharsback() — функция не экранирует, а снимает ранее применённое экранирование, поэтому сохранённый в настройке <script> исполнялся у всех посетителей на каждой странице сайта.
  • Добавлена нормализация значения: \Logicloud\Connect\Settings::sanitizeScripts() оставляет только подключения внешних счётчиков — <script src="https://..."></script> без inline-тела, <img src="https://..."> и <noscript> с такими же <img> внутри. Атрибуты фильтруются по белому списку, обработчики событий и значения с javascript:/data:/expression() отбрасываются, источник обязан быть абсолютным https-адресом.
  • Нормализация выполняется дважды: при сохранении формы настроек (значение записывается уже очищенным, администратор видит уведомление, если что-то было отфильтровано) и при выводе в шаблоне — чтобы значение, сохранённое прежними версиями, тоже не исполнилось.
  • Под полем настройки выведена подсказка с допустимым форматом.
2. Переход с Google reCAPTCHA v3 на Яндекс SmartCaptcha
  • Валидация форм переведена на Яндекс SmartCaptcha. Токен проверяется на сервере по адресу https://smartcaptcha.cloud.yandex.ru/validate, результат читается из поля status ответа (ok/failed).
  • Поля настроек заменены: вместо «Публичный ключ», «Секретный ключ» и «Минимальная оценка пользователя» теперь «Клиентский ключ» и «Серверный ключ». Порог оценки убран — у SmartCaptcha ответ бинарный, оценки score в ней нет. Ссылка за ключами ведёт в консоль Yandex Cloud.
  • Ключи хранятся в настройках модуля под именами captcha-client-key и captcha-server-key. Неприменимые ключи Google удаляются автоматически при обновлении.
  • Капча невидимая: виджет отрисовывается в скрытый контейнер формы и запускается при отправке, посетитель видит проверку только в спорных случаях.
  • Промежуточный запрос к ajax/captcha.php убран, и это требование сервиса: токен SmartCaptcha одноразовый и живёт пять минут, поэтому предварительная проверка «расходовала» бы его и отправка формы всегда завершалась бы ошибкой. Токен уходит сразу в ajax/submit.php. Файл ajax/captcha.php оставлен и отвечает кодом 410, чтобы закешированные у посетителей старые скрипты получали понятный ответ, а не 404.
  • Обработаны ошибки виджета (network-error, javascript-error) и добавлена страховка по таймауту; после отправки виджет сбрасывается, повторная отправка работает без перезагрузки страницы.
  • Раньше капча не работала вовсе: скрипт Google на страницы сайта не подключался, поэтому вызов grecaptcha в forms.js завершался ошибкой. Теперь загрузчик виджета добавлен в header.php шаблона и подключается только при заполненных ключах.
3. Поддержка PHP 8.5
  • Убраны короткие открывающие теги <? в lib/Admin/Options.php и двух языковых файлах — при short_open_tag = Off код выводился как текст.
  • Инициализированы переменные $by/$order, передаваемые по ссылке в CEventMessage::GetList(), CLanguage::GetList() и CSite::GetList() в шести файлах — ранее выдавалось «Undefined variable».
  • Свойства класса установщика объявлены явно вместо var и динамических свойств (устарели с PHP 8.2), добавлены MODULE_GROUP_RIGHTS, PARTNER_NAME и PARTNER_URI.
  • Устранены обращения к несуществующим ключам массивов (?? и isset) в настройках, шаблонах и обработчиках.
  • В установщик добавлена проверка минимальной версии PHP с понятным сообщением.
4. Кеширование
  • Время жизни кеша уменьшено с 36 000 000 секунд (более 400 дней) до разумных значений в пятнадцати вызовах компонентов: при отключённом управляемом кеше контент не обновлялся больше года.
5. Рефакторинг
  • Добавлен слой классов модуля: \Logicloud\Connect\Settings (белый список и безопасное чтение настроек), \Logicloud\Connect\Security\FormSigner (подпись параметров форм), \Logicloud\Connect\Security\Captcha (серверная проверка SmartCaptcha), \Logicloud\Connect\Iblock\Resolver (поиск инфоблоков и белый список свойств).
  • В include.php добавлена явная регистрация автозагрузки. До 2.0.0 файл был пустым, и загрузка классов из lib/ целиком полагалась на автоматическое правило ядра, которое приводит путь к нижнему регистру — на регистрозависимой файловой системе файлы lib/Main.php и lib/Admin/Options.php этим правилом не находятся.
  • Обработка сохранения настроек вынесена в admin/settings_handler.php: options.php и admin/logicloud.connect.php содержали две копии одного и того же кода. Переключатель вкладок вынесен в admin/include/tabs.php.
  • Компонент форм переписан: подписанные параметры вместо открытого POST, экранирование готовых атрибутов, единая карта сообщений об ошибках, числовая сортировка полей вместо strcmp.
  • Публичные эндпоинты приведены к единому виду: проверка метода запроса, понятные коды ответа (400/403/405/413/415/500) вместо молчаливого выхода.
  • Шаблоны форм: восемь почти одинаковых блоков инициализации JS сведены к одному виду, добавлены method и enctype, которых у формы не было.
6. Несовместимые изменения
  • После обновления форму защищает капча только при заполненных ключах SmartCaptcha. Ключи Google не переносятся и удаляются. Получите клиентский и серверный ключ в Yandex Cloud SmartCaptcha и укажите их в настройках модуля.
  • Пользовательское событие формы теперь ищется среди обработчиков, зарегистрированных на модуль logicloud.connect, а не main. Существующие обработчики нужно перерегистрировать: AddEventHandler('logicloud.connect', 'ВАШЕ_СОБЫТИЕ', ...). Обработчик получает массив только из полей, объявленных в настройках компонента.
  • Публичный эндпоинт ajax/submit.php принимает только запросы с корректной подписью параметров, действительной сутки и только для того сайта, где она выдана. Прямые вызовы из стороннего кода, собиравшие POST вручную, перестанут работать. Если страница с формой отдаётся из долгоживущего кеша, убедитесь, что время жизни кеша меньше суток.
  • Эндпоинт ajax/captcha.php больше не выполняет проверку и отвечает кодом 410.
  • Эндпоинт tools/set.preview.option.php требует авторизации в админке и права «W» на модуль.
  • Для страницы настроек модуля требуется право «W» на модуль logicloud.connect. После обновления проверьте права групп пользователей.
  • Изменения в шаблоне сайта и в публичных страницах (каталог install/wizards) попадают в /bitrix/wizards и применяются при установке мастером. Для уже развёрнутого сайта нужно перенести вручную, с учётом ваших правок, файлы include/ajax/tariff/index.php, include/ajax/equipment/index.php, include/ajax/channels/index.php, include/ajax/tariff.tabs/index.php, templates/logicloud.connect/header.php, templates/logicloud.connect/footer.php и три шаблона компонентов: catalog.section.list/tariff.tabs, news.detail/tariff.modal, news.list/social.
  • Inline-код в поле «Дополнительные скрипты и счетчики» больше не выводится. Классический сниппет Яндекс.Метрики, написанный прямо в поле, после обновления не сработает — используйте подключение внешним файлом и пиксель в <noscript>. Сохранённое значение при обновлении не переписывается: вы увидите его в поле и перенесёте счётчики осознанно.
7. Установка обновления
  • Исправлена фатальная ошибка «syntax error, unexpected token "<", expecting end of file» в include.php на первой строке, из-за которой модуль не подключался после установки — падала в том числе страница «Установленные решения» в админке. Причина: при публикации в Маркетплейсе include.php оборачивается защитой — код файла встраивается в середину обёртки со снятием открывающего тега, а в конец дописывается блок проверки лицензии, который начинается с открывающего тега. Файл версии 2.0.0 был оформлен в современном стиле, без закрывающего тега, поэтому открывающий тег блока проверки попадал внутрь PHP-кода. Теперь include.php заканчивается закрывающим тегом, как того требует обёртка.
  • Из include.php убраны оператор use и однострочные комментарии: обёртка минифицирует код в одну строку, и в таком виде оба конструкта ненадёжны. Классы указываются полными именами. Требования к оформлению файла описаны комментарием в нём самом, чтобы они не потерялись при следующих правках.
Установка
  1. Загрузите и установите решение из магазина

  2. Перейдите в список мастеров, найдите «Logicloud: Connect» и из меню действий выберите «Установить»

  3. Пройдите все шаги установки

  4. Готово. Наполните сайт актуальной информацией и пользуйтесь

Персональную информацию, указываемую на одном из шагов установки, можно отредактировать в разделе «Настройка шаблона» административной панели.

Поддержка
По техническим вопросам пишите на почту: sup@lcld.ru

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

Другие решения разработчика

Решение добавлено в корзину

Перейдите в корзину и оформите заказ или продолжите покупки
Перейти в корзину
Продолжить покупки