В этой главе рассматриваются базовые понятия Seditio CMS, история её создания и развития, системные требования, архитектура, файловая структура движка, а также встроенные механизмы обеспечения безопасности.
1.1. Определение Seditio CMS, область применения и ключевые особенности
Seditio — это легковесная, быстрая и гибкая модульная система управления контентом (CMS) и платформа для веб-разработки (CMF), написанная на языке PHP и использующая СУБД MySQL.
Область применения
Благодаря высокой производительности, минималистичному ядру и гибкой системе шаблонов, Seditio отлично подходит для разработки:
- Информационных и новостных порталов среднего и крупного масштаба.
- Тематических сообществ с интегрированными форумами.
- Корпоративных сайтов и сайтов-визиток.
- Блогов, портфолио и личных страниц.
- Веб-ресурсов с нестандартной структурой данных (благодаря возможностям CMF).
Ключевые особенности
- Полное разделение логики и представления. В Seditio PHP-код полностью отделен от HTML/CSS разметки. Шаблоны реализуются на основе файлов
.tpl(шаблонизатор XTemplate SE), в которых используются специальные теги-плейсхолдеры (например,{PHP.cfg.mainurl}или{PAGE_TITLE}). Это позволяет веб-дизайнерам верстать интерфейс без необходимости написания PHP-кода. - Высокая скорость работы и низкая нагрузка. Ядро системы оптимизировано для работы с минимальным количеством SQL-запросов. Встроенная система кэширования снижает нагрузку на базу данных.
- Модульность. Архитектура построена на четком разделении ядра, подключаемых функциональных модулей (Modules) и расширений-плагинов (Plugins).
- Безопасность «из коробки». Система жестко фильтрует все входящие данные, имеет встроенные механизмы защиты от CSRF/XSS атак и гибкую подсистему контроля доступа пользователей (ACL).
- 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) и работают в одном из следующих режимов:
standalone(параметрe, например,index.php?r=plug&e=contact): плагин загружается как полноценная самостоятельная страница. Ядро Seditio автоматически подключает системную шапку (header.php), обрабатывает TPL-шаблон плагина (находящийся в папке плагина или темы оформления), выводит тело страницы и в конце подключает подвал (footer.php).direct(параметрe, если плагин зарегистрирован на хукdirect): плагин вызывается напрямую и берет управление на себя. Ядро не подключает шапку и подвал темы. Режим используется для генерации XML/RSS лент, скачивания файлов, отдачи картинок или капчи.popup(параметрo, например,index.php?r=plug&o=smilies): плагин рендерится в специальном упрощенном шаблоне всплывающего окна (используется для выбора смайлов, BB-кодов и т.д.).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 построена на гибкой и очень быстрой групповой модели с использованием битовых масок. Это позволяет системе проверять сложнейшие права доступа за микросекунды с помощью простых математических операций на уровне процессора.
Как это устроено простыми словами:
Права привязаны к группам, а не к людям. Права на чтение, создание или модерирование контента настраиваются для групп пользователей (например, «Гости», «Зарегистрированные», «Модераторы»). Каждый пользователь наследует права тех групп, в которых он состоит. Если пользователь состоит в нескольких группах одновременно, его права складываются (объединяются).
Адресация прав: Область (Area) и Ресурс (Option). Проверка прав всегда запрашивается для конкретной зоны сайта:
- Область (
area) — это крупный раздел или модуль (например,page— страницы,forums— форум,admin— админка,plug— плагины). - Ресурс (
option) — уточняющая деталь. Для страницpageэто код категории (например,newsилиarticles). Для форумовforumsэто ID конкретной ветки форума.
- Область (
Битовая маска — все права в одной цифре. Вместо того чтобы хранить в базе данных десятки полей с галочками «разрешено/запрещено» для каждого действия, Seditio кодирует права степенями двойки. Каждому праву соответствует свой «бит» (число):
R(Read / Чтение) = 1W(Write / Создание и редактирование) = 2A(Admin / Управление разделом) = 128- Кастомные права (используются плагинами и модулями для специфических действий вроде скачивания файлов или комментирования):
1= 42= 83= 164= 325= 64
Пример: Если группе разрешено читать тему (
R= 1) и оставлять сообщения (W= 2), то в базе данных её права запишутся как число3(1 + 2). Если модераторам дополнительно разрешено кастомное действие под номером2(модерирование,8), то их права запишутся как11(1 + 2 + 8).Как система объединяет права пользователя. Если пользователь состоит в группе «Зарегистрированные» (права
3на новости) и в группе «Модераторы» (права11на новости), ядро Seditio объединяет их побитовым сложением «ИЛИ» (|):3 | 11 = 11(в двоичном виде:00000011ИЛИ00001011=00001011). Пользователь получает полный набор прав обеих групп.Проверка прав в коде PHP. Для проверки прав разработчики используют функцию
sed_auth()(файл/system/functions.php).Пример использования:
// Проверяем, имеет ли право текущий пользователь писать (W = 2) в категорию страниц 'news' if (!sed_auth('page', 'news', 'W')) { // Если битовая маска прав пользователя не содержит двойку, прерываем выполнение с ошибкой sed_diefatal('Доступ запрещен. У вас нет прав на публикацию в этом разделе.'); }Если проверяется администратор сайта, у которого есть право
A(Admin = 128) в глобальной областиadmin, функция автоматически разрешает любое действие, избавляя разработчиков от написания лишних условий.
Comments: (0)