Новые возможности joomla 3.7. Обновление руссификации Joomla

01.10.2021 Социальные сети

Баги в популярных CMS в последние месяцы стали настоящей напастью. Появление каждой такой уязвимости означает, что под угрозой оказываются сотни тысяч сайтов, и далеко не каждый владелец успевает вовремя обновиться до свежей версии. В этой статье мы изучим недавно обнаруженную дыру в CMS Joomla: из-за недостаточной фильтрации пользовательских данных система уязвима для SQL-инъекций.

Joomla 3.7.0, помимо множества улучшений и исправлений, принесла в ядро функцию пользовательских полей и, в частности, компонент com_fields . Как ты уже, наверное, догадался, этот новый компонент и стал причиной проблемы. Так что без лишних церемоний приступим к увлекательному путешествию в исходниках по следам уязвимости.

Детали уязвимости

В первую очередь заглядываем в сам файл контроллера.

16: class FieldsController extends JControllerLegacy 17: { ... 27: public function __construct($config = array()) 28: { ... 32: if ($this->input->get("view") === "fields" && $this->input->get("layout") === "modal") ... 36: $lang->load("com_fields", JPATH_ADMINISTRATOR); 37: 38: $config["base_path"] = JPATH_COMPONENT_ADMINISTRATOR;

Сразу же бросается в глаза условие : если view и layout принимают значения fields и modal соответственно, то CMS загружает администраторскую версию компонента com_fields . И все запросы от обычного пользователя будут проксироваться в него.

Что же нам это дает? Давай посмотрим.

Заглянем внутрь метода getListQuery , он занимается тем, что собирает запрос к базе данных. Нас интересует часть со строкой, в которой формируется сортировка (ORDER BY).

124: protected function getListQuery() 125: { ... 304: // Add the list ordering clause 305: $listOrdering = $this->getState("list.fullordering", "a.ordering"); 306: $orderDirn = ""; 307: 308: if (empty($listOrdering)) 309: { 310: $listOrdering = $this->state->get("list.ordering", "a.ordering"); 311: $orderDirn = $this->state->get("list.direction", "DESC"); 312: } 313: 314: $query->order($db->escape($listOrdering) . " " . $db->escape($orderDirn));

Переменная $listOrdering - название поля в таблице, по которому требуется отсортировать запрос. Ее фильтрует функция escape , которая зависит от используемого на сервере драйвера для работы с БД. Она возвращает строку, в которой экранированы спецсимволы, в частности кавычки.

Рассмотрим исходный код этой функции для драйвера mysqli . Он встречается чаще всего, поскольку Joomla при установке предлагает именно его.

/libraries/joomla/database/driver/mysqli.php

242: public function escape($text, $extra = false) 243: { 244: $this->connect(); 245: 246: $result = mysqli_real_escape_string($this->getConnection(), $text); 247: 248: if ($extra) 249: { 250: $result = addcslashes($result, "%_"); 251: } 252: 253: return $result; 254: }

Для фильтрации используется функция mysqli_real_escape_string (строка 246), которая экранирует null-байты, переносы строк, одинарные и двойные кавычки. Однако в нашем случае это абсолютно бесполезные действия, так как в нашей переменной хранится название колонки для сортировки.

Давай посмотрим, как передать нужные нам значения в $listOrdering . Метод getState наследуется прямиком из абстрактного класса JModelLegacy , который является родителем для JModelList , а он, в свою очередь, наследуется нашим FieldsModelFields .

019: class FieldsModelFields extends JModelList ... 305: $listOrdering = $this->getState("list.fullordering", "a.ordering");

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «сайт», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!

Доброго времени суток всем! В данном посте хочу рассмотреть некоторую особенность, которая появилась в Joomla, начиная с версии 3.7 — это дополнительные поля в материалах. Считаю это полезным дополнением к стандартному компоненту материалов com_content. Ранее приходилось из-за нескольких полей устанавливать тяжеловесные конструкторы контента (CCK) и все для того, чтобы пользователю было легче работать в админке. В данной статье как раз рассмотрим как создать дополнительные поля в материалах и как вывести их во внешнем сайте.

Также, как и материалы поля объединяются в группы, это своего рода категории. Для того,чтобы создать группу полей идем в админке Материалы -> Группы полей . Создаем группу. Далее, создаем сами поля. Здесь уже по более опций, пройдемся по основным.

Структура статьи

Вкладка «Основное»

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

Тип — выбираем тип поля: Текст (text), Текстовое поле (textarea), Url, Календарь и т.д. Не буду здесь разбирать в подробностях, т.к. ничего сложного в них нет и настраиваются все по одному принципу.

Имя — вводим алиас поля латиницей. Это своего рода индефикатор поля и он должен быть уникальным.

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

Описание — вводим описание поля.

Обязательно — если данное поле будет обязательным при создании материала, то ставим переключатель «Да».

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

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

Максимальная длина — можете ограничить длину вводимых символов.

Вкладка «Параметры»

Placeholder — это подсказка для поля. Например, можете ввести подсказку для вашего контент менеджера.

CSS-класс для показа — можете ввести свой класс поля для переопределения стиля в css.

Заголовок поля — управляет выводом заголовка поля на сайте.

Автоматическое отображение — вот эта полезная опция на мой взгляд. Есть предустановленные настройки (на момент написания статьи значения не переведены на русский язык):

  • After Title — показать поле после заголовка;
  • Before Display — показать перед текстом;
  • After Display — показать после текста;
  • Do not automatically display — не показывать автоматически поле. Данная опция предусматривает вывод поля в шаблоне сайта посредством кода. Об этом поговорим ниже.

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

А вот как данное поле выглядит на сайте.

Название поля я сделал жирным через стили CSS. Сразу скажу, что через автоматический вывод у нас нет возможности кастомизировать шаблон вывода полей. Это возможно сделать без автоматического вывода.

Вывод дополнительных полей материалов в шаблоне Joomla — ручной режим

Итак, если вам не подходит предустановленные настройки вывода полей или вы хотите просто править html-шаблон полей, то есть возможность вывести поля в любом месте шаблона материала и обрамить их какими угодно тегами. Для вывода поля в ручном режиме необходимо сначала отключить автоматический показ поля в параметрах. Если этого не сделать, то поля у вас будут просто дублироваться.

После этих действий в папке вашего шаблона должна появиться следующая директория с файлом Ваш шаблон -> html -> com_content -> article — default.php . Вот с данным файлом и будем работать. Открываем файл шаблона материала и в нужном месте вставляем код для вывода поля. Я вставил до кода вывода текста:

item->text; ?>

Код вывода поля

item->jcfields as $field) { $myCustomFields[$field->name] = $field->value; } // RECOVER CUSTOM FILED NAME if (isset($myCustomFields["field-1"]) and !empty($myCustomFields["field-1"])) : ?>

Название поля:

Вместо field-1 подставляете ваш псевдоним поля (первый скриншот настроек, поле «Имя»). Вот как это выглядит на примере — .

Если вы хотите вывести более одного поля, то нет необходимости заново копировать цикл «foreach». Данный цикл необходимо объявить выше вывода полей. А второе поле вывести, например, так:

Название поля:

Вместо field-2 — название вашего поля.

На этом завершу. Всем удачи, всем пока!

Вышла новая версия Joomla. Текущая версия Joomla! 3.7.0. После , потребовалось обновить и файл русской локализации Joomla. Про то, как понять, что вышла новая версия пакета с переводом Joomla на русский язык и про то, как установить пакет с обновлениями перевода Joomla на русский язык, будет показано ниже. До того, как устанавливать какие-либо обновления, рекомендуется создать резервную копию сайта. Но кто её делает? =)

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

Тут ты и воспользоваться кнопкой «Обновить сейчас », но не всегда доходят руки. Поэтому есть ещё одно место на главной странице админки Joomla, где тоже есть маячок о необходимости обновить расширения. Это левое меню раздел «ОБСЛУЖИВАНИЕ », где тоже чётко указывается «». Это сообщение является ссылкой (как и кнопка «Обновить сейчас » на картинке выше) для начала установки обновлений:

В общем, рано или поздно становится на столько любопытно, что же там такое требует обновления, что перейдя по ссылке можно увидеть, что . Для того, чтобы его установить требуется пометить его в чекбоксе, а после этого нажать на кнопку «Обновить », расположенную в верхнем ряду кнопок управления «Менеджера расширений » раздела «Обновления »:

После нажатия заветной кнопки «Обновить » начнётся процесс обновления выбранного пакета. И после того, как он успешно установится, перезаписав старый пакет , то есть изменения необратимы , Joomla выдаст весёлое сообщение «»:

Как показывает практика, перевод никогда не бывает полным. Но, по крайней мере, основные записи и сообщения на страницах сайта будут на русском языке. А это всегда полезно, так как не отпугнёт пользователей, увидевших надписи на экзотическом (английском) языке непонятными латинскими буквами. =)

