Глава 1. Введение и архитектура системы

03-07-26 14:48

В этой главе рассматриваются базовые понятия Seditio CMS, история её создания и развития, системные требования, архитектура, файловая структура движка, а также встроенные механизмы обеспечения безопасности.


1.1. Определение Seditio CMS, область применения и ключевые особенности

Seditio — это легковесная, быстрая и гибкая модульная система управления контентом (CMS) и платформа для веб-разработки (CMF), написанная на языке PHP и использующая СУБД MySQL.

1.1.1. Область применения

Благодаря высокой производительности, минималистичному ядру и гибкой системе шаблонов, Seditio отлично подходит для разработки:

  • Информационных и новостных порталов среднего и крупного масштаба.
  • Тематических сообществ с интегрированными форумами.
  • Корпоративных сайтов и сайтов-визиток.
  • Блогов, портфолио и личных страниц.
  • Веб-ресурсов с нестандартной структурой данных (благодаря возможностям CMF).

1.1.2. Ключевые особенности

  1. Полное разделение логики и представления. В Seditio PHP-код полностью отделен от HTML/CSS разметки. Шаблоны реализуются на основе файлов .tpl (шаблонизатор XTemplate SE), в которых используются специальные теги-плейсхолдеры (например, {PHP.cfg.mainurl} или {PAGE_TITLE}). Это позволяет веб-дизайнерам верстать интерфейс без необходимости написания PHP-кода.
  2. Процедурная архитектура (Процедурное ядро). Seditio CMS является одной из немногих современных активно поддерживаемых систем, сохраняющих эффективную процедурную архитектуру кода. Вместо тяжеловесных каскадов ООП-абстракций, паттернов проектирования, фабрик классов и контейнеров внедрения зависимостей (DI), ядро Seditio построено на наборе плоских, последовательных функций. Это обеспечивает:
    • Низкий порог входа: Разработчику достаточно базового понимания процедурного программирования на PHP и глобальных областей видимости для создания полноценных модулей и плагинов.
    • Экстремальное быстродействие: Вызов процедурных функций и прямой доступ к глобальным структурам данных ($cfg, $usr, $L, $db_*) выполняются значительно быстрее инициализации объектного графа ООП-фреймворков. Seditio генерирует страницы за единицы миллисекунд и потребляет минимум оперативной памяти (в пределах 2–4 МБ на хит).
    • Простоту отладки и прозрачность: Трассировка выполнения кода прямолинейна, что минимизирует время поиска ошибок и упрощает технический аудит кодовой базы.
  3. Высокая скорость работы и низкая нагрузка. Ядро системы оптимизировано для работы с минимальным количеством SQL-запросов. Встроенная система кэширования и автозагрузки данных снижает нагрузку на базу данных.
  4. Модульность. Архитектура построена на четком разделении ядра, подключаемых функциональных модулей (Modules) и расширений-плагинов (Plugins).
  5. Безопасность «из коробки». Система жестко фильтрует все входящие данные, имеет встроенные механизмы защиты от CSRF/XSS атак и гибкую подсистему контроля доступа пользователей (ACL).
  6. SEO-ориентированность. Поддержка ЧПУ (SEF URLs) с настраиваемыми правилами перезаписи URL и встроенные средства управления мета-тегами.

1.2. Краткая история создания и развития Seditio

История Seditio насчитывает более двух десятилетий и включает несколько ключевых этапов развития:

  • Эпоха LDU (2001–2006 гг.): Движок зародился в 2001 году под названием Land Down Under (LDU). Его автором стал французский программист Оливье Шапуи (компания Neocrome). Простая, быстрая и безопасная система на PHP/MySQL быстро набрала популярность, особенно в геймерском сообществе, где её использовали для создания игровых порталов.
  • Переход к Seditio и появление Cotonti (2006–2009 гг.): В 2006 году LDU пережил ребрендинг и глубокую переработку архитектуры, получив название Seditio (Land Down Under Second Edition). Основной акцент был сделан на улучшение поддержки плагинов. В 2008 году Neocrome приостановила выпуск версий, и часть команды с официального согласия автора создала форк — Cotonti (выпущен в 2009 г.), который стал развиваться параллельно как полностью открытый проект.
  • Завершение авторского этапа (2011–2012 гг.): В 2011 году Оливье Шапуи объявил о закрытии проектов LDU и Seditio на версии 150. Попытка возобновить разработку в 2012 году выпуском версии 160 не увенчалась успехом из-за найденных уязвимостей в безопасности.
  • Современный этап (с 2012 г. по настоящее время): В 2012 году российские разработчики Александр Тишов (Amro) и Антон Сазанов (Antony) получили официальное разрешение от Оливье Шапуи на продолжение развития и сопровождение движка Seditio. Основной вклад в дальнейшую разработку системы и написание всего её кода вносит Александр Тишов (Amro). Значительный вклад в развитие проекта также внесло турецкое сообщество разработчиков. Проект был переведен на модель открытого ПО под лицензией BSD и прошел путь версий от 171 до стабильной 185. Система непрерывно совершенствуется под задачи современных коммерческих и общественных проектов, сохраняя ориентир на простоту, скорость и безопасность.

