- 1PHP-файл, который сервер согласен выполнить, — index.php
- 1 часмежду сверками файлов с подписанной описью
- 5попыток входа в минуту — дальше сервер не слушает
- 4096бит в ключе, которым подписан каждый выпуск
Октябрь 2026
PHP2Shell: что случилось и что мы сделали
В октябре 2026 года в самом PHP нашли две уязвимости — CVE-2026-109618 и CVE-2026-109619. Они позволяли выполнить команды на сервере ещё до того, как запустится код сайта, и закрыть их могло только обновление PHP. По хостингам прошла волна взломов. Типовой след — подброшенный файл вроде public/images/x.php, который сервер послушно выполняет, а владелец замечает через недели.
- 22 октября — свой сервер первым. Исправленный пакет PHP пришёл на наш сервер. Проверили сервер — следов взлома нет. Потом выключили
session.upload_progressи оставили вход по SSH только по ключу. - Выпуск 3.10.40 — только index.php. Сервер отказывается выполнять любой PHP-файл, кроме index.php. Подброшенный файл остаётся мёртвым грузом.
- Там же — PHP в содержимом выключен. Раньше на сайте, обновлённом со старой версии, выполнение PHP-кода из материалов оставалось включённым без ведома владельца. Теперь оно включается только явно.
- Выпуск 3.10.41 — сторож целостности. Раз в час файлы сверяются с подписанной описью поставки. Недели, за которые обычно замечают взлом, превращаются в час.
- Там же — строка PHP в панели. Сводка безопасности говорит, закрыт ли PHP вашего сервера. Не по номеру версии, а по существу — ниже объясняем, почему это важно.
- Проверка боем. На нашем сервере первая сверка заняла 0,3 секунды и расхождений не нашла. Файл, подброшенный для пробы, сторож поймал.
Дверь, о которой владелец не знает, должна быть закрыта с самого начала, а не после первого взлома.
Слой 1 · Сервер
Подброшенный файл не запустится
Laravel нужна одна точка входа. Всё остальное, что сервер мог бы выполнить как PHP, он отклоняет сам — до любого кода сайта.
Одна дверь вместо тысячи
Под запретом все расширения, которые PHP способен исполнить: .php с цифрой и без, .phtml, .pht, .phps, .phar. Файл x.php в папке картинок вернёт отказ, а не выполнит команду злоумышленника.
- Apache, cPanel, LiteSpeed: правило уже лежит в
public/.htaccessи работает сразу после установки. - nginx: то же правило задаётся в настройках сервера. Так устроен и наш: в PHP уходит только
/index.php. - Правило сторожит автотест: незаметно потерять его в следующем выпуске нельзя.

