Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

MediaWiki

Глава 12 из книги "Архитектура приложений с открытым исходным кодом", том 2.
Оригинал: MediaWiki
Автор: Sumana Harihareswara, Guillaume Paumier
Перевод: А.Панин

12.2. Кодовая база и практика разработки приложения MediaWiki

PHP

Фреймворк PHP был выбран для разработки программного обеспечения проекта Wikipedia в ходе работы над приложением "Фаза II" в 2001 году; с того времени приложение MediaWiki органично развивалось и развивается до сих пор. Большинство разработчиков проекта MediaWiki являются добровольцами, работающими над приложением в свое свободное время, а в начале развития проекта их было очень мало. Некоторые архитектурные решения и исключения при взгляде из сегодняшнего дня могут показаться некорректными, но сложно критиковать создателей приложения за отсутствие реализации некоторой абстракции, которая является критичной сегодня, в момент, когда кодовая база была достаточно мала, а затраченное на ее разработку время было ограничено.

Например, MediaWiki использует имена классов без префиксов, которые могут привести к конфликтам в момент, когда разработчики PHP или PECL (Библиотека расширений сообщества PHP - PHP Extension Community Library) добавляют новые классы: класс приложения MediaWiki Namespace должен быть переименован в MWNamespace для совместимости с PHP 5.3. Постоянное использование префикса для всех классов (т.е., "MW") должно упростить включение кода приложения MediaWiki в состав другого приложения или библиотеки.

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

Даже если приложение MediaWiki все еще содержит "некачественный" устаревший код, значительные улучшения проводились в течение многих лет и новые элементы архитектуры вводились в состав приложения MediaWiki в течение всей истории его развития. Эти улучшения включают в себя классы Parser, SpecialPage и Database, класс Image и иерархию классов FileRepo, иерархии классов ResourceLoader и Action. Приложение MediaWiki начало свое существование без всех этих классов, но все они реализуют функции, которые были доступны с самого начала. Многие разработчики заинтересованы в первую очередь в разработке новых функций и обычно оставляют в стороне вопросы, касающиеся архитектуры, чтобы обратить внимание на них только после окончания разработки, когда отсутствие подходящих архитектурных решений является очевидным.

Безопасность

Так как приложение MediaWiki является платформой для таких известных сайтов, как Wikipedia, основные разработчики и рецензенты кода следуют жестким правилам безопасности. (Ознакомьтесь с подробным руководством.) Для упрощения написания безопасного кода приложение MediaWiki предоставляет разработчикам функции-обертки для доступа к формируемым документам HTML и осуществления запросов к базам данных с удалением управляющих символов. Для нормализации введенных пользователем данных разработчик использует класс WebRequest, который анализирует переданные в составе URL или с помощью формы с POST-запросом данные. Он удаляет "магические кавычки" и слеши, убирает некорректные введенные символы и нормализует последовательности символов Unicode. Атаки на основе межсайтового создания запросов (cross-site request forgery - CSRF) отсекаются путем использования токенов, а атаки на основе межсайтового скриптинга (cross-site scripting - XSS) - путем проверки вводимых символов и удаления управляющих символов из выводимых последовательностей данных, обычно с помощью функции htmlspecialchars() из состава PHP. Приложение MediaWiki также предоставляет (и использует) систему проверки структуры XHTML, реализованную в рамках класса Santizer, а также функции работы с базой данных для предотвращения атак на основе SQL-инъекций.

Конфигурация

Приложение MediaWiki использует тысячи настроек, хранящихся в глобальных переменных PHP. Их значения по умолчанию хранятся в файле DefaultSettings.php, а системный администратор может изменить их значения, отредактировав файл LocalSettings.php.

MediaWiki в значительной степени зависит от глобальных переменных, включая переменные для хранения настроек и работе с контекстом. Глобальные переменные могут вилять на безопасность приложения в зависимости от использования функции register_globals из состава PHP (которая не требуется MediaWiki начиная с версии 1.2). Эта система также ограничивает возможности абстракций конфигурации и затрудняет оптимизацию процесса запуска. Более того, пространство имен конфигурации делится с переменными, используемыми для регистрации пользователей и объектов для управления контекстом, что ведет к потенциальным конфликтам. С точки зрения пользователя, глобальные переменные для конфигурации сделали приложение MediaWiki на первый взгляд сложным для настройки и сопровождения. Процесс разработки MediaWiki стал историей медленного перемещения элементов контекста из глобальных переменных в состав объектов. Хранение элементов управления контекстом в переменных объектов позволяет осуществлять более гибкое повторное использование этих объектов.


Далее: База данных и хранилище текста