Василий Наумкин

Василий Наумкин

Был в сети 10 июня 2026, 17:44
Заказы не принимаю
Все нормальные дополнения будут работать без проблем с любым префиксом и папками, ибо они получается из системных настроек и констант.

Проблемы могут быть только с собственными сниппетами, которые хардкодят префикс вот так
$res = $modx->query("SELECT * FROM modx_users WHERE...");
вместо
$res = $modx->query("SELECT * FROM {$modx->config['table_prefix']}_users WHERE...");
или даже
$res = $modx->query("SELECT * FROM {$modx->getTableName('modUser')} WHERE...");
это если есть xPDO модель для этой таблицы
$modx->event->returnedValues
и будет пустым, пока туда кто-то что-то не запишет.

Держи рабочий пример из платного msDiscount
case 'msOnGetProductPrice':
		if ($modx->context->key == 'mgr') {return;}
		/**
		 * Counts discount of current product for current user, based on rules in msDiscount component
		 * New price must be set in $modx->event->returnedValues['price']
		 *
		 * @var msProductData $product Object with product properties
		 * @var array $data Array with product properties. Can be empty!
		 * @var float $price Current price of product
		 */
		if (!isset($modx->event->returnedValues['price'])) {
			$modx->event->returnedValues['price'] = $price;
		}
		// Get link to product price
		$price = & $modx->event->returnedValues['price'];
		$new_price = $msDiscount->getNewPrice($product->id, $price);
		if ($new_price !== false) {
			$price = $new_price;
		}
		break;
Обрати внимание, что в событии доступны 3 параметра: $product, $data и собственно $price
Может поэтому в Eloquent есть отдельно Raw expressions?

Вообще, грусть-тоска. Я наивно полагал, что работа через xPDO меня как-то защищает. Очевидно, это всё в прошлом и нужно пересматривать все свои дополнения.

Спасибо за PR в pdoTools!
Сережа, ты по-русски не понимаешь?

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

Достаточно было дописать в заметке, что уязвимость можно эксплуатировать хоть откуда, и всё. Я не просил её доказывать, я не отмахивался от неё. Мы её и по почте обсудили с Николаем — и там он тоже не сказал, что доступ в админку уже не нужен.

Наверное, это недоработка Николая, что он недостаточно рассказал о серьёзности проблемы.

P.S. И еще заповедь: не пускайте никого в админку, даже с самыми минимальными правами. Это практически 100% гарантия взлома при желании.
И что, блин? Это вообще теперь не имеет никакого смысла, если любой сайт можно сломать хоть откуда, если у него стандартный префикс таблиц.

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

Но если ты считаешь, что я отмахнулся от проблемы и повёл себя как мудак — твоё право. У меня нет желания это обсасывать второй день подряд.

С моей стороны вопрос решен, дальше дело за ребятами из MODX.
Кстати, на тот момент считалось, что доступ в админку необходим и мой способ вполне себе работает.

А вот чуть позже Николай залез без админки, и сразу на рабочий проект и
написал UPD2 у себя в заметке.

И еще кстати — в текущей заметке этого UPD2 до сих пор нет. Как считаешь, большая ли разница, когда для эксплуатации уязвимости нужен доступ в админку, а когда нет?

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

И, насколько я помню, Евгений еще далеко не всё показал. Не удивлюсь, если и про сегодняшний баг он давно в курсе, просто стимула рассказывать авторам MODX больше нет.