WebTolkRu
99 subscribers
618 photos
72 videos
2 files
643 links
Joomla-разработчик. Контрибьютер ядра Joomla. https://web-tolk.ru. Разработка Joomla на заказ. Также пишу в @JoomlaFeed.
@sergeytolkachyov Хабр: https://habr.com/ru/users/sergeytolkachyov/posts/
Download Telegram
👩‍💻 Совет по Joomla: Удалить ключ из многомерного массива.
Допустим есть у нас массив с объектами вида:
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
Forwarded from Joomla Feed (Sergey Tolkachyov)
👩‍💻 Обработка HTTP ответа в Joomla 6+. Изменения по сравнению с Joomla 3 - Joomla 5.
В Joomla для выполнения внешних запросов из PHP к сторонним API используется класс Joomla\Http\Http напрямую или же Joomla\Http\HttpFactory, который возвращает для работы преднастроенный по умолчанию класс Http. О работе с HTTP-запросами подробно рассказывалось в статье 2021 года Создание внешних запросов с использованием HttpFactory (Joomla). Некоторые изменения касаются работы с ответами на запросы. Например, наш запрос:
use Joomla\Http\HttpFactory;

$http = (new HttpFactory)->getHttp($options, ['curl', 'stream']);
$response = $http->get('https://any-url.ru/api/any/endpoint');

Раньше можно было получить код ответа или тело ответа как свойство $response - $response->code или $response->body. Однако, Joomla, начиная с Joomla 4 во многом переходит на стандарты PSR. В частности для работы с HTTP-ответами - на PSR-7. Также хорошая статья на Хабре о PSR-7: PSR-7 в примерах.
Прямое обращение к свойствам code, headers, body объявлено устаревшим в Joomla 6.0.0 и обещают удалить в Joomla 7.0.0.

Вместо этого нужно работать с HTTP-ответом по стандартам PSR-7.
Код ответа.
Было $response->code. Стало $response->getStatusCode().
Заголовки ответа.
Было $response->headers. Стало $response->getHeaders().
Тело ответа.
Было $response->body. Стало (string)$response->getContents().

В тело ответа теперь приходит не строка, а поток - объект класса Laminas\Diactoros\Stream. Поэтому его нужно привести к строке (если это json, к примеру): (string)$response->getContents(). Чаще всего в коде Joomla встречается именно такой вариант. Однако, есть и вариант с перемещением указателя чтения на начало потока:
// Получили ответ в виде потока
$stream = $response->getBody();
// "перемотали" на начало
$stream->rewind();
// Получили строковый ответ
$json = $stream->getContents();

В итоге результат одинаковый.

@joomlafeed

#joomla #разработка #php
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Forwarded from Joomla Feed (Sergey Tolkachyov)
👩‍💻 Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях.
На старте его сайт на Joomla 3 вообще не смог обновиться на Joomla 5. Пришлось делать экспорт/импорт материалов. Проделав всё это он запустил-таки этот объём данных на Joomla 5. Тестовый скрипт грузил 200 материалов из этого объёма всего за 94 секунды ))) А главная страница с категориями грузилась 20 секунд.

Добавив индекс для таблицы #__content
CREATE INDEX idx_catid_state ON #__content (catid, state);

он сократил время загрузки категорий до 1 секунды. Затем наш герой решил поковырять SQL-запрос в ArticleModel, который отвечает за выборку материалов. И решил заменить тип JOIN на STRAIGHT_JOIN для категорий.
// ->from($db->quoteName('#__content', 'a'))
->from(
$db->quoteName('#__content', 'a')
. ' STRAIGHT_JOIN ' . $db->quoteName('#__categories', 'c')
. ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid')
)
// ->join('LEFT', $db->quoteName('#__categories', 'c'), $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid'))

Что сократило загрузку 200 материалов из 150к с 94 секунд до 5. К слову сказать, боевой сайт на Joomla 3 крутится на 12CPU 64GB рамы. А все манипуляции с кодом он делает на базовом 1CPU 1GB сервере и замеры скорости даны именно для базового сервера.

Но это всё в дискуссии, хотя в идеале должно вылиться в Pull Requests.

Мы - Open Source сообщество, где никто никому ничего не должен. Джунгли. Но человек ищет пути оптимизации Joomla и предлагает решения. Если оказать поддержку и предложить помощь хотя бы с тестированием самых разнообразных сценариев, то возможно эти улучшения смогут войти в ядро. Пусть не быстро, пусть через несколько лет, пусть не все, но войдут. Достаточно предложить руку помощи и приложить немного усилий.

Дискуссию на GitHub можно почитать здесь.

@joomlafeed

