Обычно PL/Perl устанавливается как «доверенный» программирования
под названием plperl. В данной конфигурации определенные операции Perl отключены в целях обеспечения безопасности. Как правило, ограничиваются операции, взаимодействующие с внешней средой. К ним относятся операции с дескрипторами файлов,
require, и использования (для
внешних модулей). Использование этого языка не позволяет получить доступ к внутренним структурам серверного процесса базы данных или получить доступ на уровне ОС с правами серверного процесса, как это позволяют функции на языке C. Таким образом, использование данного языка может быть разрешено любому непривилегированному пользователю базы данных.
Доверенный PL/Perl опирается на модуль Perl Opcode для
обеспечения безопасности.
В документации Perl
отмечается,
что данный модуль недостаточно эффективен для сценария использования доверенного PL/Perl. Если требования безопасности несовместимы с неопределенностью, указанной в данном предупреждении, следует рассмотреть возможность выполнения команды REVOKE USAGE ON LANGUAGE plperl FROM
PUBLIC.
Ниже приведен пример функции, работа которой невозможна, поскольку операции с файловой системой запрещены из соображений безопасности:
CREATE FUNCTION badfunc() RETURNS integer AS $$
my $tmpfile = "/tmp/badfile";
open my $fh, '>', $tmpfile
or elog(ERROR, qq{could not open the file "$tmpfile": $!});
print $fh "Testing writing to a file\n";
close $fh or elog(ERROR, qq{could not close the file "$tmpfile": $!});
return 1;
$$ конструкция LANGUAGE plperl;
Создание этой функции завершится ошибкой, так как использование запрещенной операции будет обнаружено механизмом проверки.
Иногда возникает необходимость в написании Perl-функций без подобных ограничений. Например, может потребоваться функция на языке Perl для отправки электронной почты. Для таких случаев PL/Perl также может быть установлен как
«untrusted» язык (обычно называемый
PL/PerlU). В данном случае доступен полный набор возможностей языка Perl. При установке процедурного языка его имя plperlu выберет
недоверенный вариант языка PL/Perl.
Разработчик PL/PerlU функции должен позаботиться о том, чтобы эту функцию нельзя было использовать для совершения каких-либо нежелательных действий, поскольку она сможет выполнять любые операции, доступные пользователю, вошедшему в систему с правами администратора базы данных. Обратите внимание, что система баз данных разрешает создавать функции на недоверенных языках только суперпользователям базы данных.
Если бы вышеуказанная функция была создана суперпользователем с использованием языка
plperlu, выполнение прошло бы успешно.
Таким же образом анонимные блоки кода, написанные на языке Perl, могут использовать ограниченные операции, если в качестве языка указан
plperlu , а не plperl, но вызывающий пользователь должен иметь права суперпользователя.
В то время как PL/Perl функции выполняются в отдельном интерпретаторе Perl для каждой SQL-роли, все PL/PerlU функции, выполняемые в рамках данного сеанса, запускаются в одном интерпретаторе Perl (который не совпадает ни с одним из тех, что используются для PL/Perl функций). Это позволяет PL/PerlU функциям свободно обмениваться данными, однако взаимодействие невозможно между PL/Perl и PL/PerlU функциями.
Интерпретатор Perl не поддерживает несколько интерпретаторов в рамках одного процесса, если только он не был собран с соответствующими флагами, а именно либо
usemultiplicity или useithreads.
(usemultiplicity является предпочтительным, если только не требуется использование потоков. Для получения дополнительных сведений см.
perlembed страницу руководства man.)
Если PL/Perl используется с копией Perl, которая не была собрана таким образом, то в рамках одного сеанса возможен только один интерпретатор Perl, и, следовательно, в любом сеансе могут выполняться либо
PL/PerlU функции, либо PL/Perl функции,
которые вызываются одной и той же SQL-ролью.