Новости Joomla

‼️ 👩‍💻 Обновление безопасности для Tassos Framework!

‼️ 👩‍💻 Обновление безопасности для Tassos Framework!

7 января 2026 года греческому разработчику Тассосу Мариносу сообщили об уязвимости в системном плагине Tassos Framework, который входит в состав его расширений для Joomla.

⚠️ Проблема затрагивает следующие расширения:
- Convert Forms - конструктор форм обратной связи для Joomla
- EngageBox - конструктор всплывающих окон для Joomla
- Google Structured Data - пакет плагинов микроразметки для Joomla
- Advanced Custom Fields - пакет плагинов пользовательских полей (видео-сервисы, карты и иже с ними)
- Smile Pack - пакет расширений
- MailChimp Auto-Subscribe

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

👉 Суть уязвимости.
Уязвимость заключалась в том, как плагин Tassos Framework обрабатывал определенные AJAX-запросы через com_ajaxточку входа Joomla. При определенных условиях внутренняя функциональность фреймворка могла быть вызвана без надлежащих ограничений.

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

При определенных обстоятельствах запросы к базе данных могли быть изменены для извлечения данных из базы данных Joomla. В совокупности эти возможности потенциально могли быть использованы для повышения уровня доступа и выполнения несанкционированного кода.

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

Немедленно обновите расширения до безопасных версий (Joomla 4/5/6 | Joomla 3):
- Convert Forms - v5.1.1 / v.4.1.1
- EngageBox - v.7.1.1 / v,6,3,9
- Google Structured Data - v.6.1.1 / v.5.6.9
- Advanced Custom Fields - v.3.1.1 / v.2.8.10
- Smile Pack - v.2.1.1 / v.1.2.4.
- MailChimp Auto-Subscribe - v.5.1.1+ / v.5.0.4

Все указанные версии включают в себя релиз безопасности плагина Tassos Framework System Plugin v6.0.62.

Если у вас установлено несколько расширений Tassos, достаточно обновить только одно, чтобы применить патч. Однако всегда рекомендуется обновлять все расширения.

@joomlafeed

👩‍💻 Joomla включена в программу Google Summer of Code 2026.

👩‍💻 Joomla включена в программу Google Summer of Code 2026.

Google Summer of Code (GSoC) - программа компании Google, которая позволяет участникам программы под руководством опытных наставников писать код для организаций, занимающейся открытым исходным кодом. Joomla принимает участие в этой программе не в первый раз и в 2026 году снова включена в список GSoC. Для программы утверждается список "идей", воплотить которые должны участники под руководством наставников.

Проекты Joomla в рамках программы GSoC 2026.

Проект I: Ajax-бэкенд.
- Действия в административной панели без необходимости обновлять страницу.
- Автоматическое сохранение содержимого во время редактирования.
- Расширенный фильтр - поиск и фильтрация по пользовательским полям.

Проект II: Автоматизация рабочих процессов (workflow + task scheduler).
Joomla имеет функцию процессов и планировщика задач. Теперь эти две функции следует объединить, чтобы пользователь мог настраивать назначенные рабочие процессы таким образом, чтобы переходы выполнялись автоматически, с возможностью точного определения времени. Должна быть возможность создавать циклы или прямые запланированные рабочие процессы. Предполагается, что интерфейс должен учитывать хороший пользовательский опыт, удобство использования и современные стандарты доступности. Ожидается, что будет добавлен интерфейс для управления процессами и их расписанием на страницах категорий и материалов. Так же ожидается, что сторонние компоненты также смогут воспользоваться этим функционалом.

Проект III: Мультикатегории.
В настоящее время Joomla! не позволяет назначать один элемент нескольким категориям. Хотя система тегов часто используется в качестве замены, существует острая потребность в нативной поддержке нескольких категорий, чтобы привести Joomla! в соответствие с другими современными системами управления контентом.

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

Принять участие GSoC 2026
Подробнее о проектах Joomla GSoC 2026
Чат GSoC в Mattermost (международное сообщество Joomla)

Вышли релизы Joomla 6.0.3 и Joomla 5.4.3

Релиз Joomla 6.0.3 и Joomla 5.4.3

Проект Joomla рад сообщить о выпуске Joomla 6.0.3 и Joomla 5.4.3. Это релиз исправлений ошибок и улучшений для серии Joomla 6.0 и Joomla 5.4.

