Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модульная структура и include 
:(
    Опции темы
awers
  Дата 5.1.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



Добрый вечер. 

При написании движка возникла необходимость ограничения выполнения модулями функций include, include_once, require, ...  Как это возможно осуществить? php4/5 

Благодарю, Аадм.
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 5.1.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(awers @  5.1.2007,  18:06 Найти цитируемый пост)
Как это возможно осуществить?

Написание программного кода.

Неужели сложно было в поиск вбить "модульность".

http://forum.vingrad.ru/topic-116824.html
http://forum.vingrad.ru/topic-49182.html
http://forum.vingrad.ru/topic-51073.html
http://forum.vingrad.ru/topic-15231.html

Что касается запрета. Необходимо знать КАК устроена ваша модульная структура.

Это сообщение отредактировал(а) Mal Hack - 6.1.2007, 14:40
PM ICQ   Вверх
awers
Дата 6.1.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



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

теперь объясню для чего все это надо:
в обычных движках все сделано так, что "ядро" вызывает нужный ему модуль и отдает управление ему. т.е. по сути ядру пофиг что дальше делает модуль. 
я же, хочу ограничить обособленности модулей относительно ядра. ресурсами должно заведовать именно ядро, соответственно решать имеет ли право модуль с текущим уровнем доступа получить доступ к тому или иному ресурсу движка. то-же касается SQL запросов, но с ними проще (EXPLAIN QUERY), берем используемые модулем в запросе таблицы и решаем, можно ли ему туда писать/читать или вообще знать о них. а вот в случае с файлами - сложнее. что-бы для обхождения защиты модуль не мог сделать нечто типа 
Код

include ('mysql.sql.class.inc');
$SQL = new SQL();
$SQL->query ...


Вот в чем вопрос. Надеюсь на этот раз правильно сформулировал.

Да, туда же всякие mkdir, dir() ... Надо ограничить хотя-бы частично, если возможно. 

Это сообщение отредактировал(а) awers - 6.1.2007, 15:58
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 6.1.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Решение в создании перегрузке операций, т.к. делаем верхнюю надстройку в ядре. Т.е.
В ядре делаем метод my_mkdir() и в нем в зависимости от условий разрешаем или нет выполнение функции, при этом в модуле делаем вызов my_mkdir.
PM ICQ   Вверх
awers
Дата 6.1.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



но дело в том что:
1) человек в модуле может просто написать include а не myinclude
2) при 
Код

function myinclude($file){
// если есть доступ
include $file;
}


то что мы инклюдим не получает пространство переменных и наоборот.
к примеру взять так:
0001.php
Код

$i = 1;
function load(){
include '0002.php';
}
echo $d;
load();


0002.php
Код

echo $i;
$d = 5;


Мы получим ошибки что $d,$i не существуют. Т.Е. при инклюде из функции, "адресное пространство" ограничивается пределами функции.

Добавлено @ 17:23 
"Для чего мне все это?" - спросите Вы?
все очень просто. после установки Пользователем экземпляра моего движка, у пользователя может возникнуть необходимость установки модулей, в том числе и сторонних! я в свою очередь хочу гарантировать (хотя бы частично) Пользователю безопасность. Даже если сторонний модуль содержит вредоносный код - он не должен суметь его выполнить. 
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 6.1.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



awers, от этого  ничего не спасет, т.к. php не предоставляет перегрузки операторов и функций.
PM ICQ   Вверх
awers
Дата 6.1.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



Т.е. единственный выход - модифицировать и рекомпилить сам php?
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 6.1.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



awers, это изврат, на самом деле...
PM ICQ   Вверх
AntonioBanderaz
Дата 8.1.2007, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 18



Могу посоветовать, может я и не прав, но вроде логичнее сделать некую абстракцию, тоесть создать базовый для всех модулей класс, например CMSModule
Код

