Доброго времени суток, уважаемый читатель и обыватель habrahabr! За прошедшие 2 недели с момента моей первой публикации здесь и на других тематических ресурсах удалось собрать достаточно приличный репорт о системе, связанный с сообщениями о необходимости улучшения как интерфейсов системы, функциональных возможностей так и качества ее кода.
И вот сегодня я готов представить вам обновление(патч) FFCMS с версией 2.0.4, в которую вошли исправления и наработки связанные с вашими пожеланиями.
Я хотел бы поблагодарить всех тех, кто обратил внимание на FFCMS и внес свой вклад в развитие бесплатного продукта — я благодарен всем за ваш фидбэк и pull-request'ы на github'e — именно вы можете задавать направление разработки и улучшать систему для собственного и коллективного пользования.
Всего было принято достаточно много реквестов связанных с улучшениями в «дружелюбности» интерфейсов — где то пользование интерфейсом было не удобным, а где то недостаточно функциональным. Много сообщений было и о коде, его стиле и качестве — однако в данный момент были проделаны лишь небольшие изменения, которые существенно не изменят синтаксис API вызова тех или иных методов и моделей взаимодействия.
Так же достаточно много запросов было связано с расширением возможностей системы, с которыми я по большей степени был согласен — управление меню сайта, пользовательские профили и карма и другие функциональные возможности.
Многие представления в админ-панели системы так же нуждались в переработке, т.к. их компактность и доступность были достаточно низкими. Появилась и необходимость в управлении правилами работы модулей системы на определенных URI с помощью графического интерфейса админ-панели а не на прямую в базе данных.
Нуждался в улучшениях и пользовательский интерфейс системы — местами интерфейсы взаимодействия пользователя и сайта были достаточно неудобными и мало информационными — существенно была улучшена система нотификации пользователей об изменениях на сайте.
Не обошлось и без обнаружения XSS уязвимостей (2шт), за что я благодарен пользователям — по факту обнаружения не фильтруемых входящих данных была проведена полная инспекция всего кода, но обо всем по порядку!
Первое, на что падает взор администратора веб-ресурса(вебмастера или разработчика) это естественно административная панель управления сайтом и его содержимым. Я пытался сделать ее максимально рациональной — всего в ней 4 раздела по области взаимодействия — будь то системные взаимодействия или взаимодействия с расширениями (3 типа).
О некоторых изменениях в административной панели я расскажу вам кратко с использованием изображений «до» и «после». Я благодарен пользователю dobriykot за сообщения о общих визуальных недоработках:
неудобства административного интерфейса так же дополнил пользователь hermit931, связанные с checkbox, select и другими элементами, в результате чего в систему были добавлены selectize.js и switchable checkbox:
Так же пользователи сообщили о ряде недоработок и неудобств на форуме FFCMS и в форму обратной связи, некоторые из изменений приведены ниже(управление маршрутизацией модулей, системный антивирус, дополнительные поля в профилях пользователей, управление категориями новостей):
Так же изменениям были подвергнуты и другие интерфейсы в большей или меньшей степени.
Более опытные пользователи в первую очередь взялись проверять интерфейсы на возможность проведения XSS-атаки и такую возможность, к сожалению или радости пользователи нашли. Как говориться безопасна не та система, в которой не найдена уязвимость а та, в которой ее усердно искали и не нашли.
Первая найденная уязвимость — отсутствие фильтрации в текстовом поле ответа на userwall.post (пользовательская стена сообщений -> ответы). Собственно факт обнаружения данной уязвимости подтолкнул меня проверить фильтрацию всех входящих пользовательских данных, в результате чего я обнаружил еще 2 уязвимых поля — одно из них это закладки пользователя(не фильтровался заголовок) и один из параметров сохранения закладки.
Позже пользователями была выявлена еще 1 уязвимость — форма поиска. Однако данная уязвимость была куда опасней, чем выше описанные. Дело в том, что параметры поиска передаются в pathway:
и в системе имеется стандартная шаблонная переменная
Как вы уже догадались, подставив в URI javascript содержимое можно было получить результат кросс-скриптинга на сайте:
Данная уязвимость была устранена благодаря тому, что активный пользователь обратил свое внимание на уязвимость формы поиска на сайте, которая была существенно опасней.
Многие пользователи предлагали существенно улучшить как стилистику кода так и его архитектуру в сторону той или иной парадигмы. Действительно, в будущем обновлении (ветка 2.1.xx) я планирую внедрить стандарт PSR-1 для всего кода системы, однако сейчас такого решения я не принял в виду того, что могут существенно измениться названия системных классов и методов, что может затруднить разработку расширений для системы для пользователей, которые только начали изучать систему и ее возможности.
Однако небольшие изменения я все же внес, которые порекомендовали пользователи или я нашел сам. Так я постарался убрать повторения кода(к примеру — компонент новости и модуль новости на главной — теперь второй вызывает метод первого без бессмысленного копирования кода).
Так же пользователь claustrofob посоветовал реализовать в абстрактном классе singleton саму логику с помощью позднего статического связывания, чтобы не таскать и не копировать ее в каждом из наследников данного паттерна классе(почему я это не сделал сразу, хоть и много раз вспоминал об этом?!). Теперь нет необходимости тянуть везде следующий кусок реализации:
а достаточно лишь наследовать \engine\singleton:
Так же существенным изменениям была подвержена инициация системных классов. Ранее их инициация происходила разными способами — бывало вплоть до внесения в singleton логику, однако было принято решение изменить динамическую инициацию классов на единый стандартный метод — init() для всех классов. Теперь логику загрузки системы отслеживать существенно проще, чем ранее, пример выгрузки класса конфигураций:
Так же местами я отказался от использования статических переменных и self:: в пользу привычной динамики и $this->. Все статические переменные были названы CONST в заголовках классов.
Как я уже отмечал ранее изменения коснулись и пользовательского интерфейса а так же были введены некоторые функциональные дополнения для системы FFCMS.
Изменения коснулись алгоритма нотификации пользователя о личных сообщениях и запросах в друзья(компонент «Идентификация пользователя») а так же появилась возможность написания сообщения пользователю если они не состоят в друзьях:
Так же появилась возможность поиска пользователей по имени, отображение рейтинга пользователей по количеству кармы и улучшена работа самой системы «рейтинга»(кармы) — появилась возможность ее удаленного использования другими расширениями(что я уже успешно внедрил в компонент форум):
В систему была так же внедрена возможность «отключения» сайта для пользователей — так называемый «maintenance mod». Была переработана логика работы системного роутера и назначения шаблонных переменных путей для работы сайта во вложенных директориях домена а так же ряд других полезных улучшений системы.
Сайт проекта: ffcms.ru
Релиз на github'e: ffcms 2.0.4
Информация о релизе на сайте: обновление 2.0.4
Расширения FFCMS: Каталог расширений FFCMS (все желающие могут пройти регистрацию и добавлять свои расширения в наш каталог)
Наш замечательный форум: Форум CMS
Я благодарен всем тем, кто сообщает о недочетах и недоработках проекта и всегда рад вашему фидбэку. Я принимаю абсолютно все конструктивные рекомендации и советы по развитию данного проекта.
Напомню вам, что FFCMS является бесплатным, open source проектом, распространяемым по лицензии GNU GPL v3. В следующй своей публикации я расскажу вам как написать расширение для системы FFCMS.
И вот сегодня я готов представить вам обновление(патч) FFCMS с версией 2.0.4, в которую вошли исправления и наработки связанные с вашими пожеланиями.
Я хотел бы поблагодарить всех тех, кто обратил внимание на FFCMS и внес свой вклад в развитие бесплатного продукта — я благодарен всем за ваш фидбэк и pull-request'ы на github'e — именно вы можете задавать направление разработки и улучшать систему для собственного и коллективного пользования.
1. Суммарно об обновлении
Всего было принято достаточно много реквестов связанных с улучшениями в «дружелюбности» интерфейсов — где то пользование интерфейсом было не удобным, а где то недостаточно функциональным. Много сообщений было и о коде, его стиле и качестве — однако в данный момент были проделаны лишь небольшие изменения, которые существенно не изменят синтаксис API вызова тех или иных методов и моделей взаимодействия.
Так же достаточно много запросов было связано с расширением возможностей системы, с которыми я по большей степени был согласен — управление меню сайта, пользовательские профили и карма и другие функциональные возможности.
Многие представления в админ-панели системы так же нуждались в переработке, т.к. их компактность и доступность были достаточно низкими. Появилась и необходимость в управлении правилами работы модулей системы на определенных URI с помощью графического интерфейса админ-панели а не на прямую в базе данных.
Нуждался в улучшениях и пользовательский интерфейс системы — местами интерфейсы взаимодействия пользователя и сайта были достаточно неудобными и мало информационными — существенно была улучшена система нотификации пользователей об изменениях на сайте.
Не обошлось и без обнаружения XSS уязвимостей (2шт), за что я благодарен пользователям — по факту обнаружения не фильтруемых входящих данных была проведена полная инспекция всего кода, но обо всем по порядку!
2. Улучшения в административном интерфейсе
Первое, на что падает взор администратора веб-ресурса(вебмастера или разработчика) это естественно административная панель управления сайтом и его содержимым. Я пытался сделать ее максимально рациональной — всего в ней 4 раздела по области взаимодействия — будь то системные взаимодействия или взаимодействия с расширениями (3 типа).
О некоторых изменениях в административной панели я расскажу вам кратко с использованием изображений «до» и «после». Я благодарен пользователю dobriykot за сообщения о общих визуальных недоработках:
неудобства административного интерфейса так же дополнил пользователь hermit931, связанные с checkbox, select и другими элементами, в результате чего в систему были добавлены selectize.js и switchable checkbox:
Так же пользователи сообщили о ряде недоработок и неудобств на форуме FFCMS и в форму обратной связи, некоторые из изменений приведены ниже(управление маршрутизацией модулей, системный антивирус, дополнительные поля в профилях пользователей, управление категориями новостей):
Так же изменениям были подвергнуты и другие интерфейсы в большей или меньшей степени.
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;
}
а достаточно лишь наследовать \engine\singleton:
class test extends \engine\singleton { }
Так же существенным изменениям была подвержена инициация системных классов. Ранее их инициация происходила разными способами — бывало вплоть до внесения в singleton логику, однако было принято решение изменить динамическую инициацию классов на единый стандартный метод — init() для всех классов. Теперь логику загрузки системы отслеживать существенно проще, чем ранее, пример выгрузки класса конфигураций:
\engine\property::getInstance()->init();
Так же местами я отказался от использования статических переменных и self:: в пользу привычной динамики и $this->. Все статические переменные были названы CONST в заголовках классов.
5. Другие изменения
Как я уже отмечал ранее изменения коснулись и пользовательского интерфейса а так же были введены некоторые функциональные дополнения для системы FFCMS.
Изменения коснулись алгоритма нотификации пользователя о личных сообщениях и запросах в друзья(компонент «Идентификация пользователя») а так же появилась возможность написания сообщения пользователю если они не состоят в друзьях:
Так же появилась возможность поиска пользователей по имени, отображение рейтинга пользователей по количеству кармы и улучшена работа самой системы «рейтинга»(кармы) — появилась возможность ее удаленного использования другими расширениями(что я уже успешно внедрил в компонент форум):
В систему была так же внедрена возможность «отключения» сайта для пользователей — так называемый «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.