Кирилл Киселев

Кирилл Киселев

С нами с 12 июля 2016; Место в рейтинге пользователей: #427
Роман
25 ноября 2019, 15:58
3
0
Итак, в течение недели пытался разобраться в данной проблемой. Перерыл весь интернет и понял, что данная проблема достаточно часто встречается. У людей в основном она возникает просто так через месяц после запуска сайта (как и у меня).
Проблема замечалась еще в 2012 году, но за все время поисков я не смог найти адекватного ее решения. В основном все советуют отключать сжатие css js, чистить кэш и прочее, но это не помогает.
Чего я только не делал за эту неделю, но методом проб, ошибок и кучи потраченных нервов мне удалось прийти к самому простому и эффективному решению данной проблемы, которое не затронет структуру вашего сайта и БД.

В шапке оставил теги, по которым люди чаще всего ищут решение данной проблемы.

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

По пунктам:
1. Выходим из админки MODX.
2. Удаляем оба файла .htaccess (в корне сайта и в /core).
3. Вручную чистим кэш (удаляем всё из папки /core/cache).
4. Выгружаем нашу базу данных любым удобным способом (я делал через phpMyAdmin).
5. Удаляем все таблицы из БД(чтобы база данных была пустая).
6. Скачиваем с офсайта MODX файлы для установки.
7. Заливаем их на сервер поверх наших файлов с заменой (перезаписать все совпадения) и не забываем про папку setup.
8. Далее идем по адресу 'ваш-сайт.ру/setup' и устанавливаем MODX (не обновляем, а именно устанавливаем, первый пункт в списке предложенных). Я так же отключал сжатие css js. Тут как обычно, выбираем нашу ранее очищенную БД и устанавливаем. В конце установки уберите галочку «удалить установочные файлы», так как папка setup нам еще понадобится.
9. Далее идем в базу данных, удаляем вновь созданные таблицы и импортируем нашу старую базу, которую мы выгрузили в пункте 4. Чистим кэш (/core/cache).
10. Снова идем по адресу 'ваш-сайт.ру/setup', тут нам могут сказать, что надо удалить папку .locked в папке setup чтобы продолжить, делаем это и перезагружаем страницу установки. Теперь все нормально и нам остается лишь выбрать второй пункт «обновить», убрать чекбокс «сжатие css js» и обновить MODX.
11. Снова чистим кэш и пробуем заползти в админку. У меня после такого обновления (О, ЧУДО) админка ожила и все работает как раньше, ничего не слетело и не уехало, все на месте. Не забываем переименовать файлы ht.access

За время поисков решения я смог предположить несколько вариантов появления данной проблемы, но это лишь предположения:
— Вредоносный php скрипт (проблемы с безопасностью)
— Неверное системное время (возможно заходили в админку с компьютера с неправильно настроенным временем) — Мутные делишки хоста. За время поисков обнаружилось аж 4-ро людей с такой проблемой, которые хостились на MasterHost, как и я. «Совпадение? Не думаю...». Хотя с данным хостингом работаю на MODX давно и таких проблем на прошлом проекте с версией 2.5.2 не возникало. Может быть и правда совпадение, но я все же новый проект перенес на более популярный хост))
Еще на счет хостинга — еще до начала недельной эпопеи, греша на хост, я переправил сайт на новое место, но проблема осталась, так что нельзя быть на 100% уверенным в «мутных делишках» хоста, хотя возможно какие-то сбои повредили js-скрипты. Тут лучше судить знающим людям.

Надеюсь, что моя инструкция поможет с решением данный проблемы тем, у кого она возникла. Спасибо за внимание)
Сергей Шлоков
15 мая 2019, 20:30
3
+2
Статья в стиле профессиональных журналистов. Заголовок об одном, статья о другом. И в итоге — «есть ли жизнь на Марсе или не жизни на Марсе, науке не известно». )

Ну так можно украсть?
Хоть бы слово сказал, где был этот сниффер. Т.е. загружался откуда то или файл был залит на сервер? Это разные вектора атаки.

Вообще, тема безопасности будет подниматься всё чаще. Информатизация общества. Интел опять заявил о дырке в процессоре. На хабре попадалась статья про расширения браузера, сливающие данные. А ещё недобросовестные разработчики — недавно Николай Ланец выкладывал ссылку про очень известное дополнение для Node.js, которое воровало биткоины. Плюс огромная армия младоразработчиков, которые умудряются оставлять дырки даже в статических файлах или устраиваются работать в крутые студии. И в результате видим такое. Да даже Facebook хранил пароли в открытом виде.
Самая главная уязвимость — человек. )

