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.
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.
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.
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).