Патч-обновление FFCMS 2.0.4

в 10:47, , рубрики: cms, php, Блог компании FFCMS, интерфейсы, обновление

Патч обновление FFCMS 2.0.4 Доброго времени суток, уважаемый читатель и обыватель habrahabr! За прошедшие 2 недели с момента моей первой публикации здесь и на других тематических ресурсах удалось собрать достаточно приличный репорт о системе, связанный с сообщениями о необходимости улучшения как интерфейсов системы, функциональных возможностей так и качества ее кода.
И вот сегодня я готов представить вам обновление(патч) FFCMS с версией 2.0.4, в которую вошли исправления и наработки связанные с вашими пожеланиями.
Я хотел бы поблагодарить всех тех, кто обратил внимание на FFCMS и внес свой вклад в развитие бесплатного продукта — я благодарен всем за ваш фидбэк и pull-request'ы на github'e — именно вы можете задавать направление разработки и улучшать систему для собственного и коллективного пользования.

1. Суммарно об обновлении

Всего было принято достаточно много реквестов связанных с улучшениями в «дружелюбности» интерфейсов — где то пользование интерфейсом было не удобным, а где то недостаточно функциональным. Много сообщений было и о коде, его стиле и качестве — однако в данный момент были проделаны лишь небольшие изменения, которые существенно не изменят синтаксис API вызова тех или иных методов и моделей взаимодействия.
Так же достаточно много запросов было связано с расширением возможностей системы, с которыми я по большей степени был согласен — управление меню сайта, пользовательские профили и карма и другие функциональные возможности.
Многие представления в админ-панели системы так же нуждались в переработке, т.к. их компактность и доступность были достаточно низкими. Появилась и необходимость в управлении правилами работы модулей системы на определенных URI с помощью графического интерфейса админ-панели а не на прямую в базе данных.
Нуждался в улучшениях и пользовательский интерфейс системы — местами интерфейсы взаимодействия пользователя и сайта были достаточно неудобными и мало информационными — существенно была улучшена система нотификации пользователей об изменениях на сайте.
Не обошлось и без обнаружения XSS уязвимостей (2шт), за что я благодарен пользователям — по факту обнаружения не фильтруемых входящих данных была проведена полная инспекция всего кода, но обо всем по порядку!

2. Улучшения в административном интерфейсе

Первое, на что падает взор администратора веб-ресурса(вебмастера или разработчика) это естественно административная панель управления сайтом и его содержимым. Я пытался сделать ее максимально рациональной — всего в ней 4 раздела по области взаимодействия — будь то системные взаимодействия или взаимодействия с расширениями (3 типа).
О некоторых изменениях в административной панели я расскажу вам кратко с использованием изображений «до» и «после». Я благодарен пользователю dobriykot за сообщения о общих визуальных недоработках:

Патч обновление FFCMS 2.0.4

неудобства административного интерфейса так же дополнил пользователь hermit931, связанные с checkbox, select и другими элементами, в результате чего в систему были добавлены selectize.js и switchable checkbox:

Патч обновление FFCMS 2.0.4

Патч обновление FFCMS 2.0.4

Патч обновление FFCMS 2.0.4

Так же пользователи сообщили о ряде недоработок и неудобств на форуме FFCMS и в форму обратной связи, некоторые из изменений приведены ниже(управление маршрутизацией модулей, системный антивирус, дополнительные поля в профилях пользователей, управление категориями новостей):

Патч обновление FFCMS 2.0.4

Патч обновление FFCMS 2.0.4

Патч обновление FFCMS 2.0.4

Патч обновление FFCMS 2.0.4

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

3. XSS узявимости

Более опытные пользователи в первую очередь взялись проверять интерфейсы на возможность проведения XSS-атаки и такую возможность, к сожалению или радости пользователи нашли. Как говориться безопасна не та система, в которой не найдена уязвимость а та, в которой ее усердно искали и не нашли.
Первая найденная уязвимость — отсутствие фильтрации в текстовом поле ответа на userwall.post (пользовательская стена сообщений -> ответы). Собственно факт обнаружения данной уязвимости подтолкнул меня проверить фильтрацию всех входящих пользовательских данных, в результате чего я обнаружил еще 2 уязвимых поля — одно из них это закладки пользователя(не фильтровался заголовок) и один из параметров сохранения закладки.
Позже пользователями была выявлена еще 1 уязвимость — форма поиска. Однако данная уязвимость была куда опасней, чем выше описанные. Дело в том, что параметры поиска передаются в pathway:

/ru/search/hello%20guys