Слой 2 · PHP
Панель скажет, закрыт ли ваш PHP
Код сайта может быть безупречным, а сайт всё равно взломают через сам PHP. Владелец сайта на хостинге свою версию PHP обычно не знает — поэтому сводка на главной панели говорит прямо, в каком он состоянии.
- ЗакрытВерсия не ниже исправленной — для ветки 8.5 это 8.5.12.
- Исправления перенесеныDebian и Ubuntu закрывают уязвимость в своём пакете, не меняя номер: на нашем сервере стоит закрытый PHP 8.5.4. Панель читает журнал пакета и видит это.
- ОткрытПанель называет уязвимости, версию, до которой обновиться, и что выключить до обновления.
- НеизвестноНомер ниже исправленного, а журнал пакета прочитать нельзя. Панель просит уточнить у хостинга.
- Ветка без поддержкиPHP старше 8.2 исправлений безопасности больше не получает. Пора переходить.
- Без задержекЖурнал пакета весит мегабайт, поэтому перечитывается раз в шесть часов, а сводка открывается мгновенно.
Слой 3 · Приложение
Деньги, формы и загрузки — под замком
Самое дорогое для магазина — не взлом сервера, а тихая покупка за рубль. Поэтому система не верит браузеру там, где это стоит денег.
Цену не подделать
Из браузера берётся только «что» и «сколько штук». Название, цена и наличие перечитываются из базы — правка суммы в инструментах разработчика ничего не даст.
Оплате не верят на слово
Уведомление банка проверяется переспросом платёжной системы или подписью по исходному телу запроса — и всегда сверкой суммы. Способ оплаты, не прошедший живой платёж, включить нельзя.
Последний товар — одному
При оформлении строка товара блокируется: двое покупателей не заберут последний экземпляр одновременно.
Загрузки по белому списку
Разрешено только перечисленное. Тип проверяется по содержимому, а не по имени; SVG запрещён, потому что в него можно вложить скрипт.
Слой 4 · Панель и учётные записи
Одного пароля мало
Утёкший пароль — самый частый путь в панель. Поэтому на входе два рубежа, а каждая неудачная попытка остаётся в журнале.
Пароль и код из приложения
- Двухфакторный вход по стандарту TOTP: подойдёт Яндекс Ключ или любое другое приложение. Код сверяется на вашем сервере, а картинку для привязки рисует сама система.
- Коды восстановления — одноразовые. Потерянный телефон не означает потерянный доступ.
- Пять попыток в минуту и на пароле, и на шаге с кодом. Без ограничения шесть цифр подбираются за вечер, с ограничением — никогда.
- Журнал безопасности: каждая неудачная попытка входа — с адресом. Пароль туда не пишется никогда. По этой строке fail2ban блокирует перебор — у нас так и настроено.
- История входов в учётной записи: когда и откуда заходили в панель — первое, что нужно, когда возникает вопрос «а это точно был я?».
- Сводка не льстит: покажет «включена у 1 из 3», если второй фактор есть не у всех администраторов.