class CMSModule {
      // Здесь определяются необходимые для всех модулей переменные etc
      // Например ссылки на абстракцию к БД
      
}

/* 
 * Каждый модуль например GBook, 
 * Должен находится, например в папке /modules/GBook/mod_include.php
 * И описываться классом GBook
 */

class GBook extends CMSModule {
      /*
       * Some shit code of module GBook
       */
}

/* 
 * Класс загрузки модулей очень простой
 */
class cfModuler {
    private $def_path       = 'modules';
    private $def_mod_index = 'mod_include.php';
    
    private $module2load   = '';
    private $loadedModule  = array();
    private $loadedModuleName  = array();
    
    private $MODULES_TABLE = 'cfmodules';
    
    public function loadModule($module_name) {
        $this->module2load = $module_name;
        $this->_loadModule();
    }
    
    private function _loadModule() {
                // Проверка, доступен ли модуль или админ его вырубил
        $GLOBALS['cfClasses']['DB']->query('SELECT A.`cfModulePath` FROM `'.$MODULES_TABLE.'` A WHERE A.`isActiveModule` = \'YES\' AND A.`cfModuleName` = \''.$this->module2load."'");
                // Если да, то
        if($GLOBALS['cfClasses']['DB']->numRows() == 1) {
            $file = $GLOBALS['cfClasses']['DB']->fetchAssoc();
            $file = $file['cfModulePath'].$this->def_mod_index;
            if(!in_array($this->module2load,$this->loadedModuleName)) {
                require_once($file);
                $this->loadedModule[$this->module2load] =& new $this->module2load();
                $this->loadedModuleName[] = $this->module2load;
                $GLOBALS['cfClasses']['Log']->actionLog('Успешно загружен модуль '.$this->module2load);
            } else {
                $GLOBALS['cfClasses']['Log']->errorLog('Попытка повторной загрузки модуля '.$this->module2load);
                throw new Exception('Попытка повторной загрузки модуля '.$this->module2load);
            }
        } else {
            $GLOBALS['cfClasses']['Log']->errorLog('Модуль '.$this->module2load.' не существует, либо закрыт доступ.');
            throw new Exception('Модуль '.$this->module2load.' не существует, либо закрыт доступ.');
        }
    }
}


Только необходимо определить загрузщик базовых классов твоей CMS
например 
файл configure.class.php
Код

<?php

require_once('db.class.inc.php');
require_once('mail.class.inc.php');
require_once('users.class.inc.php');
require_once('group.class.inc.php');
require_once('moduler.class.inc.php');
require_once('template.class.inc.php');
require_once('log.class.inc.php');

$GLOBALS['time'] = microtime();

class core {
    
    function core() {
        session_name();
        session_start();
        $this->configure();
        $this->get_work_class();
    }
    
    function configure() {
        if(!isset($_SESSION['USER']['LOGIN'])) $_SESSION['USER']['LOGINED'] = false;

        $_SESSION['conf']['db_host'] = 'localhost';
        $_SESSION['conf']['db_user'] = 'toxa_toxa';
        $_SESSION['conf']['db_password'] = "fetdiedm";
        $_SESSION['conf']['db_database'] = 'test';
        
        $_SESSION['conf']['ADMIN_MAIL'] = 'admin@localhost';
        $_SESSION['conf']['REAL_ADMIN_MAIL'] = 'admin@localhost';
        $_SESSION['conf']['SITEADDR'] = 'http://localhost/';
        $_SESSION['conf']['SITENAME'] = 'localhost';

        $_SESSION['conf']['DIR'] = '/usr/home/cfCMS/public_html/rus/profiles';
        
        $_SESSION['conf']['ADMIN_PATH'] = 'admin';
    }
    function get_work_class() {
        $GLOBALS['lib']['DB'] =& new cfDBAdapter($_SESSION['conf']['db_host'], 
                                       $_SESSION['conf']['db_user'], 
                                       $_SESSION['conf']['db_password'], 
                                       $_SESSION['conf']['db_database'], 
                                       false);
        $GLOBALS['cfClasses']['MAIL'] =& new cfMail();
        $GLOBALS['cfClasses']['MODULER'] =& new cfModuler ();
        $GLOBALS['cfClasses']['USER'] =& new cfUser();
        $GLOBALS['cfClasses']['GROUP'] =& new  cfGroup();
        $GLOBALS['cfClasses']['TEMPLATE'] =& new cfTemplate('./templates');
                $GLOBALS['cfClasses']['LOG'] =& new cfLog('../log', '.log', 555);
    }
}
$core = new core();
?>


Это сообщение отредактировал(а) AntonioBanderaz - 8.1.2007, 02:41


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Mal Hack
Дата 8.1.2007, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Об этом я писал выше. Автор имел ввиду, тот случай, когда программист делая модуль сам может написать include()
PM ICQ   Вверх
AntonioBanderaz
Дата 8.1.2007, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 18



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

По поводу проверки доступа для инклуда в модуле, это ты хоть аб стену расшибись не сделаешь если чел знает полный путь к файлу... Но если у тебя в CMS чисто объектный подход, то в 5-ке есть одна шняжка которая может помочь.
В php5 есть такая штука, как __autoload это функция вызывается при создании экземпляра класса, объявление которого отсутствует.
тоесть ты можешь только положиться на честность проггеров, которые будут писать модули, сделай типо предписание, что файлы надо назвать определённым образом, класть в определённые папки, и не использовать include в модулях... Описание функции __autoload http://www.php.net/__autoload



--------------------
ГЫ... 
PM MAIL ICQ   Вверх
AztEK
Дата 8.1.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: нет
Всего: 18



Есть ещё один вариант, если автору так хочется ограницить действия include (хотя это очень идеализированная архитектура). К примеру, при подключении модуля, ядро сохраняет его уровень доступа таким образом, чтобы никто кроме его самого (ядра) не мог его изменить, но все могли считать. Чтобы не возникало redeclair, наверное лучше использовать не константы а private-свойства объекта-ядра (это уже php5). А в каждом файле ресурсов перед выполнением стоял бы код, который проверяет текущий уровень доступа и соотвественно возможность исполнится.


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
Sardar
Дата 8.1.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



awers, а не проще ли сделать глобальный PermissionManager::hasPermission("news.write.delete"), который проверяет привилегии текущего пользователя. В примере привилегия удалять новость (модуль "новости", тип "изменение", конкретное действие "удалить").

Ну а менеджер привилегий уже разбираеться с грантами типа news.write.* - доступно всё на запись, news.admin.* - доступны настройки модуля и т.д. ИМХО более здравая идея. Все привилегии должны обьявляться в системе, что бы из админовки ты мог видеть их/раздавать гранты.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Mal Hack
Дата 8.1.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(AntonioBanderaz @  8.1.2007,  03:15 Найти цитируемый пост)
По поводу проверки доступа для инклуда в модуле, это ты хоть аб стену расшибись не сделаешь если чел знает полный путь к файлу... 

Речь как раз и об этом.

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


PM ICQ   Вверх
Eugene_Bond
Дата 9.1.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 3.9.2006

Репутация: 1
Всего: 4



Ну как полумера -- получать список http://php.net/get_included_files перед включением модуля и сравнивать со списком полученным после включения. Если добавилось лишнее -- бан. Это не спасает от первого вызова, не спасает от выхода из модуля без возврата в контроллер (хотя тут тоже можно попробовать поймать такие модули).

Равно, как и запрет инклюдов чтобы избежать подобного кода:
Код

include ('mysql.sql.class.inc');
$SQL = new SQL();
$SQL->query ...

не спасет от аналога без инклюда типа:
Код

class SQL {
..
}
$SQL = new SQL();
$SQL->query ...

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0975 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.