#joomla #community #php
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
👩‍💻 [ВИДЕО] AmoCRM + Joomla: быстрая настройка интеграции. Библиотека WT AmoCRM.
Как быстро настроить интеграцию 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
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
👩‍💻 Кнопки +/- для товара в списке товаров интернет-магазина RadicalaMart.
Этой штуки пока нет в ядре, возможно появится в RadicalMart 3 попозже. Также в сообществе разработчиков сказали, что уже было несколько реализаций этого функционала, но в публичном доступе я их не нашёл. Поэтому выкладываю свою реализацию. Вдруг кому-нибудь пригодится.

Работает на Joomla 5 + RadicalMart 2.2.4.

Требует переопределений макетов в шаблоне сайта. Подробные инструкции по ссылкам

- Страница расширения
- GitHub расширения


#joomla #разработка #php #radicalmart
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
👩‍💻 Совет по Joomla: использовать выключенное состояние для кнопок в списках элементов админки - listCheck().
Мы добавляем в тулбар панели администратора Joomla некую кнопку, которая что-то делает со списком id выделенных элементов и ajax-запросом отсылаем их в свой плагин. Но нам надо предупредить нажатия на кнопку в тех случаях, когда ни один элемент не был выбран. Для этого можно написать свою проверку на js. А можно воспользоваться встроенной в Joomla.

Добавить кнопку в тулбар Joomla.
use Joomla\CMS\Toolbar\Button\BasicButton;
use Joomla\CMS\Language\Text;

// ниже по коду, где-нибудь в onAfterDispatch()
// Предварительно проверяем в каком компоненте мы находимся по option из $app->getInput()
// пример из плагина, поэтому $this->getApplication()
$app = $this->getApplication();
// Берём текущий тулбар
$toolbar = $app->getDocument()->getToolbar('toolbar');

// Создаём кнопку
$button = (new BasicButton('send-to-indexnow'))
->text(Text::_('PLG_WTINDEXNOWSWJPROJECTS_BUTTON_LABEL'))
->icon('fa-solid fa-arrow-up-right-dots')
->onclick("window.wtindexnowswjprojects()");
// Добавляем кнопку в тулбар
$toolbar->appendButton($button);

Заблокировать кнопку тулбара Joomla, если не выбраны элементы списка.
Теперь нам надо проверить находимся ли мы в списке. Делаем это по view из $app->getInput()
if(in_array($app->getApplication()->getInput()->get('view'), ['categories','documentation','projects','versions'])) {
$button->listCheck(true);
}

И если мы в списке - используем метод listCheck(true), который сделает проверку за нас. Если ни один элемент не выбран - кнопка в тулбаре Joomla будет заблокирована и JS-обработчик не будет вызван.

#joomla #php #разработка #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Forwarded from Joomla Feed (Sergey Tolkachyov)
👩‍💻 Метод registerListeners() в CMSPlugin в плагинах планируется удалить в Joomla 7.0.

Этот метод регистрирует устаревшие слушатели событий в диспетчере, имитируя работу плагинов Joomla! 3.x и ниже для Joomla 4+. По умолчанию этот метод ищет все общедоступные методы, название которых начинается с on. Он регистрирует лямбда-функции (замыкания), которые пытаются преобразовать аргументы отправленного события в аргументы вызова метода и вызвать ваш метод on<Что-то>. Результат передаётся обратно событию в его аргумент result.

Теперь этот слой совместимости с устаревшей Joomla 3 помечен к удалению в Joomla 7.0, которая должна выйти осенью 2027 года. Это означает, что те уникальные расширения от Joomla 2.5 / Joomla 3, которые ещё работали на Joomla 4-6 скорее всего окончательно перестанут работать на Joomla 7. Предполагается, что активные разработчики планомерно и постепенно избавляются от технического долга и обновляют свои расширения.

@joomlafeed

#joomla #разработка #php
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Media is too big
VIEW IN TELEGRAM
Отладка. Встретилось как-то выражение:
за 10% времени сделать 90% задачи и 90% времени делать оставшиеся 10%

Вот это то, что у меня сейчас.

@webtolkru

#joomla #php #development #разработка
💯1
Forwarded from Joomla Feed (Sergey Tolkachyov)
👩‍💻 Как тестировать Joomla PHP-разработчику? Компонент Patch tester.

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
👍2
👩‍💻 Компонент просмотра логов Joomla View logs v.2.3.0.
Компонент просмотра сохраненных логов ядра и расширений Joomla.