Добрый день, уважаемые читатели! После установки joomla 3, первым делом необходимо загрузить и установить "Языковые пакеты", тем самым русифицировать joomla 3. Как это сделать, я покажу в сегодняшней статье.

Joomla является одним из самых популярных конструкторов сайта, этим движком пользуются десятки стран в мире. Для того чтобы не нагружать сайт лишними языковыми пакетами, стандартный комплект идёт на английском языке.

Необходимый язык устанавливается отдельно, в нашем случае русский. Итак, давайте приступим к русификации joomla 3, и первым делом, надо скачать русские языковые пакеты.

Скачать русские языковые пакеты

Скачать пакеты для русификации, можно на официальном сайте www.joomla.org , прокрутите открывшуюся страницу в низ и найдите заголовок "RUSSIAN TRANSLATION", после, кликните по ссылке находящейся под пунктом "Download Language Pack".

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

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

Русификация jomla 3

Теперь, когда мы скачали архив с русскими языковыми пакетами, пора приступать к самой русификации. Что для этого необходимо сделать.

1. Зайдите в административную панель joomla 3, введя свой логин и пароль.

2. В меню админки выберите пункт меню "Extension", в выпавшем списке кликните на подпункт "Extension Manager".

3. На открывшейся странице нажмите на кнопку "Выберите файл".

