Релиз содержит более 50 багфиксов, во многом благодаря прошедшим Дням Охоты на Баги (Bug Hunting Days).
Скачать

Сегодня команда разработчиков Zend Framework выпустила новую версию – 1.10.1. Исправлено более 50 багов, обнаруженных с момента выпуска версии 1.10.0.
Список исправлений
Скачать Zend Framework 1.10.1
Оффициальный анонс новой версии

Также в руководстве по Zend Framework появилась возможность комментирования, что очень полезно – в документации описаны далеко не все тонкости. Надеюсь, комментарии устранят этот недостаток.

Всем привет.
Активисты русскоязычного сообщества ZF организуют первую в России конференцию. Судя по списку тем, мероприятие обещает быть интересным. Доступна предварительная регистрация.
Организаторы обещают, что мероприятие будет бесплатным или почти бесплатным.
Место проведения: Санкт-Петербург.

За последними новостями можно следить здесь:
RSS-канал: feeds.feedburner.com/zfconf
Twitter: @zfconf
Группа Вконтакте: vkontakte.ru/club14951507

11 января вышли новые версии сразу трёх веток Zend Framework: 1.9.7, 1.8.5 и 1.7.9.
Эти релизы содержат более 40 багфиксов и включают в себя уведомление о новой политике безопасности Zend Framework.
На протяжении декабря Padraic Brady проводил аудит безопасности фреймворка и работал совместно с разработчиками ZF над устранением проблем.
Устранены следующие уязвимости:

Потенциальная инъекция MIME-type в Zend_File_Transfer
В случае, если не установлено расширение ext/finfo и недоступна функция mime_content_type() использовался MIME-type, хранящийся в массиве $_FILES. Это небезопасно, т.к. злоумышленник может подделать значение. Теперь в случае, если не удаётся корректно определить MIME-type, передаётся значение “application/octet”
Потенциальная XSS/HTML инъекция в Zend_Json
Zend_Json_Encode не экранировал символ слэша (”/”), что противоречит спецификации JSON и открывает возможность для инъекции XSS или HTML. В новых версиях проблема устранена, символ экранируется.
Потенциальная XSS-уязвимость в компоненте Zend_Service_ReCaptcha_MailHide
Zend_Service_ReCaptcha_MailHide не проделывал валидацию переданного e-mail’а, а при вызове htmletities() не указывалась текущая кодировка, злоумыленник мог передать специально сформированную строку.
Потенциальная XSS-уязвимость в Zend_Dojo_View_Helper_Editor
Zend_Dojo_View_Helper_Editor использовал TEXTAREA вместо DIV’а. Команда разработчиков Dojo сообщила, что тектовый редактор на базе TEXTAREA не обеспечивает должный уровень безопасности.
Потенциальный XSS из-за несовместимости кодировок
Множество классов ZF, в том числе Zend_Form, Zend_Filter, Zend_Form, Zend_Log и Zend_View, вызывали htmlentities() и htmlspecialchars() с неуказанными или жёстко прописанными кодировками. При использовании нетипичных кодировок (например, UTF-7) кодировка может определиться некорректно и открыть возможность злоумышленнику передать XSS-эксплойт. Рекомендуется в каждом из этих компонентов задавать кодировку явно, не надеясь на автоопределение.

Рекомендуется обновить свои приложения для устранения вышеперечисленных проблем.

О не связанных с безопасностью изменениях вы можете узнать по ссылкам:
http://framework.zend.com/changelog/1.9.7
http://framework.zend.com/changelog/1.8.5
http://framework.zend.com/changelog/1.7.9

Это последний запланированный релиз ветки 1.9. До конца этого месяца планируется выпустить версию 1.10.0

Подробнее о релизе:
В Zend DevZone от Matthew Weier O’Phinney
На blog.astrumfutura.com от Padraic Brady

Связанные записи

Matthew Weier O’Phinney опубликовал краткое руководство по созданию SOAP, XML-RPC, JSON-RPC или AMF API на базе Zend Framework.
Я знал, что через ZF это сделать просто, но, оказалось, даже проще, чем я думал. Например, вот так выглядит создание XML-RPC-сервера:

1
2
3
$server = new Zend_XmlRpc_Server();
$server->setClass('My_Awesome_Api');
echo $server->handle();

Также не следует использовать для этих целей полноценный MVC — просто незачем проходить полный цикл диспатчеризации, если можно заменить его куда более производительным сервис-сервером:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class XmlRpc_Bootstrap extends Bootstrap
{
    public function run()
    {
        $server = new Zend_XmlRpc_Server();
        $server->setClass('My_Awesome_Api');
        echo $server->handle();
    }
}

$app = new Zend_Application(
    APPLICATION_ENV,
    array(
        'bootstrap' => array(
            'class' => 'XmlRpc_Bootstrap',
            'path'  => 'path/to/Bootstrap.php',
        ),
        'config' => APPLICATION_PATH . '/configs/application.ini',
    ),
);
$app->bootstrap()
    ->run();

Подробности читайте в оригинале статьи.

