10 октября 2012

Ссылки: документация по открытой web-платформе для разработчиков

Консорциум W3C, курирующий разработку web-стандартов, совместно с компаниями Adobe, Apple, Facebook, Google, HP, Microsoft, Mozilla, Nokia и Opera, ввёл в строй новый сайт Web Platform Docs, который позиционируется как исчерпывающий и авторитетный источник документации по открытой web-платформе для разработчиков. Если ранее разработчики, использующие HTML, CSS и другие web-технологии, были вынуждены собирать с разных сайтов информацию о работе указанных технологий и их совместимости с различными операционными системами и браузерами, то отныне подобные сведения можно будет найти на едином информационном ресурсе.
Детальнее на www.opennet.ru

17 апреля 2012

Ускорение перезапуска MySQL

Столкнулись с долгим временем перезапуска MySQL сервера. Приходится ждать минут 10 а то и более. Хорошего тут вообще ничего, поскольку в это время приложения недоступно.
Как выяснилось, для InnoDB движка MySQL перед перезагрузкой сбрасывает буфер изменений на диск, что занимает значительное время.
Можно и принудительно завершить работу базы даже в момент синхронизации буферов через kill -9. При этом данные не потеряются, поскольку будут восстановлены из бинарного лога при следующем запуске сервера. Но все же существует способ значительно ускорить перезагрузку MySQL сервера.
mysql> set global innodb_max_dirty_pages_pct = 0;
Данной командой мы сообщаем серверу, что необходимо свести к минимуму кол-во не синхронизированных страниц буффера.
После этого нужно ждать и мониторить значение этой переменной, например в консоли:
$ mysqladmin ext -i 2 | grep dirty
В идеале, нужно дождаться нуля.
Следует заметить, что чем больше у вас размер буфера (innodb_buffer_pool_size), тем больше будет "грязных" страниц.

20 февраля 2012

Пример удаленного выполнения PHP кода после загрузки изображения на сайт

Обнаружил у нас в проекте досадную дыру в безопасности - возможность выполнения PHP кода, используя функциональность загрузки изображения на сайт, даже не смотря на наличие проверки формата загружаемого файла.

Началось все с того, что клиент обратился с жалобой, что в браузере не отображался загруженный ими логотип. Логотип оказался "гифкой" с расширением .tif, который, естественно браузер и не отображал.

Просмотр кода показал, что существует проверка на то, что загружаемый файл - это изображение в формате GIF, JPEG или PNG и размеры данного изображения не должны превышать 300 пикселей по вертикали и горизонтали. Но вся беда в том, что после данной проверки скрипт перемещяет данный файл в надлежащую директорию, изменяя имя файла, но сохраняя его расширение.

Таким образом на сервер можно загрузить картинку с расширением .php. Что не мудрено, при запросе данной картинки браузером, интерпретатор PHP обработает этот файл. Уязвимость на лицо.

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

Если просто добавить в конец графического файла PHP-код, то интерпретатор отказывается его выполнять (пробовал на PHP 5.3.10). Экспериментальным путем было обнаружено, что интерпретатору мешает наличие в файле символа с кодом 0h - индикатор конца строки в Си. Меняем в файле все вхождения данного символа на что-нибудь другое, и вуаля - интерпретатор успешно выполняет инструкции в конце файла.

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

Сам код валидации основан на валидаторе из состава используемого нами фреймворка, принимающий список допустимых mime-type'ов файла а сам, для определения типа бинарного файла, использует внешнюю программу file (на *nix платформе).

Возьмите любую "гифку", поместите в конец файла PHP код и file покажет, что это image/gif, поскольку читает только заголовок файла.

# file -bi untitled-1.gif.php
image/gif

Фокус в том, что после замены нами символа с кодом 0h на любой другой, файл по прежнему детектируется как image/gif.

Финальный шаг: нужно "подогнать" изображение, чтобы его размеры не превышали 300 пикселей. Из описания GIF формата находим, какие байты информируют о размерах изображения - седьмой и восьмой байты описывают ширину, девятый и десятый - высоту. Если изображение будет меньше, чем 256 на 256 точек, то "старшие" - седьмой и девятый - байты будут нулевыми, что нам никак на подходит. Поэтому заменяем с седьмого по десятый байты на символы c кодом 01h и получаем картинку с размером 257 на 257 пикселей.

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

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

19 февраля 2012

Именование совпадений в регулярных выражениях

В регулярных выражениях PCRE есть замечательная возможность задавать имя переменной

$str = "foo - bar";

if (preg_match('/(?<foovalue>\w+)/', $str, $m))
{
echo $m['foovalue'];
}

12 февраля 2012

Подборка плагинов JIRA для компании разработчика программного обеспечения

  • Расширенный учет трудозатрат в JIRA - Tempo. Великолепные отчеты по ворклогам.
  • Дизайнер схем и диаграмм - Gliffy. Хорошо подойдет для аналитиков. Удобно рисовать программные алгоритмы, блок-схемы процессов не выходя из JIRA или Confluence.
  • Дизайнер интерфейсов приложений - Balsamiq. Для рисования макетов приложений.
  • Календарь событий из JIRA и Confluence - Team Calendars. Позволяет организовать простенькое планирование. Есть возможность работы с Google Calendar.
  • Создание живых шаблонов в Confluence - Sacaffolding Plugin. С этого плагина должно начинаться внедрение Confluence.
  • Учет трудозатрат - Timesheet Report. Простенький и бесплатный функционал по учету трудозатрат, основанный на стандартных журналах учета рабочего времени.
  • Интерактивный интерфейс для ведения Agile-проектов в JIRA - GreenHopper. Упрощает работу с задачами в JIRA в 10 раз.
  • Быстрое создание багов и организация тест-сессий в JIRA - Bonfire. Надстройка над браузером, позволяющая в два клика создавать замечания к софту. Так же есть возможность группировать баги по тест-сессиям для понимания стоимость (в часах) исправления ошибок.
Источник: http://jira.teamlead.ru/browse/SUPPORT-1117