1.3. Системные требования и окружение

Для развертывания и корректной работы Seditio CMS требуется следующее программное окружение:

1.3.1. Минимальные системные требования

  • Веб-сервер: Apache 2.x (с модулем mod_rewrite для поддержки ЧПУ) или Nginx (с настроенными правилами rewrite).
  • PHP: Версия 5.6.0 или выше (включая полную совместимость с ветками PHP 7.x и PHP 8.x).
  • СУБД: MySQL 5.0.7 или выше / MariaDB (с поддержкой расширения mysqli).

1.3.2. Обязательные расширения PHP

  • GD — требуется для генерации миниатюр, обработки аватаров, галереи изображений и капчи.
  • Hash — используется для генерации безопасных токенов и хеширования паролей.
  • Mbstring — необходимо для корректной работы с многобайтовыми кодировками (UTF-8) в строковых функциях ядра.
  • mysqli — драйвер для взаимодействия с базой данных MySQL.
  • PCRE — библиотека регулярных выражений для маршрутизации и валидации данных.
  • Sessions — поддержка сессий PHP для авторизации пользователей.

1.4. Общая архитектура: Core, Modules, Plugins

Архитектурно Seditio разделена на три основных слоя: Ядро (Core), Модули (Modules) и Плагины (Plugins). Эта трехуровневая модель обеспечивает баланс между высокой производительностью базовой системы, функциональностью ключевых разделов сайта и гибкостью расширения возможностей движка без вмешательства в его исходный код.

1.4.1. Ядро (Core)

Ядро Seditio обеспечивает базовую жизнедеятельность системы:

  • Инициализация окружения, конфигурации и локализации.
  • Управление сессиями и аутентификация пользователей.
  • Механизм разграничения прав доступа (ACL).
  • Работа с базой данных через обёртку mysqli.
  • Шаблонизатор (XTemplate SE) для рендеринга страниц.
  • Роутинг запросов и обработка ЧПУ.

Основные системные библиотеки ядра сосредоточены в каталоге system/.

1.4.2. Модули (Modules)

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

  • page — управление страницами и категориями контента.
  • forums — полноценный форум.
  • users — личные кабинеты, профили, группы и регистрация.
  • pfs — персональная файловая система (загрузка файлов, менеджер медиа).

Каждый модуль располагается в собственной директории внутри /modules/ и подключается через точку входа index.php?module=имя_модуля.

1.4.3. Плагины (Plugins)

Плагины предназначены для расширения функционала ядра или модулей без модификации их исходного кода. В Seditio реализована гибкая система плагинов:

  • Событийные плагины (на хуках): подключаются в местах вызова функции sed_getextplugins() в коде ядра. Они выполняются в контексте вызывающего скрипта и имеют доступ к его переменным.
  • Автономные плагины (Standalone/Direct): работают как самостоятельные страницы через фронт-контроллер /plug (или index.php?module=plug).

Подробное руководство по созданию, структуре, регистрации хуков и режимам вызова плагинов приведено в Главе 7. Архитектура и разработка плагинов.


1.5. Файловая структура движка

