Выпуск 23. Январь 2015

Использование TLS в Perl | Содержание | Интервью с Рикардо Сигнесом (Ricardo Signes)

Обзор CPAN за декабрь 2014 г.

Рубрика с обзором интересных новинок CPAN за прошедший месяц

Статистика

  • Новых дистрибутивов — 296
  • Новых выпусков — 909

Новые модули

Mojo::JSON_XS

Модуль Mojo::JSON_XS позволяет использовать в Mojolicious более быструю XS-реализацию JSON-кодировщика, основанного на модуле Cpanel::JSON::XS. Модуль должен быть загружен раньше, чем будет загружен Mojo::JSON и использованы какие-либо из его функций:

use Mojo::JSON_XS;
use Mojo::JSON qw(to_json from_json);

Следует, однако, отметить, что Cpanel::JSON::XS и Mojo::JSON в некоторых случаях могут производить различный вывод. Примеры таких расхождений перечислены в документации модуля.

App::Prove::Watch

Утилита provewatcher позволяет наблюдать за изменениями файлов в каталоге и, в случае появления таких изменений, запускать заданную команду, например prove или dzil test. К сожалению, утилита реагирует на изменения в любых файлах, например, в своп-файлах vim. Возможно, в более новых версиях появится файловый фильтр.

AnyEvent::GnuPG

AnyEvent::GnuPG — это обёртка к утилите gpg, позволяющая выполнять различные операции с шифрованием и цифровой подписью как синхронно, так и асинхронно. В настоящий момент модуль работает только с gnupg версий 1.x.

Alien::Web

Alien::Web — это модуль, который определяет пространство имён для распространения всевозможных JavaScript/CSS библиотек через CPAN, по аналогии с пространством имён Alien, которое используют для сборки/конфигурации, например, C/C++-библиотек. При инсталляции модуля, соответствующие файлы помещаются в share-каталог дистрибутива модуля (определяется как File::ShareDir::dist_dir()).

Это позволяет, например, следующим образом собирать веб-приложение:

use Plack::Builder;
use Plack::App::Directory;
use File::ShareDir;

builder {
    mount "/js/extjs" => Plack::App::Directory->new({
            root => dist_dir('Alien-Web-ExtJS-V3')
        })->to_app;
    ...
};

Thrust

Thrust — это байндинг к одноимённому кросс-платформенному фреймворку приложений, основанному на Chromium. Модуль Thrust позволяет создавать приложения с интерфейсом, созданным на основе привычных HTML/CSS/JavaScript. Своеобразный симбиоз браузера и веб-сервера в одном приложении.

Debug::Statements

Модуль Debug::Statements упрощает написание отладочных сообщений. Типичный отладочный код может выглядеть так:

my $DEBUG = 1;

print "\$x = '$x', \$array[2] = '$array[2]'\n" if $DEBUG;

Это выведет сообщение:

$x = 'some value', $array[2] = 'three'

С помощью Debug::Statements отладочный код можно существенно упростить:

use Debug::Statements;

# $d -- задает уровень отладки
my $d = 1;

d  '$x $array[2]';  # Печатается при уровне отладки $d >= 1
d2 '@array';        # Печатается при уровне отладки $d >= 2

Отладочный вывод:

DEBUG:  $x = 'some value'
DEBUG:  $array[2] = 'three'
DEBUG2:  @array = [
  'one',
  'two',
  'three'
]

Как видно, печатается не только значение переменной, но и её название. Правда при использовании модуля Debug::Statements придётся пожертвовать переменной $d, которая задаёт уровень отладки (максимум три уровня).

Crypt::Rijndael::PP

Crypt::Rijndael::PP — это реализация криптографического алгоритма Rijndael (больше известного как AES) на чистом Perl. Реализация совместима с Crypt::Rijndael и может использоваться в Crypt::CBC для 256-битных ключей.

SQL::Interpol

Выпущен форк модуля SQL::Interp. Модуль позволяет интерполировать Perl-переменные в SQL-выражения, например:

my %item = ( column1 => "value1", "column2" => "value2" );
my ($sql, @bind) = sql_interp 'INSERT INTO table', \%item;

#  $sql = "INSERT INTO table (column1, column2) VALUES(?, ?)"
# @bind = ( "value1", "value2" )

Выполнен рефакторинг кода парсера, удалён код DBIx::Interp, удалена поддержка строгого (strict) режима.

Обновлённые модули

perl 5.21.7

В декабре был выпущен очередной релиз Perl для разработчиков 5.21.7. Значимым этот релиз делают несколько оптимизаций, появившихся в данном релизе:

  • Новая операция OP_MULTIDEREF, которая выполняет одно или несколько разыменований, если индексы/ключи являются константами или простыми скалярами, что позволяет сократить общее число операций. Например, получение значения $a[0]{$k}[$i] вместо четырёх операций теперь требует только одну.

  • Ускорен вызов методов как с явным (Class->method()), так и динамическим именем (Class->$dynamic_method) в среднем на 30%. Вызов метода родительского класса (SUPER::method()) ускорен на 50%. Также ускорены вызовы вида $obj->Class::method(), поскольку теперь во время исполнения не требуется сканировать имя метода на наличие ::. Важно отметить, что автором и инициатором включения этих изменений в Perl стал Олег Пронин (syberrus) из компании Crazy Panda. Очень надеемся, что в будущих номерах журнала мы увидим его статью об этих изменениях, а также тех, которые ещё планируется сделать для Perl.

