42.5. Доверенный и недоверенный PL/Perl#
42.5. Доверенный и недоверенный PL/Perl #
Обычно PL/Perl устанавливается как доверенный язык программирования с именем plperl
. В этой настройке некоторые операции Perl отключены для обеспечения безопасности. В целом, ограничены операции, которые взаимодействуют с окружением. Это включает операции с файловыми дескрипторами, require
и use
(для внешних модулей). Нет способа получить доступ к внутреннему устройству процесса сервера базы данных или получить доступ к уровню ОС с правами процесса сервера, как это может сделать функция на языке 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 также может быть установлен как “недоверенный” язык (обычно называемый 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 page).
Если PL/Perl используется с копией Perl, которая не была построена таким образом, то возможно только один интерпретатор Perl на сессию, и поэтому любая сессия может выполнять только либо функции PL/PerlU, либо функции PL/Perl, которые вызываются одной и той же ролью SQL.