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

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.