и в системе имеется стандартная шаблонная переменная {{ system.uri }}, которая принимает значение текущего URI без учета языка, ЧПУ и других возможных параметров построения URL на сайте. В дальнейшем данная переменная повсеместно используется, в том числе в стандартном шаблоне для генерации, к примеру, языковых переключателей:

                {% for langitem in system.languages %}
                    <li><a href="{{ system.nolang_url }}/{{ langitem }}/{{ system.uri }}"><img class="flag flag-{{ langitem }}" src="{{ system.script_url }}/resource/flags/blank.gif" /></a></li>
                {% endfor %}

Как вы уже догадались, подставив в URI javascript содержимое можно было получить результат кросс-скриптинга на сайте:

URL: /ru/test/"><script>alert("Hello, ffcms.ru!");</script>
Result: <li><a href="/ru/test/"><script>alert("Hello, ffcms.ru!");</script>"><img src="" alt="" /></a>

Данная уязвимость была устранена благодаря тому, что активный пользователь обратил свое внимание на уязвимость формы поиска на сайте, которая была существенно опасней.

4. Небольшие улучшения в стиле кода

Многие пользователи предлагали существенно улучшить как стилистику кода так и его архитектуру в сторону той или иной парадигмы. Действительно, в будущем обновлении (ветка 2.1.xx) я планирую внедрить стандарт PSR-1 для всего кода системы, однако сейчас такого решения я не принял в виду того, что могут существенно измениться названия системных классов и методов, что может затруднить разработку расширений для системы для пользователей, которые только начали изучать систему и ее возможности.
Однако небольшие изменения я все же внес, которые порекомендовали пользователи или я нашел сам. Так я постарался убрать повторения кода(к примеру — компонент новости и модуль новости на главной — теперь второй вызывает метод первого без бессмысленного копирования кода).
Так же пользователь claustrofob посоветовал реализовать в абстрактном классе singleton саму логику с помощью позднего статического связывания, чтобы не таскать и не копировать ее в каждом из наследников данного паттерна классе(почему я это не сделал сразу, хоть и много раз вспоминал об этом?!). Теперь нет необходимости тянуть везде следующий кусок реализации:

protected static $instance = null;

public static function getInstance() {
    if(is_null(self::$instance))
        self::$instance = new self();
    return self::$instance;
}

а достаточно лишь наследовать enginesingleton:

class test extends enginesingleton { }

Так же существенным изменениям была подвержена инициация системных классов. Ранее их инициация происходила разными способами — бывало вплоть до внесения в singleton логику, однако было принято решение изменить динамическую инициацию классов на единый стандартный метод — init() для всех классов. Теперь логику загрузки системы отслеживать существенно проще, чем ранее, пример выгрузки класса конфигураций:

engineproperty::getInstance()->init();

Так же местами я отказался от использования статических переменных и self:: в пользу привычной динамики и $this->. Все статические переменные были названы CONST в заголовках классов.

5. Другие изменения

Как я уже отмечал ранее изменения коснулись и пользовательского интерфейса а так же были введены некоторые функциональные дополнения для системы FFCMS.
Изменения коснулись алгоритма нотификации пользователя о личных сообщениях и запросах в друзья(компонент «Идентификация пользователя») а так же появилась возможность написания сообщения пользователю если они не состоят в друзьях:

Патч обновление FFCMS 2.0.4

Так же появилась возможность поиска пользователей по имени, отображение рейтинга пользователей по количеству кармы и улучшена работа самой системы «рейтинга»(кармы) — появилась возможность ее удаленного использования другими расширениями(что я уже успешно внедрил в компонент форум):

Патч обновление FFCMS 2.0.4

В систему была так же внедрена возможность «отключения» сайта для пользователей — так называемый «maintenance mod». Была переработана логика работы системного роутера и назначения шаблонных переменных путей для работы сайта во вложенных директориях домена а так же ряд других полезных улучшений системы.

6. Ссылки

Сайт проекта: ffcms.ru
Релиз на github'e: ffcms 2.0.4
Информация о релизе на сайте: обновление 2.0.4
Расширения FFCMS: Каталог расширений FFCMS (все желающие могут пройти регистрацию и добавлять свои расширения в наш каталог)
Наш замечательный форум: Форум CMS

7. Послесловие

Я благодарен всем тем, кто сообщает о недочетах и недоработках проекта и всегда рад вашему фидбэку. Я принимаю абсолютно все конструктивные рекомендации и советы по развитию данного проекта.
Напомню вам, что FFCMS является бесплатным, open source проектом, распространяемым по лицензии GNU GPL v3. В следующй своей публикации я расскажу вам как написать расширение для системы FFCMS.

Автор: zenn

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js