Что нового?
1️⃣ Новый параметр компонента. В настройках добавлена возможность отключить показ лога PHP. Добавлено сообщение о невозможности удалить лог PHP со страницы списка логов. Кнопкам "архивации" и "удалить" добавлен атрибут disabled для лога PHP.
2️⃣ Ссылка на скачивание.
Добавлена ссылка на скачивание zip-архива в сообщении об архивации лога.
3️⃣ Различные исправления.
Исправлен путь чтения для лога PHP. Исправлены ссылки для скачивания логов в формате csv со страницы списка логов. Исправлено скачивание логов в формате csv со страницы логов (ранее логи скачивались с html-кодом шаблона). Исправлен перевод заголовков столбцов таблицы лога.

👩‍💻❤️ Большое спасибо за работу участнику Joomla-сообщества @jetfox_2nd!

Страница расширения
GitHub расширения

@webtolkru

#joomla #php #logs #dev #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
👩‍💻 Совет по Joomla: использование ArrayHelper::getColumn().

Нередко нам из больших многомерных массивов данных нужно вытащить конкретные данные по ключу. Представим, что наш многомерный массив - это таблица с данными и нам нужна только одна колонка оттуда. Обычно мы берём нативную функцию 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: json-значения для пользовательских полей и их рендер в subform и вне дочерней формы.

Опять длинное название, но куда уж без этого...

Итак, если вы делаете плагин пользовательского поля - его можно использовать через FieldsHelper. И в процессе ваши данные проходят через различные этапы обработки (недавно был пост+статья на эту тему). И может так оказаться, что ваше поле хранит в rawvalue json (и в базе данных соответственно тоже), а в value вы на его основе рендерите значение. Это стандартный подход Joomla. Так работают, например, поля accessiblemedia. Однако, если вы поместили ваше поле в дочернюю форму (пользовательское поле типа subform и включили "Рендеринг значений = Да", то у вашего замечательного поля может появиться поломанный Json в value вместо нормального значения.
Например:
{&quot;basePath&quot;:&quot;...&quot;,&quot;layout&quot;:&quot;...&quot;}

❓ Что там под капотом Joomla происходит?

1. В обычном потоке Joomla сначала вызывает событие onCustomFieldsBeforePrepareField, а потом onCustomFieldsPrepareField.
2. Внутри subform же для подполей при render_values=1 вызывается только событие - onCustomFieldsPrepareField.
3. Если преобразование значения (например, json_decode) сделано в вашем плагине только в beforePrepareField, оно не обработает данные для подполя и...
4. В шаблоне поля строка заэкранируется (htmlentities), кавычки превратятся в тыкву в &quot; и вы получите кривой json, вместо вашего значения

👉 Собственно полезный совет по Joomla:
Для полей, которые могут жить внутри subform, делайте нормализацию значения и в onCustomFieldsPrepareField тоже, не только в beforePrepareField.

@webtolkru

#joomla #webdev #разработка #php #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
👩‍💻 Разработчики из Казахстана вон как #joomla крутят! Молодцы! 2 недели, правда, прям сильно шустро, но если куча готовых наработок и команда, то может и так ))

#cms #php #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Первую часть почти сделал.

#joomla #php #api #max #webdev
👏2
Forwarded from Joomla Feed (Sergey Tolkachyov)
👩‍💻 WT Max библиотека для интеграции с Joomla.

Вышла Joomla-библиотека для API мессенджера MAX с системным плагином для настроек и диагностики подключения. Библиотека предназначена для разработчиков.

Расширение является Joomla-обёрткой над самостоятельным PHP Composer-пакетом Webtolk\Max. PHP SDK разрабатывалось с учётом стандартов PSR и полностью не зависит от какого-либо фреймворка и/или пакета.

Библиотека может использоваться для:
- отправки сообщений через бота в мессенджере Макс с сайта (разного рода уведомления),
- отправки контента с сайта в мессенджер - видео, аудио, картинки
- кнопок-ссылок к сообщениям
- приёма и обработки реакций на эти кнопки
- обработки ответов в чате / личных сообщениях
- работы с пользователями, чатами, статусами "печатает/просмотрено" и т.д.

👉 PHP SDK работает с:
- PHP 8.1+
- любым PSR-18 HTTP-клиентом (Guzzle, Symphony Http client, Joomla HTTP и другие)
- стандартом PSR-17 RequestFactoryInterface и StreamFactoryInterface
- любым PSR-3 логгером

👩‍💻 Joomla-библиотека интегрирует в ваш сайт PHP SDK, использующий инструменты ядра Joomla: http клиент, фабрики PSR-17, стандартный PSR-3 логгер из ядра Joomla.

Пример кода
<?php

declare(strict_types=1);

use Webtolk\Wtmax\Wtmax;

defined('_JEXEC') or die;

$max = Wtmax::getInstance();

$bot = $max->bots()->me();

echo $bot->getId();
echo $bot->getUsername();


- PHP SDK, Composer-пакет
- Joomla-обёртка WT Max

@joomlafeed

#joomla #php #разработка #max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤1👏1
This media is not supported in your browser
VIEW IN TELEGRAM
👩‍💻 WT Max библиотека для интеграции с Joomla v.0.1.0.1.
Joomla-библиотека для API мессенджера MAX с системным плагином для настроек и диагностики подключения. Библиотека предназначена для разработчиков.

👉 Что нового в v.0.1.0.1?

Поле выбора чата для бота в модальном окне
В библиотеку добавлено поле Joomla 5+ ModalSelect для выбора доступного чата MAX прямо в настройках вашего расширения.

- Страница расширения
- GitHub

#joomla #разработка #max #maxapi #макс #maxmessenger #максмессенджер #php
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👏1
👩‍💻 Как работать с меню компонента в админке Joomla с помощью preset.xml и плагина.
У компонента Joomla есть несколько уровней присутствия в панели администратора. Самый простой уровень создаётся установщиком компонента: если в манифесте есть <administration><menu>...</menu></administration>, Joomla добавит пункт в защищённый администраторский menutype=main. Но этого часто мало. Нормальному компоненту нужны группы ссылок, быстрые действия, ссылки на категории, поля, workflow, дашборд, отдельные наборы пунктов для разных административных модулей и возможность добавлять или скрывать пункты динамически.
Для этого в Joomla 6.1 используется механизм пресетов меню.

Как работать с preset.xml и модифицировать меню админки с помощью плагина - в этой статье.

Читать статью

@webtolkru

#joomla #development #разработка #php
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Forwarded from Joomla Feed (Sergey Tolkachyov)
👩‍💻 WT Max библиотека для интеграции с Joomla v.0.2.0.

Обновление Joomla-библиотеки для API мессенджера MAX с системным плагином для настроек и диагностики подключения. Библиотека предназначена для разработчиков.

Расширение является Joomla-обёрткой над самостоятельным PHP Composer-пакетом Webtolk\Max, у которого так же состоялся релиз 0.2.0. PHP SDK разрабатывалось с учётом стандартов PSR и полностью не зависит от какого-либо фреймворка и/или пакета.

v.0.2.0. Что нового?

- Подключена новая версия API-хоста: platform-api2.max.ru. Для корректной работы ваших чат-ботов и мини-приложений до 19 июля 2026 необходимо перенаправить HTTP-запросы с домена platform-api.max.ru на platform-api2.max.ru, а также добавить сертификат Минцифры в список доверенных. Как это сделать - ссылка на инструкция внизу поста. ‼️ Если этого не сделать - вы получите уведомление об ошибке соединения и неверном сертификате.
- Расширена публичная API-поверхность. Обновлены и дополнены методы для работы с чатами и сообщениями (включая новые сценарии по ссылкам на чат и выборке по query-id сообщения). Удалены устаревшие методы.
- Обновлён набор публичных JSON-схем. Добавлены и синхронизированы схемы для новых и изменённых endpoint-ов. Эти схемы - снимки реальных ответов API Max, так как мы прекрасно знаем, что документация и реальное API может отличаться порой очень и очень значительно.
- Обновление документации. README, стартовые руководства, референсы и описания сущностей/пэйлоадов приведены к текущему API-уровню.

- PHP SDK, Composer-пакет
- Joomla-обёртка WT Max
- Инструкция: Установка сертификатов МинЦифры Российской Федерации на свой сервер.

@joomlafeed

#joomla #php #разработка #max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🚨 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).

❌ Как делать НЕЛЬЗЯ (уязвимый код):

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
🙏1
Forwarded from Joomla Feed (Sergey Tolkachyov)
👩‍💻 WT Max v.0.3.0 - библиотека для интеграции с Joomla.
Joomla-библиотека для API мессенджера MAX с системным плагином для настроек и диагностики подключения. Библиотека предназначена для разработчиков.

Пакет оборачивает основной Composer PHP SDK webtolk/max в joomla-расширение, даёт набор Joomla Form полей для удобной работы в контексте Joomla.

v.0.3.0. Что нового?
- Обновление Max PHP SDK. Обновлена встроенная PHP-библиотека для работы с MAX API.
- Команды бота. Добавлена поддержка команд бота: теперь интеграции могут обновлять список команд, который видят пользователи.
- Работа с комментариями. Добавлена работа с комментариями к сообщениям: отправка, просмотр, редактирование и удаление.
- Работа с чатами. Расширены возможности работы с чатами и ответами на кнопки, включая описание чата и управление предпросмотром ссылок.
- Обновление документации. Обновлены документация и проверочные схемы API.

- Страница расширения (GitHub)
- Max platform PHP SDK

@joomlafeed

#joomla #php #расширения #разработка #max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1