4. В открывшемся окне, найдите файл русификации админки на вашем компьютере, который мы скачали, выделите его и нажмите на кнопку "Открыть".

5. После того как мы открыли файл, необходимо нажать на кнопку "Upload & Install", для его установки.

6. По окончании установки должно появится сообщение "Installing language was successful", на зелёном фоне. Означающее что установка языка прошла успешно.

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

8. Когда оба русификатора установлены, нам необходимо их включить. Для этого, в админке joomla 3 нажмите на кнопку "Extension", в выпавшем списке выберите пункт "Language Manager".

9. На открывшейся странице, в левой части, кликните на строчку "Installed - Site", означающую "Языковые пакеты сайта". После, нажмите на звёздочку в строчке "Russian", (в правой части страницы). Когда звёздочка загорится оранжевым, на вашем сайте по умолчанию будет установлен русский язык.

10. Теперь нажмите на строчку "Installed - Administrator" и так-же кликните по звёздочке в строчке "Russian", тем самым в русифицируете административную панель, сделав языком по умолчанию русский.

Внимание! Если ваша админка или сайт, не русифицировались, очистите кеш браузера, закройте его и откройте заново. После, повторно зайдите в админку joomla 3.

Итак у вас есть сайт на Joomla 3.4.х, который вам нужно обновить до последней версии (на момент написания статьи это версия 3.8.0).

Вроде бы всё должно быть проще некуда, качаем пакеты обновлений и постепенно накатываем один за другим, периодически исправляя базу данных средствами Joomla, но не всё так просто. Есть один подводный камушек (а то и десяток), но давайте по порядку, и так имеем сайт на Joomla 3.4.x и что дальше...

Обязательно делаем бекап файлов сайта и базы данных!
Так как всегда что-то может пойти не так как задумано)

ЭТАП 1. Обновляем Joomla 3.4.x до версии 3.4.5


ЭТАП 2. Обновляем Joomla 3.4.5 до Joomla 3.5.1

  1. Идем по ссылке и качаем патч Joomla! 3.5.1 Upgrade Package (.zip)
  2. Далее повторяем пункты 2-5 из ЭТАПЕ 1

ЭТАП 3. Обновляем Joomla 3.5.1 до Joomla 3.6.0
(самый обширный этап обновления)

  1. Идем по ссылке и качаем патч Joomla! 3.6.0 Upgrade Package (.zip)
  2. Далее нужно распаковать этот архив на вашем ПК и залить полученные файлы на ваш хостинг по фтп с заменой файлов.
  3. Переходим "Расширения->Менеджер расширений" и в левом меню выбираем "База данных" и опять видим что наша база данных устарела
  4. Жмем кнопку "Исправить".
  5. После того как вы обновили Joomla до версии 3.6.0 ОБЯЗАТЕЛЬНО нужно установить компонент обновления и другие обновления.

    Для этого идём "Расширения->Менеджер расширений->Обновления (Update)" и жмём кнопку "Найти обновления" , в результате получим список требуемых обновлений. Тут нам нужно выбрать обновления для:
    • Joomla! Update Component Update
    • Weblinks Extension Package
  6. Сначала обновляем Joomla! Update Component Update и только потом Weblinks Extension Package . Так же можете обновить Языковой пакет .
  7. Теперь перейдём "Расширения->Менеджер расширений->Установка (Install)" и увидим такую картину:

    причем если кликнуть по ссылке Plugin Manager вы скорее всего увидите пустой список плагинов. Давайте это исправим, для этого:
  8. Опять перейдём "Расширения->Менеджер расширений->Установка (Install)" и перейдем по ссылке "Plugin Manager" в сообщении об отсутствии плагинов установки и теперь тут мы увидим список требуемых плагинов.
  9. Ставим галочки напротив плагинов: "Installer - Install from ", "Folder Installer - Install from ", "Upload Installer - Install from URL " и жмем кнопку "Включить ".
    Теперь перейдя на "Расширения->Менеджер расширений->Установка (Install)" мы увидим уже привычные нам кладки с разными вариантами установки
  10. Делаем резервную копию файлов сайта и базы данных.

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

ЭТАП 4. Обновляем Joomla 3.6.0 до Joomla 3.6.5


ЭТАП 5. Обновляем Joomla 3.6.5 до Joomla 3.7.5
(тоже не менее обширный этап обновления чем третий)


На этом этапе обновления Joomla уже начинает нас предупреждать о том что наша версия PHP 5.4-5.6 устарела и рекомендует перейти на более новую версию PHP7.

ЭТАП 4. Обновляем Joomla 3.7.5 до Joomla 3.8.0
(заключительный этап обновления)


ВНИМАНИЕ!

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

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

автор: