43.5. Доверенный и недоверенный PL/Perl#

43.5. Доверенный и недоверенный PL/Perl

43.5. Доверенный и недоверенный PL/Perl

Обычно PL/Perl устанавливается как доверенный язык программирования с именем plperl. В этой настройке некоторые операции Perl отключены для обеспечения безопасности. В целом, ограничены операции, которые взаимодействуют с окружением. Это включает операции с файловыми дескрипторами, require и use (для внешних модулей). Нет способа получить доступ к внутреннему устройству процесса сервера базы данных или получить доступ к уровню ОС с правами процесса сервера, как это может сделать функция на языке C. Таким образом, любому не привилегированному пользователю базы данных можно разрешить использовать этот язык.

Вот пример функции, которая не будет работать, потому что операции с файловой системой не разрешены по соображениям безопасности:

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.