0 Пользователей и 1 Гость просматривают эту тему.
  • 6 Ответов
  • 1218 Просмотров
*

Tuzemec

  • Захожу иногда
  • 246
  • 28 / 0
  • Ня!
Проблема такая: при создании пункта меню на текст "Доставка", "Правила", "Мой профиль", "Изменить данные профиля" в "Навигаторе сайта" появляется путь не "Главная" - "Доставка", а путь с дублирующей ссылкой вида "Главная" - "Доставка" - "Доставка".
Выключаю SEF, удаляю из ссылки "&Itemid=ххх" - путь показывает верный. Неужели придется пункты меню приводить к типу "Внешняя ссылка"? Как побороть сие "чудо"?
Замечено в JoomShopping 4.13.0 и в версии до этого 4.12.3. В более ранних не проверял.
« Последнее редактирование: 29.04.2016, 10:21:14 от Tuzemec »
Каждый ваш клик помогает заработать сыну на конфеты
Не дайте ребенку остаться без сладкого! Сделай ТЫЦ!
*

nevigen

  • Moderator
  • 10451
  • 863 / 25
  • http://n*****n.com
да в крошках формируется промежуточный пункт меню и сама доставка получается конечным пунктом.
надо смотреть роутер...

вообще-то, я бы на месте разработчиков сделал бы просто в настройках возможность задавать ссылки на материалы.
зачем формировать 2 раза контент, в статье и в доставках.

Joomla и есть управление контентом, зачем делать еще контент в магазине ?

П.С. инфо о доставке и оплате на сайте обычно вывожу материалами. продублировать легче чем танцевать на граблях ;)
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !
*

Tuzemec

  • Захожу иногда
  • 246
  • 28 / 0
  • Ня!
П.С. инфо о доставке и оплате на сайте обычно вывожу материалами. продублировать легче чем танцевать на граблях ;)
Хм... как самому в голову такая мысль не пришла... Похоже стремление решить проблему именно в ЖШ мозг вырубила. Спасибо за идею.
Видимо по причине простого выхода из положения разработчики и не берутся что-то с данным багом делать.
Но что делать со ссылкой "Изменить мои данные" и "Мои заказы"?
Хотя и тут поступить можно так: "Мои заказы" сделать дочерним пунктом меню "Мой профиль", а "Изменить мои данные"
сделать типа "Внешняя ссылка" и тоже сделать дочерним пунктом.

Зараза! И "Профиль" имеет вид:  Главная - Профиль - Мой профиль
Как-то всё через костыли...
« Последнее редактирование: 29.04.2016, 00:23:27 от Tuzemec »
Каждый ваш клик помогает заработать сыну на конфеты
Не дайте ребенку остаться без сладкого! Сделай ТЫЦ!
*

nevigen

  • Moderator
  • 10451
  • 863 / 25
  • http://n*****n.com
ну... :)
да есть такое дело малеха...
хотя честно ан крошки мало кто обращает внимания.
тем более что ошибки то там нет, просто визуализация не привычная. с 1 костылем :)
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
\components\com_jshopping\helpers\metadata.php
удалите 4-й параметр
Цитировать
   public static function userMyaccount(){
      self::metaData("myaccount", 0, _JSHOP_MY_ACCOUNT, _JSHOP_MY_ACCOUNT);
   }
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Tuzemec

  • Захожу иногда
  • 246
  • 28 / 0
  • Ня!
Какая интересная картина получилась! Огромное спасибо! Тут и остальные, описанные проблемы решить можно!
Для пунктов "Доставка", "Правила", "Возврат", "Защита данных" комментируем строку 97
Код
.....
        $pathway = _JSHOP_PRIVACY_STATEMENT;
            break;
        }       
//appendPathWay($pathway); //Комментируем эту функцию

        $seo = JSFactory::getTable("seo", "jshop");
.....
Для "Профиля" (строка 205), "Мои данные" (строка 181), "Мои заказы" (строка 191) - удаляем, как написано постом выше, 4-ый параметр.
Возможно в отличных от версии ЖШ 4.13.0 строки иные, но думаю найти их будет не проблема
« Последнее редактирование: 29.04.2016, 10:19:58 от Tuzemec »
Каждый ваш клик помогает заработать сыну на конфеты
Не дайте ребенку остаться без сладкого! Сделай ТЫЦ!
*

victorantoniak

  • Moderator
  • 1579
  • 185 / 2
  • JoomShopping Team
