Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Принципы построения CMS (КМС, Система Управления Сайтом).

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6

Открыть новую тему     Написать ответ в эту тему

6epcepk



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Принципы построения CMS.

 
Каждый из нас (читай программистов) рано или поздно сталкивается с препятствиями при построении своей CMS. Теми или иными способами они преодолеваются. Но хорошо когда выбран правильный подход к конкретному случаю, бывает же и так, что приходится идти по неверному пути. (Возможно, реализация с использование данного «неверного пути» будет функционировать и заслуживает места, но зачем тратить лишнее время и лишние нервы?)
 
Для предотвращения скитаний по этим «неправильным путям», на мой взгляд, будет целесообразно все «тонкие» места при построении CMS классифицировать в данной теме.  
 
Модули сайта
 
  • Каталог продукции
     
    Структура системы
    Тут долгий разговор. Есть несколько вариантов.

    Код:
    ./admin
    ./blocks
        ./blocks
        ./modules
        ./recources
        ./sources
        ./index.php
    ./lib
    ./modules
        ./news
        ./catalog
        ./...
    ./resources
        ./html
        ./css
        ./images
    ./sources
        ./classes
        ./js
        ./locale
    ./templates
        ./demo
        ./...
    ./uploads
        ./news
        ./catalog
        ./...
    ./.htaccess
    ./config.inc.php
    ./index.php
    ./robots.txt

     
     
    Загрузка модулей системы
     

    Код:
    if (isset($_REQUEST['module'])) {
           
        require_once "modules/${_REQUEST['module']}/index.php";
           
    }

     
     
    Подключение файлов
     
    В начале скрипта-инициализатора определяется:

    Код:
    define('ROOT', ereg_replace('(^.*)[/\]$', '\1', dirname(__FILE__)));

    Все дальнейшие файлы системы подключаются:

    Код:
    require_once ROOT . '/modules/news.news_list.php';

     
     
    Блокировка доступа к файлам системы
     
    В начале каждого скрипта системы ставим проверку откуда запущен скрипт:

    Код:
    if (!defined('YOUR_SYSTEM_ID')) {
     
        die("Access id denied.");
     
    }

     
    Получаем, что файл нельзя открыть кроме как из скрипта-инициализатора.
     
    Разделение логики от представления
  • Smarty;
  • XTemplates (мой выбор).

    ----------
    comming soon..

  • Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 23:27 20-01-2006 | Исправлено: 6epcepk, 13:34 12-05-2008
    N Sensey N



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    [li] Админка не связаная с пользовательской частью
     
    Я подключаю файлы абсолютными путями...
     
    define('ROOT', ereg_replace('(^.*)[/\]$', '\1', $_SERVER['DOCUMENT_ROOT']));
     
    Почему константа а не переменная? А что бы с любого места мог достать... а не писать каждый раз global $root;
     
    + если где та сморозишь... то переменую можно переопределить (при глобалс он)
    константа же этого не позволит
     
    6epcepk
    if (isset($_REQUEST['module'])) {  
           
        require_once "modules/${_REQUEST['module']}/index.php";  
           
    }
     
    а ты не проверяешь что пришло в $_REQUEST['module'] ?
     
    Я лично делаю массив файлов... и проверяю есть ли такой файл в массиве... если нету - посылаю...

    ----------
    sPaiz-Nuke - Free PHP CMS Web Design and Development Портал для израильтян

    Всего записей: 1409 | Зарегистр. 01-10-2002 | Отправлено: 06:17 21-01-2006
    6epcepk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    define('ROOT', ereg_replace('(^.*)[/\]$', '\1', $_SERVER['DOCUMENT_ROOT']));

     
    Действительно хороший вариант, его наверно и возьму в данный момент на заметку.
     
     

    Цитата:
    а ты не проверяешь что пришло в $_REQUEST['module']

     
    Да, думаю можно еще усовершенствовать:
     

    Код:
     
    if (isset($_REQUEST['module'])) { //  && $_REQUEST['module'] === "catalog"
          
    if (file_exists("modules/${_REQUEST['module']}/index.php")) {
              
     require_once "modules/${_REQUEST['module']}/index.php";
                  
    } else echo "Ошибка. Модуль не существует.";
                
    }

     
    А смысл если такой будет код создавать массив? Если модуль существует, то мы его вызываем, в противном случае выдаем ошибку.
     
    Если даже без проверки на существование, то если кто-то особо умный решит ввести несуществующий модуль, то просто ничего не выведется в основном блоке.

    ----------
    comming soon..

    Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 11:50 21-01-2006
    Brodyaga



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Код:
     
    if (isset($_REQUEST['module'])) { //  && $_REQUEST['module'] === "catalog"  
           
    if (file_exists("modules/${_REQUEST['module']}/index.php")&&is_dir("modules/${_REQUEST['module']}/index.php")) {  
               
     require_once "modules/${_REQUEST['module']}/index.php";  
                   
    } else echo "Ошибка. Модуль не существует.";  
                 
    }  
     

    Без еррор_репортинг(0); может сгенирроваться предупреждение, если не директория.
    Возможно.
     
    Добавлено:
    А по уму наверное будет так:
    if (isset($modules[$_REQUEST['module']])) { //  && $_REQUEST['module'] === "catalog"
    if (file_exists("modules/".$modules[${_REQUEST['module']}]."/index.php")&&is_dir("modules/".$modules[${_REQUEST['module']}]."/index.php")) {
    require_once "modules/".$modules[${_REQUEST['module']}]."/index.php";
    }
    else echo "Ошибка. Модуль не существует.";
    }
     
    где $modules ассоциативный массив типа $modules=array("News"=>"asdsd734q84jds");
    то есть название модуля никак не связано с реальным названием папки.

    ----------
    Damn Metal

    Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 11:55 21-01-2006
    6epcepk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Brodyaga
     
    bool is_dir(string $filename);
     
    Возвращает true, если $filename - каталог.
     
    Смысл это применять к нашему случаю?
     
    А также у меня еррор_репортинг(E_ALL);
     
     

    Цитата:
    где $modules ассоциативный массив типа $modules=array("News"=>"asdsd734q84jds");

     
    А смысл прятать папки? Аргументы:
    1) Мы полностью блокируем доступ к файлам модуля (читай первый пост в самом низу).
    2) Если КМС будет выложена дляпубличного просмотра, то такая консперация теряет всякий смысл.

    ----------
    comming soon..

    Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 12:46 21-01-2006
    Farkhad



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    PS: мне кажется что лучше проверять так
    !empty($_REQUEST['module']) или даже через конкретную GET или POST

    Всего записей: 731 | Зарегистр. 03-08-2001 | Отправлено: 14:13 21-01-2006
    6epcepk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Farkhad
    В чем преимущество?
    Данные и скорость -> isSet()    vs.    empty()

    ----------
    comming soon..

    Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 14:18 21-01-2006 | Исправлено: 6epcepk, 14:19 21-01-2006
    Farkhad



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    6epcepk
    ну а мож кто подсунит такое ?module=%20

    Всего записей: 731 | Зарегистр. 03-08-2001 | Отправлено: 19:18 21-01-2006
    6epcepk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    И что, я же потом проверяю на существования этого файла. В данном случае будет проверяно на существование /modules/%20/index.php и соответственно будет выведено сообщение, что в доступе отказано.

    ----------
    comming soon..

    Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 19:54 21-01-2006
    N Sensey N



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    6epcepk
    а как насчет ../../   ? с абсолютными путями это вроде не проходит... а вот с относительными - можно подлючить луюбой файл...
     
    вот например мой код:
     
     

    Код:
    $mods = array('movies_news', 'movies_details', 'movies_search');
    $act = !empty($_REQUEST['act']) ? $_REQUEST['act'] : 'movies_news';
     
    if (!in_array($act, $mods))
    {
        die('Хацкер... гы гы гы... протэктэд бай spaiz.net<br>Ошибка... ну типа... модуля такого нет... а раз нет - значит не должно быть.. ');
    }
    else
    {
        include_once $act.'.php';
    }
     

     
    Так как ты разработчик: ты заведомо знаешь какие файлы есть а какие нет... не нужны ни какие проверки на существование файлов на сервере и т.д

    ----------
    sPaiz-Nuke - Free PHP CMS Web Design and Development Портал для израильтян

    Всего записей: 1409 | Зарегистр. 01-10-2002 | Отправлено: 22:35 21-01-2006
    6epcepk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Да, с массивами лучший способ.
     
     
    А как вы относитесь если проверять доступ к файлам следующим образом:
     
    1) На главной странице (откуда все подгружается) определяем константу.
    2) В подгружаемом файле делаем проверку установлена ли константа или нет, и если константа не установлена, то при помощи конструкции die() блокируем доступ?

    ----------
    comming soon..

    Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 22:53 21-01-2006
    N Sensey N



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    6epcepk
    я так и делаю.. только это уже относится к запрету прямого доступа к файлу....
     
    в index.php у меня  
     
    define('SPAIZ_CODE', true);
     
    а в подгружаемом файле.. в самом начале:
     
    defined('SPAIZ_CODE') or die('Direct Access to this location is not allowed.');

    ----------
    sPaiz-Nuke - Free PHP CMS Web Design and Development Портал для израильтян

    Всего записей: 1409 | Зарегистр. 01-10-2002 | Отправлено: 23:08 21-01-2006
    6epcepk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    N Sensey N
    Только я сейчас сделал более сложную конструкцию ... в лог-файл у меня еще пишется ДАТА, IP, АДРЕС СТРАНИЦЫ. Потом можно будет по результатам банить (:

    ----------
    comming soon..

    Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 23:21 21-01-2006
    Ternik



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    6epcepk
    да и еще в дополнение темы о паранойе, можно вычислять MD5 файла и заносить его в бд(читай массив), затем сравнивать версию и совместимость.
     
    По поводу модульности КМС, хочу сказать что написание данных КМС так или иначе ведет к образованию брешей. Модульность она в концепции "палка-в-дырку", поэтому чтобы открытых\закрытых дыр не было, лучше писать литые КМС для каждого сайта используя наборы ранее написаных функций и библиотек, и каждый скрипт затачивать.
     
    Писать КМС "для всех", имхо не логично, такие уже есть, тотже php-nuke, его разрабатывает не один человек, а целое комьюнити програмеров и тестеров и все равно он остается дырявым.
     
    возможно я сказал что-то не то, но вы уж меня извините и поправьте.

    Всего записей: 763 | Зарегистр. 25-09-2002 | Отправлено: 07:26 22-01-2006
    Brodyaga



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    Писать КМС "для всех", имхо не логично, такие уже есть, тотже php-nuke, его разрабатывает не один человек, а целое комьюнити програмеров и тестеров и все равно он остается дырявым.    возможно я сказал что-то не то, но вы уж меня извините и поправьте.

    Усе правильно...
    ДА и тем более концепция аля ПХП-нюк вряд ли долго протянет...
    modules.php?module=News это потенциальная дыра, и не могут с ней ничего поделать никто.Именно такие CMS ломают на так.
    ДУмаю пришла эра фиксированных CMS под каждую тематику, наращиваемых.
    По типу PHP-Fusion где отдельный файл под отдельные нужды, и сайт так не зависит от $QUERY_STRING
    хотя я могу и ошибаться.

    ----------
    Damn Metal

    Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 10:46 22-01-2006
    6epcepk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Ternik
     
    В твоем сообщении есть противоречие.
     
    Во-первых, можешь привести какие возникают проблемы с безопасностью при написании модульной CMS? (Без иронии, мне действительно интересно.)
     
    И самое главное: ты пишешь, что необходимо создавать CMS для каждого проекта индивидуально. Полностью с тобой согласен, но может же придти такое время, что захочется тебе продовать свою CMS в виде движка, но это не главное. Вернемся к движкам, привязанным к конкретному проекту. Так вот когда ты пишешь CMS под отдельный проект, то в чем сложность брать отдельные модули и затачивать, при необходимости, их под нужны этого проекта? Зачем же заново писать модуль (да даже с использованием уже готовых кусков кода)? А если страдает безопасность (я надеюсь услышать как она страдает от "модулей"), то написание проекта индивидуально под нужды заказчика исключает в бОльшей вероятности обнаружения этих "дыр" (пока невидимых) злоумышлинниками.
     
    Brodyaga
    PHP-Nuke это отдельная история (: Вот одна из последних уязвимостей (:

    ----------
    comming soon..

    Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 12:13 22-01-2006
    Ternik



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    6epcepk
    Я если честно не совсем понял про противоречие, но постараюсь объясниться подробнее.
     

    Цитата:
     Во-первых, можешь привести какие возникают проблемы с безопасностью при написании модульной CMS?

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

    Цитата:
    что захочется тебе продовать свою CMS в виде движка

    И идти по стопам билли гейтса пытаясь угодить всем и в результате обламывать всех? Нет, такая идея меня посещала но я к счастью от нее отказался. Не отспупая от темы о деньгах скажу тебе следующее: пока есть баги есть хакеры, пока есть работа есть веб-программеры. Полностью автоматизировать процесс веб-разработок не удасться. Существует огромное количество стабильных классов, собственных библиотек, которые сводят написание... ну например скрипта новостей в висивиг редактором, к 50-100 строкам кода. А это уж я думаю не составит особого труда проставить нужные if\else и написать запросы к БД. Я не привлекаю писать каждый раз заново модуль, я призываю отказаться от модульной структуры. Все дело в том, что разрабатывая каждый скрипт под каждого заказчика ты имеешь возможность продумать безопасность для каждого конкретного случая, а все повторения вынести в библиотеку функций, которую ты в последствии будешь использовать для написания новых скриптов.
     
    Вот php-nuke "верх" развития модульных КМС, ты незаметил что ни один из коммерческих проектов их не использует. Почему? А ты сам ответил на свой вопрос:

    Цитата:
    Вот одна из последних уязвимостей

     
     
     
    Добавлено:
    6epcepk
    хотелось бы дополнить почему именно PHP-nuke, потому что это самая популярная КМС, я думаю что в другой любой багов ничуть не меньше, просто интерес публики и хакеров к ним меньше, а значит а багтрак короче.
     
    и вообще все это имхо, и я могу быть асболютно не прав.

    Всего записей: 763 | Зарегистр. 25-09-2002 | Отправлено: 13:21 22-01-2006 | Исправлено: Ternik, 13:32 22-01-2006
    6epcepk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Давай теперь рассмотрим модульное построение индуктивно.
     
    Да, согласен: каждый модуль хранит внутреннюю информцию лишь о себе.  
    На мой взгляд, существует два "узких" места безопасности при работе модульной системы: подключение модуля и защитные элементы самого модуля (sql-запросы, обработка входных данных и т.п. это само собой).
     
    Про подключение модулей мы разобрались: массив с модулем, потом проверка на существование запрашиваемого модуля.
     
    Про защиту самого модуля мы тоже разобрались: определяется константа на странице вызова модуля и в каждом компоненте модуля идет проверка на существование в процессе данной константы.
     
    Какие еще могут быть "узкие места" безопасности?
     

    Цитата:
    При внесения изменений в один из скриптов может возникнуть потенциальная опасность взлома

     
    Я наверно не правильно понял, но это же относится к любому способу построение системы ...


    ----------
    comming soon..

    Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 14:43 22-01-2006
    N Sensey N



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ternik
    Brodyaga
    бред какой то
     
    Если пишешь нормально модули - то ни каких взломов не будет...
    Че ты на нюку смотришь? Она плохая не из за модульности... а тем что программеры работают на функциональность....
     
    Про безопасность и нагрузку сервера они и не вспоминали....
     
    Это самый стандартный способ написания кмсок...
     
    Щас каждый второй пишет - нюка гавно... и т.д... хотя ни один из ниах не знает что закрытие этих дырок сводится к добавлению функции addslashes  и htmlspecialchars
     
    Дальше продолжать не буду... от темы отклоняемся...
     
    Не важно какой способ ты выбираешь.. важно какой код ты пишешь...
    ------------------
    Нужно иметь какой то стандартный набор функций.... ядро ...  
    А уже потом подстраивать все под нужный проэкт...

    ----------
    sPaiz-Nuke - Free PHP CMS Web Design and Development Портал для израильтян

    Всего записей: 1409 | Зарегистр. 01-10-2002 | Отправлено: 20:03 22-01-2006
    Ternik



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    бред какой то  

    бред так бред, действительно оффтоп.

    Всего записей: 763 | Зарегистр. 25-09-2002 | Отправлено: 02:50 23-01-2006
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6

    Компьютерный форум Ru.Board » Интернет » Web-программирование » Принципы построения CMS (КМС, Система Управления Сайтом).


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru