Написал 2 страницы документации для библиотеки интеграции #joomla с #amocrm. В раздел с описанием установки добавил про долгосрочные токены AmoCRM.
- Установка библиотеки в Joomla
- Входящие вебхуки из AmoCRM в Joomla
- Создание плагина для обработки вебхуков AmoCRM в Joomla
@webtolkru
#php #crm #webdev #development #разработка
- Установка библиотеки в Joomla
- Входящие вебхуки из AmoCRM в Joomla
- Создание плагина для обработки вебхуков AmoCRM в Joomla
@webtolkru
#php #crm #webdev #development #разработка
👍8
В чате Joomla коллеги поделились полезными правилами для
.htaccess, которые позволяют включить серверное сжатие brotli для трафика, а так же настроить кэширование. Сохраняю к себе. Смотреть на сайте.
#joomla #php #apache #webdev #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
👏7
Иногда нужно что-то поправить по-быстрому на боевом сайте, ну вот прям очень нужно и прям срочно посмотреть какой-нибудь массивчик. И тогда мы свой
dump() ограничиваем выводом по IP.Вариант 1. Нативный PHP.
if($_SERVER['REMOTE_ADDR'] == 'xxx.xxx.xxx.xxx') {
dump($array);
}Вы увидите свой массивчик, а все остальные посетители - нет.
Вариант 2. IpHelper в Joomla.
В Joomla есть класс
Joomla\Utilities\IpHelper, в котором собраны инструменты для работы с этой информацией. Оказывается, иногда бывает, что $_SERVER['REMOTE_ADDR'] может вернуть 2 IP адреса или наоборот не содержать его. Или IPv6. Используется он в ядре Joomla при работе с балансировщиком нагрузки и в логгерах. Поэтому можно делать такif(\Joomla\Utilities\IpHelper::getIp() == 'xxx.xxx.xxx.xxx'){
dump($array);
}
// Но так делать не нужно, это не правильно 😎
@webtolkru
#joomla #php #webdev #разработка #ip
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Forwarded from Joomla Feed (Sergey Tolkachyov)
This media is not supported in your browser
VIEW IN TELEGRAM
Добавил переводы документации современного скрипта слайдера swiper.js на русский язык. Документация эта относится к плагину веб-ассета для Joomla WT JSwiper, который подключает скрипт нативным для Joomla 4+ способом - с помощью Web Asset Manager.
Сегодня добавлены:
- Модули: Autoplay
- Модули: Grid
- Модули: Free Mode
- Модули: Manipulation
- Эффекты: Затухание (Fade Effect)
- Модули: Parallax
- Модули: Lazy Loading
- Эффекты: Перелистывание (Coverflow Effect)
Читать документацию Swiper.js по-русски
@webtolkru
#webdev #swiperjs #js #joomla
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Допустим есть у нас массив с объектами вида:
Array
(
[0] => stdClass Object
(
[value] => 94
[text] => Категория 1
[level] => 1
[params] => {"category_layout":"","image":"","image_alt":""}
[published] => 1
[lft] => 9
[language] => *
)
Элементов в нём штук 100 и нужно нам его почистить от
params. Не писать же цикл или array_map() или array_walk()... Для этой работы можно воспользоваться классом \Joomla\Utilities\ArrayHelper (файл vendor/joomla/utilities/src/ArrayHelper.php). Там немало интересного есть. Но нас интересует метод dropColumn().use Joomla\Utilities\ArrayHelper;
// ...где-то в классе поля, в getOptions()
// получили массив с опциями
$options = array_merge(parent::getOptions(), $options);
// и удалили у них лишний params
$options = ArrayHelper::dropColumn($options, 'params');
@webtolkru
#joomla #php #разработка #development #webdev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Как быстро настроить интеграцию AmoCRM и сайта на Joomla? - использовать PHP библиотеку WT AmoCRM для Joomla, которая предполагает использование её разработчиками. А разработчики могут написать любое количество плагинов и решений по интеграции и автоматизации AmoCRM и Joomla.
Смотреть на:
- Youtube
- Rutube
- VK Видео
00:15 - что такое эта библиотека и как она работает? Тех.ликбез.
03:00 - установка с сайта или с GitHub
04:00 - собственно установка и настройка интеграции.
05:10 - создание внешней интеграции в интерфейсе AmoCRM
08:05 - что-то пошло не так... Почему и как исправить (случай с пересозданием интеграции)
08:48 - успешное подключение к AmoCRM
11:11 - как понять что всё работает?
11:50 - демонстрация работы: отправка заказа из компонента интернет-магазина RadicalMart в AmoCRM
14:20 - потенциальные возможности по автоматизации бизнес-процессов в связке Joomla с AmoCRM
Скачать с сайта
Скачать с GitHub
Есть ряд готовых решений для интеграции:
- JoomShopping - Joomla компонент интернет-магазина
- RadicalMart - Joomla компонент интернет-магазина
- RadicalForm - Joomla плагин формы обратной связи
@webtolkru
#joomla #crm #amocrm #php #разработка #webdev #development
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
AmoCRM + Joomla: быстрая настройка интеграции. Библиотека WT AmoCRM.
Как быстро настроить интеграцию AmoCRM и сайта на Joomla? - использовать PHP библиотеку WT AmoCRM для Joomla, которая предполагает использование её разработчиками. А разработчики могут написать любое количество плагинов и решений по интеграции и автоматизации…
👍3
Forwarded from Joomla Feed (Sergey Tolkachyov)
Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить" на текущую установку Joomla именно те изменения, которые необходимо протестировать.
На стороне инфраструктуры Joomla для каждого PR собираются готовые пакеты, в которых находится ядро + предложенные изменения. В каждом PR обычно находятся инструкции по тестированию: куда зайти, что нажать, ожидаемый результат. Тестировщики могут предположить дополнительные сценарии, исходя из своего опыта и найти баги, о которых сообщить разработчику. Или не найти, и тогда улучшение или исправление ошибки быстрее войдёт в ядро Joomla.
Напомню, что для того, чтобы PR вошёл в ядро Joomla нужны минимум 2 положительных теста от 2 участников сообщества, кроме автора.
Видео на YouTube
Видео на VK Видео
Видео на RuTube
Компонент на GitHub https://github.com/joomla-extensions/patchtester
@joomlafeed
#joomla #php #webdev #community
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Как тестировать Joomla PHP-разработчику? Компонент Patch tester.
Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить"…
👍2
Forwarded from Joomla Feed (Sergey Tolkachyov)
Это перевод статьи Брайана Тимана (Brian Teeman) - сооснователя Joomla - о доработке модуля "Материалы" (
mod_articles), позволяющей выводить заголовки материалов категории (ий) с группировкой по годам и месяцам. Пример такой реализации модуля можно встретить на сайте самого Брайана.Статью перевёл на русский язык и дополнил участник нашего сообщества - Сергей Сергевнин (@gresserg).
Читать статью на Хабре
Оригинальная статья
@joomlafeed
#joomla #habr #webdev
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Forwarded from Joomla Feed (Sergey Tolkachyov)
Плагин позволяет делать экспорт материалов Joomla в CSV файл, после чего вы можете отредактировать данные в табличном редакторе (например, Exel или Open Office Calc) и затем загрузить файл обратно. В некоторых случаях это удобнее и быстрее. Плагин позволяет выгружать id тегов, а так же работать с пользовательскими полями материалов Joomla, а так же обычно нередактируемыми свойствами материалов: просмотры, дата изменения и т.д.
Первые версии плагина CFI создал разработчик AlekVolsk для Joomline. Он создал версии 1.0.0-1.0.16 для Joomla 3. Затем, в 2026 году плагин был передан WebTolk для дальнейшего развития.
1️⃣ Рефакторинг. Плагин полностью переписан заново.
2️⃣ Новый интерфейс импорта/экспорта. Экспорт и импорт открывается в модальном окне. Появился функционал выбора свойств материала, тегов и пользовательских полей для экспорта непосредственно перед самим экспортом.
3️⃣ Фильтрация материалов при экспорте. Вы можете отфильтровать нужные вам материалы с помощью стандартных параметров поиска в панели администратора, а потом экспортировать только их: только избранные, только опубликованные, только материалы 2-х категорий, только материалы с определённым тегом и т.д.
4️⃣ Импорт/экспорт всех данных материала. Раньше плагин мог экспортировать только некоторые данные материала. Теперь при экспорте и импорте вы можете изменять все данные материала, которые можете найти в форме редактирования материала. Даже нередактируемые, такие как просмотры или дата изменения. Таким образом вы можете быстро обновить все meta-description или данные только полей.
5️⃣ Импорт только пользовательских полей. Для импорта обязательным полем осталось только
articleid. Таким образом вы можете импортировать только данные пользовательских полей, не изменяя данные самого материла.6️⃣ Joomla 6. Плагин переписан с актуальной для Joomla 4+ структуре и успешно протестирован на Joomla 6.
7️⃣ Разработчикам: предобработка плагинами. Вы можете обрабатывать данные собственными плагинами группы
cfi на лету непосредственно перед импортом или экспортом данных. События: onExportPrepareData($event) и onImportPrepareArticleData($event).Системные требования: Joomla 4.3+, PHP 8,1+.
Для обновления со старых версий выпущен релиз
1.0.16, где добавлен новый сервер обновлений.- Страница расширения
- GitHub расширения
- Версия для Joomla 3 и Joomla 4
- GitHub версии для Joomla 3+
#joomla #расширения #webdev #seo
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Нередко нам из больших многомерных массивов данных нужно вытащить конкретные данные по ключу. Представим, что наш многомерный массив - это таблица с данными и нам нужна только одна колонка оттуда. Обычно мы берём нативную функцию PHP
array_column(), но что если у нас в значениях массива могут оказаться объекты (stdClass)? Или в массиве может не оказаться нужной колонки?Здесь нам поможет метод
ArrayHelper::getColumn().Простой пример: хотим избавиться от вложенных циклов. А точнее - просто спрятать их с глаз долой:
// в макете материала
foreach($customFields['lending-sections']->subform_rows as $sections):
foreach ($sections as $section):
echo LayoutHelper::render(layoutFile: trim($sections['layout-id']->value), displayData: ['item' => $this->item, 'jcfields' => $customFields], basePath: __DIR__);
endforeach;
endforeach;
А можно так:
use \Joomla\Utilities\ArrayHelper;
$layout_id_fields = ArrayHelper::getColumn($customFields['lending-sections']->subform_rows, 'layout-id');
$layout_ids = ArrayHelper::getColumn($layout_id_fields, 'value');
foreach($layout_ids as $layout_id) {
// выводим макет
}
Метод
ArrayHelper::getColumn() из массива массивов или объектов извлекает:- значения из колонки
$valueCol- при желании — переиндексирует результат по
$keyColМетод работает почти как
array_column(), но:-- умеет работать с объектами
-- умеет возвращать целые элементы, если
$valueCol === nullУчитывая, что Joomla под капотом повсеместно таскает массивы с объектами (выборки из базы и т.д.) - знание такого метода существенно может упростить жизнь и ускорить разработку.
Ну и с его помощью можно пересобрать массив (сменить индексы):
$items = [
['id' => 10, 'title' => 'Заголовок 1'],
['id' => 20, 'title' => 'Заголовок 2'],
];
Применяем метод:
$result = ArrayHelper::getColumn($items, 'title', 'id');
Смотрим результат:
[
10 => 'Заголовок 1',
20 => 'Заголовок 2',
]
Метод активно используется в ядре Joomla.
@webtolkru
#joomla #webdev #php #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1🔥1
Сегодня реанимировал сайт, хотя весь день планировал заниматься совершенно другим. Странный случай, похоже на взлом в сочетании с неумелым обращением с Joomla.
В декабре под новый год обновились до Joomla 5.4.2. Несколько дней назад стали возникать проблемы в работе сайта, а на выходные он просто лёг. Сегодня с утра посмотрел и очень удивился:
- в папке
- несколько дней назад жаловались на ошибку отображения картинки, судя по описанию ошибки туда попала вовсе не картинка
- есть признаки неудачной попытки восстановиться акибой
- часть файлов от Joomla 4.1.5
- часть файлов от квикстарта на Joomla 3.10.5, например, левый шаблон на Gantry, который не использовался на сайте
- огрызки архивов с неполным содержимым сайта
Сайт я восстановил, пароли сменил, но мне теперь интересно: а что же именно взломали: саму Joomla (тогда нужно сообщать в компетентным людям) или какое левое расширение (их почти нет) или кто-то всё-таки получил доступ к сайту и умело почистил логи, а потом неумело решил поставить "новый шаблон" с Jooma 3 на "старую" Joomla 5?
Поторопился я его восстанавливать, надо было сделать дамп к себе для изучения ))
@webtolkru
#joomla #webdev #security
В декабре под новый год обновились до Joomla 5.4.2. Несколько дней назад стали возникать проблемы в работе сайта, а на выходные он просто лёг. Сегодня с утра посмотрел и очень удивился:
- в папке
/api есть левые файлы, похожие на майнеры или шелл- несколько дней назад жаловались на ошибку отображения картинки, судя по описанию ошибки туда попала вовсе не картинка
- есть признаки неудачной попытки восстановиться акибой
- часть файлов от Joomla 4.1.5
- часть файлов от квикстарта на Joomla 3.10.5, например, левый шаблон на Gantry, который не использовался на сайте
- огрызки архивов с неполным содержимым сайта
Сайт я восстановил, пароли сменил, но мне теперь интересно: а что же именно взломали: саму Joomla (тогда нужно сообщать в компетентным людям) или какое левое расширение (их почти нет) или кто-то всё-таки получил доступ к сайту и умело почистил логи, а потом неумело решил поставить "новый шаблон" с Jooma 3 на "старую" Joomla 5?
Поторопился я его восстанавливать, надо было сделать дамп к себе для изучения ))
@webtolkru
#joomla #webdev #security
👍1
Забрал плагин CFI под своё крыло и в Joomla Extensions Directory. Сегодня передали его на мой аккаунт. Обновил ссылки и документацию.
Joomla Extensions Directory
Страница расширения
GitHub
@webtolkru
#joomla #расширения #webdev
Joomla Extensions Directory
Страница расширения
GitHub
@webtolkru
#joomla #расширения #webdev
👍9
[Тут должна быть победная пляска] Год назад у моих клиентов возникла необходимость во вставке видео в кастомные поля материалов в раздел портфолио. Я начал делать и увидел, что именно стандартное пользовательское поле Media не умеет вставлять в поле ничего, кроме изображений, хотя поле Joomla Form
MediaField умеет выбирать и документы (pdf и иже), аудио, видео и даже папки. Я начал работу над тем, чтобы добавить этот функционал в ядро и очень надеялся успеть к Joomla 5.3, которая выходила в апреле. В целом все сделал, сделал PR 25 февраля 2025 года, но PR не приняли, сказав, что это шибко новый функционал и ему будет хорошо в Joomla 6.0.0. Клиентам пришлось использовать медиа-менеджер от JCE, а PR отправился ждать релиза 6.0.0, который выходил осенью. К слову сказать, эта пауза была полезна для него, так как летом, уже неспешно я получал советы по улучшению и в июле всё точно было готово.Релизный цикл Joomla состоит из нескольких этапов: сначала выходят alpha-версии (до 3х штук), где просто фиксируются накопленные изменения, потом beta, где наступает feature freeze - заморозка новых функций, их нельзя уже добавлять. Дальше только отладка и правки существующих новшеств. У каждого релиза есть 2 релиз-менеджера.
В работе над PR мне помогал все это время Брайан Тиман - ко-фаундер Joomla. К концу июля все было готово, проверено, PR имел 2 необходимых независимых теста. Ждём беты.
Дата беты приходилась на понедельник. Где-то в пятницу днём я отписался в PR и получил совет написать релиз+менеджерам. Как-то удалось найти их в Mattermost, где обитает международное сообщество, но пятница и выходные, а все ж волонтеры и не на зарплате... Моё сообщение прочитали после релиза беты... Сказали, что не были в курсе моего PR (ожидаемо, их около 200-250 все время открытых). И сказали, что поезд ушёл, хоть и so sorry. Зато будет хорошо увидеть PR на тестах в Pizza, Bugz and Fun и вообще welcome в 6.1.
После выхода 6.0.0 меняются релиз-менеджеры. Мы списались: да, все хорошо, но нужно кое-что подправить. Тут конец года и закрытие дедлайнов, потом Новый год и весь январь никто толком не работает. Beta для 6.1 выходит 17 февраля. Последняя alpha недели за 3 до этого.
Незадолго до выхода альфы я-таки получаю сообщение, что реализуемый функционал сделан не по "Joomla way" и если код в ядре, то этот код является учебным пособием по тому, как ядро использовать. Резонно. А ещё у релиз-менеджера есть собственные наработки и экспертиза в этой теме и свой медиа-менеджер, в котором он тоже прошел огонь, воду и медные трубы. Согласно Joomla way мне нужно было разделить одно мега-крутое поле на 4 отдельных (картинки, аудио, видео и документы). Я подумал, что требуется сделать 4 плагина вместо одного и сказал, что не успею. Мне ответили, что beta is more important for us и время ещё есть, что мне подскажут и 4 плагина делать не нужно.
Пока суть да дело - время идёт. У меня тоже работа, трое детей, карантины, уроки... Но добить этот PR уже стало делом принципа. Я нашел как нужно было делать, принял несколько правок и пожеланий, потом фиксы code style. Сегодня с утра был последний коммит. Сегодня вечером, 11 февраля 2026 года, PR наконец-то смержен в ядро Joomla.
Эта работа научила меня очень многому. 133 комментария в conversation на GitHub, несколько отдельных переписок, 1 год на разработку и внедрение простой в целом фичи, "звоночек" в голове: "не забыть, успеть, сделать, найти"...
Сегодня я поднимаю кружку пенного за этот небольшой в целом PR, за этот прошедший год, за Joomla и за Open Source.
https://github.com/joomla/joomla-cms/pull/45013
#joomla #cms #opensource #community #webdev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12🎉4👍2
Опять длинное название, но куда уж без этого...
Итак, если вы делаете плагин пользовательского поля - его можно использовать через
FieldsHelper. И в процессе ваши данные проходят через различные этапы обработки (недавно был пост+статья на эту тему). И может так оказаться, что ваше поле хранит в rawvalue json (и в базе данных соответственно тоже), а в value вы на его основе рендерите значение. Это стандартный подход Joomla. Так работают, например, поля accessiblemedia. Однако, если вы поместили ваше поле в дочернюю форму (пользовательское поле типа subform и включили "Рендеринг значений = Да", то у вашего замечательного поля может появиться поломанный Json в value вместо нормального значения.Например:
{"basePath":"...","layout":"..."}1. В обычном потоке Joomla сначала вызывает событие
onCustomFieldsBeforePrepareField, а потом onCustomFieldsPrepareField.2. Внутри
subform же для подполей при render_values=1 вызывается только событие - onCustomFieldsPrepareField.3. Если преобразование значения (например,
json_decode) сделано в вашем плагине только в beforePrepareField, оно не обработает данные для подполя и...4. В шаблоне поля строка заэкранируется (
htmlentities), кавычки превратятся " и вы получите кривой json, вместо вашего значения👉 Собственно полезный совет по Joomla:
Для полей, которые могут жить внутри
subform, делайте нормализацию значения и в onCustomFieldsPrepareField тоже, не только в beforePrepareField.@webtolkru
#joomla #webdev #разработка #php #development
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
WebTolkRu
👩💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.
В процессе работы с Joomla бывает необходимо работать с пользовательским интерфейсом более тонко, чем обычно. Все формы Joomla состоят…
В процессе работы с Joomla бывает необходимо работать с пользовательским интерфейсом более тонко, чем обычно. Все формы Joomla состоят…
👍4
Позволяет добавлять в категории статьи или контакты из других категорий, если они указаны в пользовательском поле. Для удобства указания дополнительных категорий Joomla вы можете использовать плагин пользовательского поля WT Category.
👉 v.1.2.0 Что нового?
Отдельная таблица связей. Плагин теперь хранит связи с дополнительными категориями в отдельной таблице
#__wtmulticategories_map и больше не читает их напрямую из значений поля в каждом frontend-запросе. Это убрало тормоза плагина.Автоматическая синхронизация. Сопоставление автоматически пересобирается при сохранении материалов и контактов и очищается при их удалении.
Обновлённая логика запросов. Списки категорий для
com_content и com_contact теперь работают через map-таблицу и надежнее обрабатывают подкатегории.Обновление с v.1.1.0. Уже существующие материалы и контакты после обновления автоматически не пересобираются. Для заполнения таблицы маппинга для ранее сохраненных элементов используйте CLI-команду, например:
/path/to/php /path/to/joomla/cli/joomla.php wtmulticategories:rebuild-map.Также исправления ошибок и по-мелочи.
Страница расширения.
GitHub расширения.
Joomla Extensions Directory.
@webtolkru
#joomla #cms #webdev #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3
Модуль выводит метки из различных компонентов на Яндекс.Карты. На данный момент выводятся только материалы Joomla. Используется API 3.0 Яндекс.Карт. Поддерживается Joomla 5 и старше.
v.1.3.1. Что нового?
Выбор макетов через поле WT Layout Select Joomla. Улучшена работа полей выбора макета для меток и всплывающих окон. Теперь модуль корректнее использует значения обычных полей Joomla и полей WT Layout Select.
Определение наличия плагина WT Layout Select. Добавлено отдельное информационное сообщение о WT Layout Select в форме настроек модуля.
Обработка пользовательских макетов. Обновлена обработка пользовательских макетов, чтобы выбранные макеты стабильнее применялись к категориям и материалам.
Если раньше вы должны были указывать путь к лейауту вывода маркера и всплывающего окна для материала в виде строки
modules.mod_wtyandexmapitems.marker.city-marker или вручную дополнять список значений в стандартном поле типа "список", то сейчас эту часть можно автоматизировать с помощью использования плагина выбора макетов WT Layout Select Joomla.Страница расширения
GitHub расширения
Joomla Extensions Directory
WT Layout select - плагин выбора файла макета
@webtolkru
#joomla #yandex #webdev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1👏1
Forwarded from Joomla для разработчиков
🚨 AJAX - главная «слепая зона» безопасности
В 2026 году продолжается волна атак на Joomla-сайты. Ботнеты массово сканируют сети в поиске одной и той же уязвимости — отсутствия проверки прав доступа в AJAX-обработчиках.
Почему com_ajax стал идеальным «черным ходом» для хакеров и как защитить свой код? Разбираем анатомию ошибки.
🔍 Как устроена уязвимость?
com_ajax создавался как легкий маршрутизатор, чтобы плагины и модули могли обрабатывать AJAX-запросы без создания собственных роутов.
Главный капкан архитектуры — com_ajax НЕ проверяет авторизацию за вас.
Разработчики часто путают три разных уровня защиты:
1. CSRF-токен (Session::checkToken()) — проверяет только то, что запрос отправлен с вашего сайта. Но он НЕ проверяет, кто его отправил.
2. Аутентификация ($user->guest) — проверяет, залогинен ли пользователь.
3. Авторизация (ACL / authorise()) — проверяет, имеет ли пользователь право выполнять действие.
💥 Реальные инциденты и уязвимости в Joomla:
• Astroid Framework: Отсутствие авторизации в AJAX-обработчиках позволяет гостям и пользователям с минимальными правами вызывать служебные функции.
• Novarian Framework: Аналогичные «слепые зоны» в AJAX-маршрутизации, открывающие доступ к выполнению кода без проверки ролей.
• JoomShaper Helix3 (Волна взломов AntonKill): Массовый дефейс Joomla-сайтов через неаутентифицированный AJAX-эндпоинт фреймворка шаблона.
• AcyMailing: Повышение привилегий из-за отсутствия проверки прав во внутреннем роутере (уязвимость затрагивает Joomla 9.11.0 – 10.8.1).
❌ Как делать НЕЛЬЗЯ (уязвимый код):
(Проверен только CSRF, но любой гость может удалить элемент).
✅ Как ДОЛЖНО быть (безопасный код):
🛠 Чек-лист базовой проверки:
• Если вы пишете код: Никогда не полагайтесь только на com_ajax. Всегда вызывайте $user->authorise() перед выполнением действия.
• Если вы администрируете сайты: Регулярно обновляйте фреймворки шаблонов (Astroid, Novarian, Helix) и сторонние расширения.
• Проверьте старый код: Наличие checkToken() в AJAX-хендлере не делает его безопасным!
📖 Подробную хронологию разбора этой уязвимости читайте в статье на mySites.guru.
💬 Проверяете ACL на каждом AJAX-вызове в своих компонентах и плагинах?
#joomla #php #security #webdev #cms #backend
В 2026 году продолжается волна атак на Joomla-сайты. Ботнеты массово сканируют сети в поиске одной и той же уязвимости — отсутствия проверки прав доступа в AJAX-обработчиках.
Почему com_ajax стал идеальным «черным ходом» для хакеров и как защитить свой код? Разбираем анатомию ошибки.
🔍 Как устроена уязвимость?
com_ajax создавался как легкий маршрутизатор, чтобы плагины и модули могли обрабатывать AJAX-запросы без создания собственных роутов.
Главный капкан архитектуры — com_ajax НЕ проверяет авторизацию за вас.
Разработчики часто путают три разных уровня защиты:
1. CSRF-токен (Session::checkToken()) — проверяет только то, что запрос отправлен с вашего сайта. Но он НЕ проверяет, кто его отправил.
2. Аутентификация ($user->guest) — проверяет, залогинен ли пользователь.
3. Авторизация (ACL / authorise()) — проверяет, имеет ли пользователь право выполнять действие.
💥 Реальные инциденты и уязвимости в Joomla:
• Astroid Framework: Отсутствие авторизации в AJAX-обработчиках позволяет гостям и пользователям с минимальными правами вызывать служебные функции.
• Novarian Framework: Аналогичные «слепые зоны» в AJAX-маршрутизации, открывающие доступ к выполнению кода без проверки ролей.
• JoomShaper Helix3 (Волна взломов AntonKill): Массовый дефейс Joomla-сайтов через неаутентифицированный AJAX-эндпоинт фреймворка шаблона.
• AcyMailing: Повышение привилегий из-за отсутствия проверки прав во внутреннем роутере (уязвимость затрагивает Joomla 9.11.0 – 10.8.1).
❌ Как делать НЕЛЬЗЯ (уязвимый код):
Session::checkToken() or die('Invalid Token');
$input = Factory::getApplication()->getInput();
$this->deleteItem($input->getInt('id'));(Проверен только CSRF, но любой гость может удалить элемент).
✅ Как ДОЛЖНО быть (безопасный код):
Session::checkToken() or die('Invalid Token');
$app = Factory::getApplication();
$user = $app->getIdentity();
if (!$user->authorise('core.manage', 'com_yourcomponent')) {
throw new Exception('Access Denied', 403);
}
$this->deleteItem($app-> getInput()->getInt('id'));🛠 Чек-лист базовой проверки:
• Если вы пишете код: Никогда не полагайтесь только на com_ajax. Всегда вызывайте $user->authorise() перед выполнением действия.
• Если вы администрируете сайты: Регулярно обновляйте фреймворки шаблонов (Astroid, Novarian, Helix) и сторонние расширения.
• Проверьте старый код: Наличие checkToken() в AJAX-хендлере не делает его безопасным!
📖 Подробную хронологию разбора этой уязвимости читайте в статье на mySites.guru.
💬 Проверяете ACL на каждом AJAX-вызове в своих компонентах и плагинах?
#joomla #php #security #webdev #cms #backend
mySites.guru
AJAX Endpoints: CMS Security Blind Spot | mySites.guru
Five AJAX and API vulnerabilities hit Joomla and WordPress in March 2026, all sharing one root cause. Here is what went wrong and how to protect your sites.
🙏1