П.С. Оставлю тут, может кому пригодится.
Николай Савин
20 февраля 2019, 14:03
2
+1
В админке на каждой странице каждое поле отдельно жестко прописано, с указанием всех свойств (строка, текст, число). Это сделано в js массиве.
Если ты что то новое добавляешь в карту объекта и базу данных (уточню на всякий случай что еще и таблицу базы данных нужно расширять ручками) — то так же ручками нужно добавлять новый дополнительный код в js массив полей.
Обычно делают отдельный плагин, чтобы не вносить правки в исходный код MODX.
Вот пример, прямо из рабочего проекта дернул
switch ($modx->event->name){
case 'OnDocFormPrerender':
        $modx->controller->addHtml("
            <script type='text/javascript'>               
                
             Ext.ComponentMgr.onAvailable('modx-panel-resource', function(){                 
                 if(this.items[1].items[0].id == 'minishop2-product-tab'){
                       var leftCol = this.items[1].items[0].items[0].items[0].items[0].items[0].items[0].items[0];
                 }else{
                      if(this.items[1].items[0].id== 'modx-resource-settings'){
                         var leftCol = this.items[1].items[0].items[0].items[0];
                     }
                     if(this.items[1].items[1].id == 'modx-resource-settings'){
                         var leftCol = this.items[1].items[1].items[0].items[0];
                     }                    
                     
                 } 
                 
                 var kz_title = {
                   anchor: '100%',
                   description: '<b>[[*kz_title]]</br>Заголовок на казахском</b>',
                   fieldLabel: 'Заголовок на казахском',
                   id: 'modx-resource-kz-title',
                   maxLength:255,
                   msgTarget: 'under',
                   name:'kz_title',
                   xtype:'textfield'
                }
                
                leftCol.items.splice(2, 0,  kz_title); 
                
                var kz_description = {
                   anchor: '100%',
                   description: '<b>[[*kz_description]]</br>Описание на казахском</b>',
                   fieldLabel: 'Описание на казахском',
                   id: 'modx-resource-kz-description',
                   maxLength:255,
                   msgTarget: 'under',
                   name:'kz_description',
                   xtype:'textarea'
                }
                                               
                leftCol.items.splice(4, 0,  kz_description);
                
                
                
            });
        </script>");
        break;
}
На выходе получилось вот так prntscr.com/mnm25m
Boris Akimenko
14 декабря 2018, 12:43
1
0
РЕШЕНИЕ
Открыл сниппет mFilter2 и увидел там вот это:
$tplOuter = !empty($scriptProperties['tplFilter.outer.' . $filter_key])
    			? $scriptProperties['tplFilter.outer.' . $filter_key]
    			: $scriptProperties['tplFilter.outer.default'];
    		$tplRow = !empty($scriptProperties['tplFilter.row.' . $filter_key])
    			? $scriptProperties['tplFilter.row.' . $filter_key]
    			: $scriptProperties['tplFilter.row.default'];
    		$tplEmpty = !empty($scriptProperties['tplFilter.empty.' . $filter_key])
    			? $scriptProperties['tplFilter.empty.' . $filter_key]
    			: '';
Это значит что для отсутствующих фильтров можно указать чанк, а не просто отключить вывод пустых результатов параметром
'showEmptyFilters'=>false
В документации упоминания о «tplFilter.empty.» не нашел.

Я создал чанк с неактивным чекбоксом, в итоге для одного чекбокса получился вот такой вызов:
'tplFilter.outer.msoption|product_label_action'=>'tpl.mFilter2.checkbox.outer',
    'tplFilter.row.msoption|product_label_action'=>'tpl.mFilter2.checkbox.row',
    'tplFilter.empty.msoption|product_label_action'=>'tpl.mFilter2.checkbox.empty',
И в итоге получил вот такой результат:
Кирилл Киселев
11 августа 2018, 23:57
1
0
Расширил корзину, скопировав основной класс, просто добавил
$old_price = $product->loadData()->get('old_price');
И вставил сюда
$this->cart[$key] = array(
    'id' => $id,
    'price' => $price,
    'old_price' => $old_price,
    'weight' => $weight,
    'count' => $count,
    'options' => $options,
    'ctx' => $this->modx->context->get('key'),
);
Андрей Степаненко
10 августа 2018, 21:59
1
+6
Написал приложение: Умеет сканировать директории сайта.
В будущем планируется поддержка двух версий платной и бесплатное.

От вирусов оно конечно не избавит, но поможет разобраться с вашей файловой системой.

Смысл в том что во время сканирования происходит заказчка вашей версия MODX из репозитория https://ilyaut.ru/download-modx/ (только чистая)
Затем все распаковывается в папке core/cache/default/scannermodx/repository/modx-2.6.5-pl

Запускается паук который ищет все файлы с расширение: php,js,html,tpl,css,scss,sass,less (можно свои добавить)

И во время поиска сравниваются файлы ядра с версией ядра из репозитория.
Если в файлах ядра были какие то изменения то вы это все увидите.
В общем пробуем: https://yadi.sk/d/mLKu-jXq3a7jJU

Так же составляется список карантинных файлов и список доверенных файлов и директорий.
Чтобы не сканировать все подряд.

Так же еще можно открыть файл и посмотреть что в нем.

Вот так это все выглядит:


Если будут какие то идеи по улучшению то пишите.
Особенно нужны алгоритмы для отлова вирусных файлов. Чтобы можно было вычислять зараженные файлы.

Директории и файлы:
  • 'core/components',
  • 'core/docs',
  • 'core/cache',
  • 'core/packages',
  • 'setup',
  • 'core/config/config.inc.php',
По умолчанию исключены из сканирования. Но можно включить их в настройках: scannermodx_enabled_dir
Владимир
07 августа 2018, 17:43
1
+3
скрипт не нужен, есть команда
rm -i $(cat fuck.txt)
переносишь список файлов к удалению в отдельный текстовый файл, в нем каждая строка — удаляемый файл и путь к нему
И да, вместо PuTTY под винду лучше www.bitvise.com/
Сергей Шлоков
25 апреля 2018, 08:54
3
+5
стандартный парсер запускается раньше, чем парсер фенома, из за чего сначала обработаются стандартные теги
Не путай человека.
Парсер MODX запускается перед феномом только для обработки кэшируемых тегов. Вообще парсинг выглядит так:
1. Запускается парсер MODX и обрабатывает кэшируемые теги. Феном теги остаются необработанные.
2. Запускается парсер фенома, если есть теги Fenom.
3. Запускается парсер MODX и обрабатывает некэшируемые теги пока они есть. Нераспарсенные не удаляются.
Пункты 2 и 3 могут выполняться в цикле до 10 раз, если есть нераспарсенные теги.
// В сниппет попадёт распарсенный тег феном
[[!snippet? param=`{$value}`]]
4. Запускается парсер фенома, если есть теги Fenom.
5. Запускается парсер MODX и обрабатывает некэшируемые теги пока они есть. Нераспарсенные теги удаляются.
Пункты 4 и 5 пункт могут выполняться в цикле до 10 раз, если есть нераспарсенные теги.
Многие, наверно, обращали внимание на тормоза, если указан несуществующий плейсхолдер.

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

Я бы посоветовал использовать оба парсера так:
— юзать только кэшируемые теги MODX ([[*tag]], [[$chunk]], [[++system]], [[snippet]]). Хорошо для оптимизации.
— для остального использовать феном.
В этих режимах парсеры не пересекаются.
Андрей
22 января 2018, 17:22
2
+2
Написать парсер xml и так же по крону обновлять товары.

Просто в файле подключаете modx api, разбираете xml и из готового массива с данными товаров обновляете цены с помощью процессора modx.

если очень схематично, то так
// API
require_once '/absolute/path/to/modx/config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('mgr');
$modx->getService('error','error.modError', '', '');

//Разбор xml
$xmlData = array(); // данные о товарах

// Обновление товаров
foreach ($xmlData as $item) {

	$id = $item['id'];
	$action = 'create';

	if ($product = $modx->getObject('msProduct', $id)) {
		$data = $product->toArray();
		$data['price'] = $item['price'];

		$response = $modx->runProcessor('resource/'.$action, $data);

		if ($response->isError()) {
			$modx->log(1, $response->getResponse());
		}
	}

}

Если нужно обновлять только одно поле, то можно не через процессор а так
if ($product = $modx->getObject('msProduct', $id)) {
	$product->set('price', $item['price']);
	$product->save();
}