Помимо прочего, в perldelta вскользь упомянуто об обновлении модуля PerlIO::scalar с исправлением бага №123443. На самом деле это очень важное исправление, поскольку исправляет проблему безопасности при работе с данными в скалярах через файловые дескрипторы. Исправление касается операций seek и read. Применение операции seek для задания смещения в файловом дескрипторе к скаляру позволяло задать смещение далеко за пределами скаляра. А последующее чтение read с такой позиции могло приводить к краху приложения. Например:

my $buf = "hello";
open my $fh, '<', \$buf or die $!;
seek( $fh, 2**32, SEEK_SET );   # смещение на большую позицию
read( $fh, my $tmp, 1 );        # чтение 1 байта с этого смещения

Perl при чтении попытается расширить скаляр до нужного смещения, что приведёт к ошибке сегментации на Perl ≥ 5.16 и к попытке выделения огромного сегмента памяти на более ранних версиях. Также seek, хоть и с предупреждением, но может устанавливать отрицательное смещение. И если ваш код не проверяет ошибку seek, то последующее чтение позволяет читать произвольные участки памяти вашего процесса. Если в памяти процесса содержатся переменные с паролями, приватными ключами, то все они могут уплыть при чтении за пределами скаляра. Получили аналог Heartbleed для Perl.

Таким образом, до исправления бага во всех поддерживаемых стабильных релизах Perl лучше избегать использования PerlIO::scalar, воспользовавшись альтернативой: IO::Scalar. Если это невозможно, то необходимо обязательно самостоятельно проверять аргументы seek, чтобы смещение не выходило за пределы скаляра.

Email::MIME::Kit 3.000001

Вышел новый мажорный релиз генератора почтовых сообщений из шаблонов Email::MIME::Kit. Модуль не просто компонует сообщение из отдельных фрагментов текста, но и полностью отвечает за подготовку multipart-сообщений, текстовой и html-альтернатив сообщения, кодирования, внутренних связей контента и проверки параметров. Новый релиз имеет важное несовместимое изменение: при чтении шаблонов с диска они декодируются в UTF-8 только если формат шаблона указан как текстовый (text/*).

Want 0.25

Новая версия модуля Want, который является развитием функции wantarray. Обновлённый модуль поддерживает новую операцию OP_MULTIDEREF, появившуюся в perl 5.21.7, позволяя корректно определять тип первой операции разыменования. Например:

sub foo {
    if (wantref eq 'ARRAY') {
        ...
    }
}

foo()->[1]{key}

Первая из двух операций разыменования – доступ к элементу массива с индексом 1, поэтому wantref, как и ожидается, вернёт ‘ARRAY’.

Class::Accessor::Inherited::XS 0.07

Продолжает активно развиваться модуль Class::Accessor::Inherited::XS для создания акцессоров/мутаторов, совместимых с Class::Accessor::Grouped. В представленных бенчмарках данный модуль работает на порядок быстрее Class::Accessor::Grouped.

XML::RSS 1.56

Новый релиз XML::RSS исправляет потенциальную проблему безопасности при обработке RSS-лент. Злоумышленник может создать RSS-файл, включив в него элемент с внешней сущностью. Если результат обработки может быть доступен, то злоумышленник может получить содержимое любого файла с сервера. Например, получить содержимое /etc/passwd можно, указав такую сущность в XML-файле:

<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

А затем вывести его в тело документа, сославшись на имя сущности:

<title>&xxe;</title>

Эксплойт и информация о других уязвимых продуктах доступны по ссылке. Важно отметить, что уязвимы и другие модули, которые используют XML::RSS, такие как XML::Feed и другие

PadWalker 2.0

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

Log::Any 1.02

Представлен первый мажорный релиз универсального API для логирования Log::Any. В новом релизе были объединены дистрибутивы Log::Any и Log::Any::Adapter, вычищены все зависимости, не входящих в базовую поставку Perl (по состоянию для Perl 5.8.1).

Gearman 1.12

После многолетнего перерыва обновлена Perl-реализация клиента Gearman::Client, рабочего Gearman::Worker и сервера задач Gearman::Server. Новый релиз содержит множество исправлений, касающихся процедуры соединения и таймаутов.

HTTP::Parser::XS 0.17

Выпущена новая версия самого быстрого парсера HTTP-заголовков HTTP::Parser::XS. В новом релизе обновлена входящая в состав модуля C-библиотека picohttpparser, которая также используется в высокопроизводительном HTTP-сервере H2O, превосходящим по скорости даже nginx.

PerlPowerTools 1.003

Обновлённый выпуск PerlPowerTools — набор классических UNIX-утилит, написанных на Perl. Проект был возрождён брайном ди фоем, один из выпусков был специально подготовлен для доклада на конференции Saint Perl 2014.

Image::Info 1.37

Обновлён модуль Image::Info для извлечения информации об изображении. В новом релизе исправлены проблемы при чтении битых TIFF-файлов. Также вместо использования встроенного в Perl средства для работы с файловым дескриптором к скалярной переменной PerlIO::scalar теперь используется IO::Scalar. Связано это с обнаруженным критическим багом в PerlIO::scalar < 0.21.

autodie 2.26

Обновлена прагма autodie, заменяющая системные функции аналогами, которые генерируют исключение в случае ошибки. В новой версии исключены функции umask и fileno, так как если они возвращают undef, это не является ошибкой. Также обновились зависимости модуля: вместо base теперь используется parent.

Владимир Леттиев


Использование TLS в Perl | Содержание | Интервью с Рикардо Сигнесом (Ricardo Signes)
Нас уже 1393. Больше подписчиков — лучше выпуски!

Комментарии к статье