Слой 5 · Файлы и целостность
Сторож, который не спит
У каждой поставки есть подписанная опись: какие файлы и с какими суммами мы поставили. Раз в час сторож сверяет с ней то, что лежит на диске.
Как обычно
- Бот кладёт файл и уходит
- Владелец узнаёт через недели — от хостинга, поисковика или клиентов
- Ищет вручную среди тысяч файлов
- Не понимает, что изменено, а что было всегда
С NEXUM-CORE
- Раз в час — сверка с описями платформы, каждого модуля, шаблонов и языков
- Две находки: «изменён» и «посторонний» PHP-файл; в public/ и загрузках PHP не бывает вовсе
- Сообщение один раз на новый набор находок: журнал безопасности, оповещение и письмо администраторам
- Свои правки — кнопка «Это мои правки». Запоминается сумма: изменится файл ещё раз — тревога вернётся
Честно о пределе. Злоумышленник с правами сайта может переписать и опись, и самого сторожа. Сторож защищает от массовых ботов, которые кладут файл и уходят, — а именно так и устроены массовые взломы.
Слой 6 · Обновления
Как приезжает выпуск
Канал обновлений — это канал, по которому код попадает сразу на все сайты. Поэтому каждый шаг в нём проверяется.
- Подпись. Выпуск подписан RSA-SHA256 ключом 4096 бит. Подпись проверяется до распаковки: чужой архив даже не откроется. Закрытый ключ не хранится ни в репозитории, ни на сервере обновлений.
- Совместимость. Видна до нажатия кнопки. Предварительная проверка — версия PHP, расширения, место на диске, права на запись — не даст начать установку, которая оборвётся посередине.
- Снимок отката. Перед установкой снимается копия ровно того, что будет тронуто, вместе с библиотеками. Сбой посередине — всё возвращается из снимка.
- Ваши правки целы. Обновление сверяет опись и не затирает файлы, которые вы меняли сами.
Выпусков уже десятки. Год обновлений входит в цену лицензии.
Слой 7 · Резервные копии
План Б, который работает сам
- По расписанию: каждый день или раз в неделю, ночью. Включается в панели в разделе «Резервные копии».
- Что сохранять: всё целиком, только базу, только файлы или только содержимое.
- Куда: на Яндекс Диск или в любое S3-совместимое хранилище — облако VK, Yandex Object Storage, своё MinIO в той же сети.
- Сколько хранить: по умолчанию последние семь копий, старые удаляются сами.
- Восстановление — из той же панели, без консоли.
Совет. Копия на том же сервере — ещё не копия. Включите выгрузку в облако: если сторож найдёт чужие файлы, первое, что он посоветует, — восстановить копию и сменить пароли.
Слой 8 · Приватность
О визите знаете только вы
Каждый внешний сервис на странице — это ещё один, кто узнаёт о ваших посетителях. На сайте NEXUM-CORE их нет.
Всё своё
Шрифты, значки и скрипты лежат на вашем сервере. Браузер посетителя больше никуда не обращается.
Сначала согласие
Счётчик посещаемости и карта подключаются только с согласия посетителя, а не при открытии страницы.
Для владельца
Чек-лист на пятнадцать минут
Большая часть защиты включена с первого дня. Остальное — несколько шагов, которые может сделать только владелец.
| Что сделать | Где | Зачем |
|---|---|---|
| Включить второй фактор всем администраторам | Моя учётная запись → Двухфакторная проверка | Пароль утекает чаще, чем теряется телефон |
| Довести сводку безопасности до зелёного | Главная панели | Девять пунктов: отладка, HTTPS, ключ приложения, мастер установки, каптча, второй фактор, PHP, сторож, автономный режим |
| Проверить cron | Сервер: * * * * * php artisan schedule:run | Без него не работают ни сторож, ни копии по расписанию |
| Включить копии по расписанию и выгрузку в облако | Резервные копии | По умолчанию расписание выключено — решение за вами |
| Обновить PHP, если сводка пишет «открыт» | Панель хостинга или поддержка | Такие дыры закрывает только обновление самого PHP |
| Включить каптчу на формах | Каптча | Формы без проверки принимают ботов |
| Не включать PHP в содержимом без нужды | .env: CONTENT_PHP | Кто сможет записать в материал, получит сервер целиком |
| Ставить выпуски | Обновления | Исправления приходят только с ними |
Мы не обещаем неуязвимости — её не бывает. Обещаем другое: здесь нет десятка чужих дополнений от разных авторов, каждое со своим сроком жизни. Всё, что перечислено выше, — часть системы и обновляется вместе с ней.
Вопросы
О безопасности коротко
Защитит ли NEXUM-CORE от любого взлома?
Нет, и никто честно такого не обещает. Мы закрываем типовые пути — подбор пароля, подброшенный файл, подмену цены, чужой скрипт из стороннего сервиса — и даём сторожа, который заметит то, что всё-таки прошло.
У меня хостинг, я не знаю свою версию PHP. Что делать?
Открыть главную страницу панели. Строка «PHP» в сводке безопасности скажет «закрыт», «исправления перенесены» или «открыт» — и в последнем случае назовёт версию, до которой обновиться.
Сторож нашёл файлы. Меня взломали?
Если файлы правили вы — нажмите «Это мои правки», и сторож запомнит их. Если не вы, сайт, вероятно, взломан: восстановите резервную копию и смените пароли. Изменится файл ещё раз — сторож снова сообщит.
У меня в материалах был PHP-код, и он перестал работать. Почему?
С выпуска 3.10.40 выполнение PHP из содержимого выключено по умолчанию: код остаётся в материале текстом. Если он действительно нужен, включите его явно строкой CONTENT_PHP=true в .env — понимая, что запись в материал тогда равна доступу к серверу.
Обновление не затрёт мои правки в файлах?
Нет. Обновление сверяет опись и не трогает файлы, которые вы изменили. Перед установкой снимается снимок отката, так что вернуться назад можно всегда.
Исправления безопасности платные?
Год обновлений входит в цену лицензии. Дальше продление — 6 900 ₽ в год, по желанию. Без продления сайт работает бессрочно, но новые выпуски, в том числе с исправлениями, перестают приходить.
Куда уходят данные моих посетителей?
Никуда. Шрифты, значки и скрипты лежат на вашем сервере, счётчик и карта — только с согласия посетителя, а автономный режим запрещает серверу любые исходящие запросы.
Можно проверить всё это самому?
Да. Исходники открыты, без шифрования. Любое утверждение с этой страницы покажем в коде — вместе с автотестом, который его сторожит.