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

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

Был в сети 10 июня 2026, 17:44
Заказы не принимаю
Так что осталось только дождаться сигнала к действию. Чтобы это стало началом конца.
А вот и фигушки. Jason Coward таки вник в вопрос и пообещал срочно принять меры.

Говорит, были занятые выходные и он просто сразу не въехал в масштаб проблемы (а мой английский, очевидно, не так хорош, чтобы это доступно объяснить).

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

Использовать на свой страх и риск, при получении ошибок — смотреть логи SQL и думать, как исправить.

У меня на тестовом сайте, например, всё в порядке с combo-options.
Но как, Шерлок? Особенно вот с этим исправлением?

Там же вроде идёт что-то типа
$object = new $objectName($data);
или типа того. Хотяяя… можно же, наверное, подставить как-бы class_key = 'modUser' и тогда будет создан именно этот объект.
Этому сто лет в обед — работа TicketMeta с любыми ресурсами.

А для тикетов после обновления нужно позаходить в ресурсы, чтобы создались объекты TicketTotal, или запустить вручную скрипт пересчёта рейтинга из заметки про обновление.
Покопался в исходниках и написал пока такой фикс xPDO::getCriteria():
public function getCriteria($className, $type = null, $cacheFlag = true)
{
    $c = $this->newQuery($className);
    $c->cacheFlag = $cacheFlag;
    if (!empty($type)) {
        if ($type instanceof xPDOCriteria) {
            $c->wrap($type);
        } elseif (is_array($type)) {
            $tmp = array();
            array_walk_recursive($type, function ($v, $k) use (&$tmp) {
                if (!is_numeric($k)) {
                    $tmp[$k] = $v;
                }
            });
            if (count($tmp)) {
                $c->where($tmp);
            }
        } elseif (is_scalar($type)) {
            if ($pk = $this->getPK($className)) {
                $c->where(array($pk => $type));
            }
        } else {
            $c->where($type);
        }
    }

    return $c;
}
Это запрещает все запросы на получения объекта xPDO произвольным SQL запросом. Можно использовать либо первичные ключи, либо массивы с прописанными ключами, которые будут проверены при запросе.

По моим тестам работает хорошо, желающие могут проверить на себе — это файл core/xpdo/xpdo.class.php. Предложил код автору xPDO, буду ждать ответа.
Я надеюсь, что речь именно про web-коннекторы.

Понятное дело, что через коннекторы менеджера тоже можно пролезть, но для этого требуется авторизация, а у web — далеко не всегда.

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

Так что, палка о двух концах. Свои дополнения я поправил, так что можно посмотреть коммиты у тех, что в открытом доступе — должно быть всё понятно.
С нашим сообществом всё прекрасно.

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

Ну а я получил массу информации по методике взлома сайтов, благодаря логам на сервере.