Ни для кого не секрет, что Zend_OpenID не всегда работает так, как хотелось бы.
Сегодня я столкнулся с тем, что этот компонент не принимал ответ от openID-сервера google, выдавая ошибку “Discovery failed”. После изучения исходных кодов я выяснил, что необходимый для корректной валидации код просто отсутствует в компоненте. Пришлось воспользоваться грязным хаком (источник):

  1. В метод Zend_OpenId_Consumer::_discovery(), в серию условий if preg_match (начало около строки 740), надо добавить следующий блок:

    1
    2
    3
    } else if (preg_match('/<URI>([^<]+)<\/URI>/i', $response, $r)) {
      $version = 2.0;
      $server = $r[1];
  2. Класс тот же, метод _checkId(). В блок if ($version <= 2.0), в if ($this->_session !== null) надо добавить:

    1
    2
    3
    4
    if ($server == 'https://www.google.com/accounts/o8/ud') {
      $this->_session->identity = 'http://specs.openid.net/auth/2.0/identifier_select';
      $this->_session->claimed_id = 'http://specs.openid.net/auth/2.0/identifier_select';
    }
  3. Там же, следующая ветка – else if (defined(’SID’)):

    1
    2
    3
    4
    if ($server == 'https://www.google.com/accounts/o8/ud') {
      $_SESSION['zend_openid']['identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
      $_SESSION['zend_openid']['claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
    }
  4. Там же, вне if/else if/else ветки, но внутри $version <= 2.0:

    1
    2
    3
    4
    if ($server == 'https://www.google.com/accounts/o8/ud') {
      $params['openid.identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
      $params['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
    }

Конечно, это некрасивое решение, но оно приемлемо до тех пор, пока этот баг не будет закрыт.

Недавно на сайте http://fbdevzone.com/ был рассмотрен удобный способ передачи URL-параметров в действия.
Обычно для этой цели используются методы $this->_getParam() и $this->getRequest()->getParam() в классах контроллера. Это довольно удобный способ, однако он не идеален — прописывать это из метода в метод не очень удобно.
Предложенный способ заключается в том, что параметры передаются в действия в виде аргументов метода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * index/info/
 * index/info/tags/one/tags/two
 * index/info/msg/msg-only
 * index/info/date/2009-10-03
 * index/info/msg/RandomOrder/date/2009-10-03
 *
 * @param array $tags
 * @param Zend_Date $date
 * @param string $msg
 */

public function infoAction(array $tags = null, Zend_Date $date = null, $msg = 'hello')
{
    Zend_Debug::dump($tags);
    if (!is_null($date)) echo $date->get(Zend_Date::DATETIME_FULL);
    else echo "no date passed\n";
    Zend_Debug::dump($msg);
    die;
}

При помощи Zend_Reflection производится парсинг phpdoc-комментариев, присваивая переменным соответствующие типы.
Подробнее читайте в блоге автора. Там же вы найдёте исходный код класса.

Связанные записи

Здравствуйте.
Сегодня увидела свет новая версия Zend Framework. Ничего особенного, просто правка багов.
Список закрытых вопросов

Здравствуйте.
Думаю, многие из вас сталкивались с проблемой склонения существительных в зависимости от какого-либо числа. Например, “15 дней”. А если будет 21, выводить “21 дней”? Для решения этой проблемы написано множество функций, но я не встречал реализации в виде помощника Zend_View. Итак, встречайте: App_View_Helper_Plural.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Helper_View_Plural extends Zend_View_Helper_Abstract
{
    public function plural($n, $form1, $form2, $form3) {
        $plural = ($n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 or $n % 100 >= 20) ? 1 : 2));
        switch($plural) {
            case 0:
            default:
                return $form1;
            case 1:
                return $form2;
            case 2:
                return $form3;
        }
    }
}

Использование (в шаблоне):

1
2
3
echo '1 ' . $this->plural(1, 'день', 'дня', 'дней') . '<br>';
echo '4 ' . $this->plural(4, 'день', 'дня', 'дней') . '<br>';
echo '25 ' . $this->plural(25, 'день', 'дня', 'дней');

Вывод:

1 день
4 дня
25 дней

Надеюсь, этого поможет вам сделать ваши проекты более удобными для пользователей.
Всего доброго.

Связанные записи

Команда разработчиков Zend Framework не перестаёт удивлять нас скоростью разработки. Скачать новую версию.
Следует отметить, что Preview Release предназначен исключительно для ознакомления, не следует использовать его в реальных проектах.
Новшества:

  • Zend_Rest_Route, Zend_Rest_Controller и Zend_Controller_Plugin_PutHandler, которые позволяют использовать RESTful ресурсы как MVC-слой.
  • Zend_Feed_Reader, который предоствляет общий API для RSS и Atom лент, а также кеширование и прочий функционал.
  • Zend_Queue и Zend_Service_Amazon_Sqs, которые делают возможным использование локальных и удалённых сообщений и очередь сервисов для разгрузки асинхронных процессов.
  • Обновления Zend_Db_Table позволяют использовать его как конкретный класс, передавая одно или больше определений таблицы через конструктор.
  • Поддержка комменариев в Zend_Pdf, и некоторые улучшения производительности.
  • Поддержка сборки собственных слоёв в Zend_Dojo.
  • Многочисленные улучшения Zend_Ldap.
  • Zend_Log_Writer_Syslog, компонент для логирования в системный лог.
  • Несколько новых view-хэлперов, включая Zend_View_Helper_BaseUrl.

На следующей неделе запланирован выход бета-версии, стабильный релиз — через неделю или немного позже.