43.5. PL/Perl confiável e não confiável #

Normalmente, o PL/Perl é instalado como uma linguagem de programação confiável, chamada plperl. Nesta configuração, certas operações do Perl são desativadas para preservar a segurança. Em geral, as operações restringidas são aquelas que interagem com o ambiente, incluindo operações de tratamento de arquivo, require, e use (para módulos externos). Não há como acessar as partes internas do processo servidor do banco de dados, ou obter acesso no nível de sistema operacional, com as permissões do processo servidor, como uma função escrita em C pode fazer. Sendo assim, qualquer usuário do banco de dados sem privilégios pode ter permissão para usar esta linguagem.

Atenção

O PL/Perl confiável depende do módulo Perl Opcode para preservar a segurança. A documentação do Perl afirma que o módulo não é eficaz para o caso de uso confiável do PL/Perl. Se as necessidades de segurança forem incompatíveis com a incerteza contida neste aviso, deve-se considerar executar REVOKE USAGE ON LANGUAGE plperl FROM PUBLIC.

A seguir está um exemplo de função que não irá funcionar, porque as operações do sistema de arquivos não são permitidas por motivos de segurança:

CREATE FUNCTION maldosa() RETURNS integer AS $$
    my $tmpfile = "/tmp/maldosa";
    open my $fh, '>', $tmpfile
        or elog(ERROR, qq{não foi possível abrir o arquivo "$tmpfile": $!});
    print $fh "Teste de escrita no arquivo\n";
    close $fh or elog(ERROR, qq{não foi possível fechar o arquivo "$tmpfile": $!});
    return 1;
$$ LANGUAGE plperl;
ERRO:  'open' trapped by operation mask at line 4.
CONTEXTO:  compilação da função PL/Perl "maldosa"

A criação dessa função falha, porque o uso de uma operação proibida é capturado pelo validador.

Algumas vezes é desejável escrever funções Perl que não estejam restritas ao Perl seguro Por exemplo, pode-se querer uma função Perl que envie e-mails. Para lidar com estes casos, o PL/Perl também pode ser instalado como uma linguagem não confiável (untrusted) (geralmente chamada PL/PerlU). Neste caso, a linguagem Perl completa está disponível. Ao instalar a linguagem, o nome de linguagem plperlu irá selecionar a variante do PL/Perl não confiável.

O desenvolvedor de uma função PL/PerlU deve tomar cuidado para que a função não seja usada para fazer nada indesejado, porque ela poderá fazer qualquer coisa que poderia ser feita por um usuário conectado como administrador do banco de dados. Note que o sistema de banco de dados permite que apenas os superusuários do banco de dados criem funções em linguagens não confiáveis.

Se a função acima tivesse sido criada por um superusuário usando a linguagem plperlu, a execução seria bem-sucedida.

Da mesma maneira, os blocos de código anônimos escritos em Perl poderão usar operações restringidas, se a linguagem for especificada como plperlu, em vez de plperl, mas o responsável pela chamada deverá ser um superusuário.

Nota

Enquanto as funções escritas em PL/Perl são executadas em um interpretador Perl separado para cada função de banco de dados, todas as funções escritas em PL/PerlU executadas em uma determinada sessão são executadas em um único interpretador Perl (que não é nenhum dos usados ​​para as funções escritas em PL/Perl). Isto permite que as funções escritas em PL/PerlU compartilhem dados livremente, mas nenhuma comunicação pode ocorrer entre as funções escritas em PL/Perl e PL/PerlU.

Nota

O Perl não aceita vários interpretadores no mesmo processo, a menos que tenha sido construído com os sinalizadores apropriados, ou seja, usemultiplicity ou useithreads. (usemultiplicity é preferível, a menos que se realmente precise usar threads. Para mais detalhes, veja a página do manual perlembed.) Se o PL/Perl for usado com uma cópia do Perl que não foi construída dessa forma, então só será possível ter um interpretador Perl por sessão, e, portanto, qualquer sessão poderá executar apenas funções PL/PerlU ou funções PL/Perl, que são todas chamadas pela mesma função de banco de dados (role).