Корневой каталог Seditio содержит следующие основные директории и файлы:

  • /datas/ — папка для изменяемых динамических данных. Сюда загружаются аватары, фотографии галереи, файлы пользователей (datas/users), а также здесь хранится конфигурационный файл datas/config.php и кэш системы (datas/cache/). Эта папка должна иметь права на запись (CHMOD 777 или 775).
  • /modules/ — содержит подпапки со встроенными и установленными модулями (например, /modules/page/, /modules/forums/).
  • /plugins/ — содержит подпапки со всеми плагинами (например, /plugins/comments/, /plugins/ckeditor/).
  • /skins/ — темы оформления сайта. Каждая тема содержит файлы шаблонов с расширением .tpl, изображения, скрипты и стили.
  • /system/ — ядро системы:
    • /system/common.php — главный конфигурационный и инициализационный скрипт. Подключает БД, загружает настройки, сессии и права доступа.
    • /system/functions.php — основной набор глобальных функций API Seditio (включая работу с пользователями, строками, ЧПУ).
    • /system/functions.admin.php — вспомогательные функции для административной панели (управление структурой, правами доступа, логированием, рендеринг списков).
    • /system/functions.image.php — функции обработки изображений (ресайз, создание миниатюр, водяные знаки, кроп).
    • /system/templates.php — класс и вспомогательные функции шаблонизатора XTemplate SE (парсер TPL-файлов).
    • /system/database.mysqli.php — модуль взаимодействия с базой данных MySQL (обёртка mysqli).
    • /system/config.urlrewrite.php — глобальная конфигурация правил перезаписи ЧПУ (SEF URL).
    • /system/config.urltranslation.php — правила трансляции/транслитерации параметров и символов при генерации URL.
    • /system/core/ — базовые контроллеры ядра (например, /system/core/admin/ для панели управления, /system/core/plug/ для обработки плагинов).
    • /system/lang/ — файлы локализации системы на разных языках.
  • /index.php — главный входной файл. Парсит входящий URI, сопоставляет его с правилами ЧПУ и подключает нужный модуль или скрипт ядра.
  • /.htaccess — файл конфигурации Apache, содержащий правила перенаправления запросов на index.php для работы ЧПУ.

1.6. Безопасность системы: фильтрация данных, токены защиты и уровни доступа

Безопасность Seditio строится на трех фундаментальных принципах:

1.6.1. Безопасная фильтрация данных (Input Filtering)

В коде Seditio запрещено напрямую обращаться к суперглобальным массивам $_GET, $_POST или $_COOKIE для получения параметров. Все входящие данные импортируются и очищаются через функцию sed_import() (файл /system/functions.php):

$id = sed_import('id', 'G', 'INT');
$text = sed_import('rtext', 'P', 'TXT');

Основные типы фильтрации:

  • INT / NUM — приведение к целому или вещественному числу.
  • TXT — очистка текста, экранирование HTML-тегов (htmlspecialchars).
  • SLU — Slug-формат (только буквы, цифры, дефис, подчёркивание).
  • ALP — только латинские буквы и цифры.
  • HTM — HTML-код, пропущенный через фильтр плагинов (например, Jevix для защиты от XSS).
  • HTR — доверенный HTML без фильтрации (используется только для администраторов).

1.6.2. Защита от CSRF-атак (Cross-Site Request Forgery)

Для защиты от подделки запросов Seditio использует уникальные защитные токены безопасности, привязанные к сессии пользователя.

  • Токен генерируется функцией sed_sourcekey() (файл /system/functions.php).
  • В GET-запросах, изменяющих состояние системы (например, удаление страницы, очистка кэша), передается параметр x (например, &x=abc123xyz). Проверка осуществляется вызовом sed_check_xg() (файл /system/functions.php).
  • В POST-формах передается скрытое поле x. Проверка осуществляется функцией sed_check_xp() (файл /system/functions.php). Для AJAX-запросов поддерживается передача токена в HTTP-заголовке X-Seditio-CSRF.

1.6.3. Разграничение прав доступа (ACL — Access Control List)

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

Ключевые принципы:

  • Групповое наследование: Права настраиваются для групп пользователей (например, «Гости», «Зарегистрированные», «Модераторы»). Каждый пользователь наследует права тех групп, в которых он состоит. Если пользователь состоит в нескольких группах, его права объединяются побитовым сложением «ИЛИ» (|).
  • Адресация прав: Права проверяются для конкретной области (area — например, page, forums, admin) и ресурса (option — код категории страниц или ID ветки форума).
  • Битовые маски прав: Каждое разрешение кодируется степенью двойки: Read (Чтение) = 1, Write (Запись) = 2, Admin (Администрирование) = 128, плюс 5 пользовательских битов (4, 8, 16, 32, 64) для кастомных нужд модулей и плагинов.

Для детального изучения устройства системы разграничения прав доступа, структуры таблиц в базе данных, кэширования прав в поле user_auth и процесса проверки авторизации в PHP-коде обратитесь к Главе 4. Система пользователей и разграничение прав (ACL).

Оценка:
(0.00)

Пока комментариев нет