файл из версии 4.13.1
components\com_jshopping\helpers\metadata.php
Код
<?php
/**
* @version      4.13.1 25.03.2016
* @author       MAXXmarketing GmbH
* @package      Jshopping
* @copyright    Copyright (C) 2010 webdesigner-profi.de. All rights reserved.
* @license      GNU/GPL
*/
defined('_JEXEC') or die();

class JshopHelpersMetadata{

public static function metaData($alias, $loadParams = 1, $default_title = '', $path_way = '', $external_params = null){
if ($path_way!=''){
appendPathWay($path_way);
}
if ($loadParams && is_null($external_params)){
$params = JFactory::getApplication()->getParams();
}else{
$params = null;
}
if ($external_params){
$params = $external_params;
}
$seo = JSFactory::getTable("seo", "jshop");
        $seodata = $seo->loadData($alias);
if ($seodata->title==""){
            $seodata->title = $default_title;
        }
        setMetaData($seodata->title, $seodata->keyword, $seodata->description, $params);
return $seodata;
}

public static function metaDataDependenMainPageShop($alias, $loadParams = 1, $default_title = '', $path_way = ''){
if (getThisURLMainPageShop()){
$params = 0;
$title = $default_title;
$path = $path_way ;
        }else{
$params = $loadParams;
$title = '';
$path = '';
        }
return self::metaData($alias, $params, $title, $path);
}

public static function mainCategory($category, $params){
setMetaData($category->meta_title, $category->meta_keyword, $category->meta_description, $params);
}

public static function category($category){
if (getShopMainPageItemid()==JFactory::getApplication()->input->getInt('Itemid')){
            appendExtendPathWay($category->getTreeChild(), 'category');
        }
        if ($category->meta_title=="") $category->meta_title = $category->name;
        setMetaData($category->meta_title, $category->meta_keyword, $category->meta_description);
}

public static function cart(){
self::metaDataDependenMainPageShop('cart', 1, _JSHOP_CART, _JSHOP_CART);
}

public static function checkoutAddress(){
self::metaData("checkout-address", 0, _JSHOP_CHECKOUT_ADDRESS, _JSHOP_CHECKOUT_ADDRESS);
}

public static function checkoutPayment(){
self::metaData("checkout-payment", 0, _JSHOP_CHECKOUT_PAYMENT, _JSHOP_CHECKOUT_PAYMENT);
}

public static function checkoutShipping(){
self::metaData("checkout-shipping", 0, _JSHOP_CHECKOUT_SHIPPING, _JSHOP_CHECKOUT_SHIPPING);
}

public static function checkoutPreview(){
self::metaData("checkout-preview", 0, _JSHOP_CHECKOUT_PREVIEW, _JSHOP_CHECKOUT_PREVIEW);
}

public static function checkoutFinish(){
$document = JFactory::getDocument();
        $document->setTitle(_JSHOP_CHECKOUT_FINISH);
        appendPathWay(_JSHOP_CHECKOUT_FINISH);
}

public static function content($page){
switch($page){
            case 'agb':
                $title = _JSHOP_AGB;
            break;
            case 'return_policy':
                $title = _JSHOP_RETURN_POLICY;
            break;
            case 'shipping':
                $title = _JSHOP_SHIPPING;
            break;
            case 'privacy_statement':
                $title = _JSHOP_PRIVACY_STATEMENT;
            break;
        }
if (getThisURLMainPageShop()){
$pathway = $title;
$loadParams = 0;
}else{
$pathway = '';
$loadParams = 1;
}
return self::metaData("content-".$page, $loadParams, $title, $pathway);
}

public static function listManufacturers($params){
self::metaData("manufacturers", 0, '', '', $params);
}

public static function manufacturer($manufacturer){
if (getShopManufacturerPageItemid()==JFactory::getApplication()->input->getInt('Itemid')){
            appendPathWay($manufacturer->name);
        }
        if ($manufacturer->meta_title=="") $manufacturer->meta_title = $manufacturer->name;
        setMetaData($manufacturer->meta_title, $manufacturer->meta_keyword, $manufacturer->meta_description);
}

public static function search(){
self::metaDataDependenMainPageShop('search', 1, _JSHOP_SEARCH, _JSHOP_SEARCH);
}

public static function searchResult(){
self::metaDataDependenMainPageShop('search-result', 1, _JSHOP_SEARCH, _JSHOP_SEARCH);
}

public static function userLogin(){
self::metaDataDependenMainPageShop('login', 1, _JSHOP_LOGIN, _JSHOP_LOGIN);
}

public static function userRegister(){
self::metaDataDependenMainPageShop('register', 1, _JSHOP_REGISTRATION, _JSHOP_REGISTRATION);
}

public static function userEditaccount(){
if (shopItemMenu::getInstance()->getEditaccount()!= JFactory::getApplication()->input->getInt('Itemid')){
$pathway = _JSHOP_EDIT_DATA;
}else{
$pathway = '';
}
self::metaData("editaccount", 0, _JSHOP_EDIT_DATA, $pathway);
}

public static function userOrders(){
if (shopItemMenu::getInstance()->getOrders()!= JFactory::getApplication()->input->getInt('Itemid')){
$path_way = _JSHOP_MY_ORDERS;
}else{
$path_way = '';
}
self::metaData("myorders", 0, _JSHOP_MY_ORDERS, $path_way);
}

public static function userOrder($order){
$jshopConfig = JSFactory::getConfig();       
self::metaData("myorder-detail", 0, _JSHOP_MY_ORDERS);
$shim = shopItemMenu::getInstance();
if ($shim->getOrders()!=JFactory::getApplication()->input->getInt('Itemid')){
appendPathWay(_JSHOP_MY_ORDERS, SEFLink('index.php?option=com_jshopping&controller=user&task=orders', 0, 0, $jshopConfig->use_ssl));
}
        appendPathWay(_JSHOP_ORDER_NUMBER.": ".$order->order_number);
}

public static function userMyaccount(){
if (shopItemMenu::getInstance()->getUser()!= JFactory::getApplication()->input->getInt('Itemid')){
$pathway = _JSHOP_MY_ACCOUNT;
}else{
$pathway = '';
}
self::metaData("myaccount", 0, _JSHOP_MY_ACCOUNT, $pathway);
}

public static function userGroupsinfo(){
setMetaData(_JSHOP_USER_GROUPS_INFO, "", "");
}

public static function listVendors(){
self::metaData("vendors");
}

public static function vendorInfo($vendor){
$title =  $vendor->shop_name;       
        appendPathWay($title);
       
        $seo = JSFactory::getTable("seo", "jshop");
        $seodata = $seo->loadData("vendor-info-".$vendor->id);
        if (!isset($seodata)) {
            $seodata = new stdClass();
            $seodata->title = '';
            $seodata->keyword = '';
            $seodata->description = '';
        }
        if ($seodata->title==""){
            $seodata->title = $title;
        }
        setMetaData($seodata->title, $seodata->keyword, $seodata->description);
}

public static function vendorProducts($vendor){
appendPathWay($vendor->shop_name);
        $seo = JSFactory::getTable("seo", "jshop");
        $seodata = $seo->loadData("vendor-product-".$vendor->id);
        if (!isset($seodata->title) || $seodata->title==""){
            $seodata = new stdClass();
            $seodata->title = $vendor->shop_name;
            $seodata->keyword = $vendor->shop_name;
            $seodata->description = $vendor->shop_name;
        }
        setMetaData($seodata->title, $seodata->keyword, $seodata->description);
}

public static function wishlist(){
self::metaDataDependenMainPageShop('wishlist', 1, _JSHOP_WISHLIST, _JSHOP_WISHLIST);
}

public static function product($category, $product){
$app = JFactory::getApplication();
$Itemid = $app->input->getInt('Itemid');
if (getShopMainPageItemid()==$Itemid){
            appendExtendPathway($category->getTreeChild(), 'product');
        }
$menu = $app->getMenu();
$menuItem = $menu->getItem($Itemid);       
if ($menuItem->query['view']!='product'){
appendPathWay($product->name);
}
        if ($product->meta_title=="") $product->meta_title = $product->name;
        setMetaData($product->meta_title, $product->meta_keyword, $product->meta_description);
}

public static function allProducts(){
self::metaData("all-products");
}

public static function productsTophits(){
self::metaData("tophitsproducts");
}

public static function productsToprating(){
self::metaData("topratingproducts");
}

public static function productsLabel(){
self::metaData("labelproducts");
}

public static function productsBestseller(){
self::metaData("bestsellerproducts");
}

public static function productsRandom(){
self::metaData("randomproducts");
}

public static function productsLast(){
self::metaData("lastproducts");
}

}
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться