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

03-07-26 14:48

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


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

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

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

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

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

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

  1. Полное разделение логики и представления. В Seditio PHP-код полностью отделен от HTML/CSS разметки. Шаблоны реализуются на основе файлов .tpl (шаблонизатор XTemplate SE), в которых используются специальные теги-плейсхолдеры (например, {PHP.cfg.mainurl} или {PAGE_TITLE}). Это позволяет веб-дизайнерам верстать интерфейс без необходимости написания PHP-кода.
  2. Высокая скорость работы и низкая нагрузка. Ядро системы оптимизировано для работы с минимальным количеством SQL-запросов. Встроенная система кэширования снижает нагрузку на базу данных.
  3. Модульность. Архитектура построена на четком разделении ядра, подключаемых функциональных модулей (Modules) и расширений-плагинов (Plugins).
  4. Безопасность «из коробки». Система жестко фильтрует все входящие данные, имеет встроенные механизмы защиты от CSRF/XSS атак и гибкую подсистему контроля доступа пользователей (ACL).
  5. 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 требуется следующее программное окружение:

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

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

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

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

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

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

1. Ядро (Core)

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

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

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

2. Модули (Modules)

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

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

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

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

Плагины предназначены для расширения функционала ядра или модулей без модификации их исходного кода. В Seditio реализована гибкая система плагинов, разделяющая их на два основных типа по способу вызова: событийные (на хуках) и автономные (standalone/direct).

Событийные плагины (хуки)

Взаимодействие с ядром происходит через систему событийных меток — хуков (hooks):

  • В ключевых местах кода ядра и модулей добавлены вызовы функции sed_getextplugins() (файл /system/functions.php).
  • При установке плагина в базе данных регистрируется соответствие его файлов определенным хукам (например, header.first, footer.main, index.main).
  • При наступлении события (вызове хука) ядро подключает соответствующий PHP-файл плагина через include (например, в /system/header.php).
  • Поскольку файл плагина подключается напрямую, он выполняется в той же области видимости, что и вызывающий скрипт, и имеет прямой доступ ко всем глобальным переменным ядра, массивам конфигурации и переменным шаблонизатора.

Автономные плагины (Standalone)

Некоторые плагины представляют собой самостоятельные функциональные страницы или сервисы (например, форма контактов, карта сайта, AJAX-обработчики). Они вызываются через единый системный контроллер /system/core/plug/plug.php (точка входа index.php?r=plug) и работают в одном из следующих режимов:

  1. standalone (параметр e, например, index.php?r=plug&e=contact): плагин загружается как полноценная самостоятельная страница. Ядро Seditio автоматически подключает системную шапку (header.php), обрабатывает TPL-шаблон плагина (находящийся в папке плагина или темы оформления), выводит тело страницы и в конце подключает подвал (footer.php).
  2. direct (параметр e, если плагин зарегистрирован на хук direct): плагин вызывается напрямую и берет управление на себя. Ядро не подключает шапку и подвал темы. Режим используется для генерации XML/RSS лент, скачивания файлов, отдачи картинок или капчи.
  3. popup (параметр o, например, index.php?r=plug&o=smilies): плагин рендерится в специальном упрощенном шаблоне всплывающего окна (используется для выбора смайлов, BB-кодов и т.д.).
  4. ajax (параметр ajx, например, index.php?r=plug&ajx=plugin_name): плагин отрабатывает в фоновом режиме, возвращая чистые данные (JSON или фрагмент HTML) для AJAX-запроса, без загрузки интерфейса сайта.

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. Безопасная фильтрация данных (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 без фильтрации (используется только для администраторов).

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.

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

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

Как это устроено простыми словами:

  1. Права привязаны к группам, а не к людям. Права на чтение, создание или модерирование контента настраиваются для групп пользователей (например, «Гости», «Зарегистрированные», «Модераторы»). Каждый пользователь наследует права тех групп, в которых он состоит. Если пользователь состоит в нескольких группах одновременно, его права складываются (объединяются).

  2. Адресация прав: Область (Area) и Ресурс (Option). Проверка прав всегда запрашивается для конкретной зоны сайта:

    • Область (area) — это крупный раздел или модуль (например, page — страницы, forums — форум, admin — админка, plug — плагины).
    • Ресурс (option) — уточняющая деталь. Для страниц page это код категории (например, news или articles). Для форумов forums это ID конкретной ветки форума.
  3. Битовая маска — все права в одной цифре. Вместо того чтобы хранить в базе данных десятки полей с галочками «разрешено/запрещено» для каждого действия, Seditio кодирует права степенями двойки. Каждому праву соответствует свой «бит» (число):

    • R (Read / Чтение) = 1
    • W (Write / Создание и редактирование) = 2
    • A (Admin / Управление разделом) = 128
    • Кастомные права (используются плагинами и модулями для специфических действий вроде скачивания файлов или комментирования):
      • 1 = 4
      • 2 = 8
      • 3 = 16
      • 4 = 32
      • 5 = 64

    Пример: Если группе разрешено читать тему (R = 1) и оставлять сообщения (W = 2), то в базе данных её права запишутся как число 3 (1 + 2). Если модераторам дополнительно разрешено кастомное действие под номером 2 (модерирование, 8), то их права запишутся как 11 (1 + 2 + 8).

  4. Как система объединяет права пользователя. Если пользователь состоит в группе «Зарегистрированные» (права 3 на новости) и в группе «Модераторы» (права 11 на новости), ядро Seditio объединяет их побитовым сложением «ИЛИ» (|): 3 | 11 = 11 (в двоичном виде: 00000011 ИЛИ 00001011 = 00001011). Пользователь получает полный набор прав обеих групп.

  5. Проверка прав в коде PHP. Для проверки прав разработчики используют функцию sed_auth() (файл /system/functions.php).

    Пример использования:

    // Проверяем, имеет ли право текущий пользователь писать (W = 2) в категорию страниц 'news'
    if (!sed_auth('page', 'news', 'W')) {
        // Если битовая маска прав пользователя не содержит двойку, прерываем выполнение с ошибкой
        sed_diefatal('Доступ запрещен. У вас нет прав на публикацию в этом разделе.');
    }
    

    Если проверяется администратор сайта, у которого есть право A (Admin = 128) в глобальной области admin, функция автоматически разрешает любое действие, избавляя разработчиков от написания лишних условий.

Ratings:
(0.00)

No comments yet