Помощь InstantCMS 2.3 и иже с ним. Чего следует опасаться?

stealthdebuger

Механик
Регистрация
25 Авг 2008
Сообщения
681
Реакции
1.688
Недавно у видела свет очередная версия InstantCMS. Случайно это совпало с моим желанием развеяться и решением зайти на оф.сайт данной CMS.
В списке последних постов я увидал тему посвященную переводчику UniLang. Хвала автору, он действительно старался сделать полезное для сообщества и выложил свой труд для бесплатного скачивания. В данной работе автор использует функционал предоставляемый Яндекс.Переводчик и (еще один плюс в карму разработчику) он не забыл опубликовать требования Яндекс к контенту, полученному благодаря своему ресурсу.

Первый, крайне не понравившийся мне момент был кусок кода в изменяемом автором /system/core/core.php
PHP:
    public static function loadLanguage($file=false){

        $config = cmsConfig::getInstance();

        $lang_dir = 'system/languages/'. UL_CURENT; // unilang

        if (!$file){

            // Если файл не указан, то подключаем все php-файлы
            // из папки с текущим языком
            return self::getFilesList($lang_dir, '*.php', true, true);

        } else {

            // Если файл указан, то подключаем только его
            $lang_file = $lang_dir .'/'.$file.'.php';
            return self::includeFile($lang_file);

        }
    }
Использование маски для подгружаемых файлов, особенно в совокупности с подставляемыми сторонним разработчиком данными, всегда не оставляет равнодушным и стимулирует желание изучить код дальше.
Дальнейший поиск UL_CURENT привел меня к следующему коду в /system/controllers/activity/model.php который также модифицирует этот программист:
PHP:
$this->select('t.ul_'.UL_CURENT.'_description', 'ul_'.UL_CURENT.'_description'); // unilang
Подстановка полученных из куки данных в SQL-запрос? ОК, надо проверить как происходит этот процесс и это приводит нас к такой строке: /system/core/user.php
PHP:
define('UL_CURENT', cmsUser::getCookie('ul_lang'));
После этого я скачал с оф.сайта текущую версию InstantCMS под номером 2.3 и открыл функцию getCookie()
PHP:
    public static function getCookie($key){
        if (isset($_COOKIE['icms'][$key])){
            return trim($_COOKIE['icms'][$key]);
        } else {
            return false;
        }
    }
Что мы имеем? Не отфильтрованную переменную, и в данном случае для формирования путей с последующим инклюдом *.php. У вас возникли идеи как это можно использовать? Путь, конечно, сложный и не во всех случаях возможен, но.... Дальнейшие фантазии оставляю на ваше усмотрение.
Также, эти же, полученные из непроверенных cookie данные используются в SQL-запросе, вы помните? Остается проверить какой путь проходит он до выполнения. /system/core/database.php
PHP:
	/**
	 * Подготавливает строку перед запросом
	 *
	 * @param string $string
	 * @return string
	 */
	public function escape($string){
		return @$this->mysqli->real_escape_string($string);
	}
Вот и все, что вас отделяет от конечной цели. real_escape_string() безусловно необходима, но только в совокупности с иными методами фильтрации, imho. Для тех, кому кажется, что защита обеспечена, хочу напомнить об иных методах выполнения sql-запросов. Вы понимаете что делает такой параметр в куках? -1; DROP ALL TABLES; -- или, такой \xbf\x27 OR 1=1 /*
Если не понимаете вы, то поймет человек, которому это нужно.
 
Установил его.. Сразу же слетел компонент фрилансерс

Unknown column 'u.is_online' in 'field list'

SELECT i.*, u.avatar as user_avatar, u.nickname as user_nickname, u.karma as user_karma, u.is_online as is_online, u.status_text as statu, DATE_FORMAT( u.date_log, '%d.%m.%Y' ) as date_log, DATE_FORMAT( u.date_reg, '%d.%m.%Y' ) as date_reg, IFNULL(c.name, '') as city_name, IFNULL(c.id, 0) as city_id, COUNT(r.id) as portfolio, uc.name as cname, uu.name as uname
FROM cms_freelancers i
JOIN cms_users as u ON u.id = i.user_id
LEFT JOIN cms_geo_cities as c ON c.id = u.city
LEFT JOIN cms_freelancers_portfoliofile as r ON i.id = r.user_id
LEFT JOIN cms_freelancers_cats as uc ON uc.id = i.cat_id
LEFT JOIN cms_freelancers_uslugi as uu ON uu.id = i.uslugi
WHERE (i.tupe = 'f') AND (i.tupe = 'f')
GROUP BY i.id
ORDER BY u.karma desc
LIMIT 0, 10

Вот такая фигня что делать то(
 
Установил его.. Сразу же слетел компонент фрилансерс
Вот такая фигня...
Вы что установили? Версию движка 2.3.0?
Если вы про нее, то в новости про данную версию сказано:
Убрано поле is_online из таблицы пользователей. Теперь статус пользователя (онлайн или офлайн) нужно получать при помощи метода cmsUser::userIsOnline($user_id), а список пользователей онлайн получать, Для просмотра ссылки Войди или Зарегистрируйся таблицу sessions_online например так:joinInner('sessions_online', 'online', 'i.id = online.user_id')->
Судя по тексту вашей ошибки, именно в этом и проблема. У вас идет обращение к полю is_online
Нужно ждать пока обновят версию вашего компонента фрилансер.
Или сами ищите в файлах экшенов, где идет проверка пользователя на онлай и изменяйте, согласно инструкции.
 
Сорри,может не в тему пишу но создать тему нет прав.Ставил на трёх хостингах,менял,чмоды и все такое но при входе в админку могу редактировать только контент.Настройки сайта ,,моды и все такое отсутствует.Перерыл всю инфу но ответа не нашёл ну а разрабы в танке.
 
Все починил. Все что надо сделать, это добавить поле is_online типа TINYINT в таблицу cms_users.
 
Назад
Сверху