45.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
语言创建的,则执行将成功。
同样,如果将语言指定为plperlu
而不是plperl
,则以 Perl 编写的匿名代码块可以使用受限操作,但调用者必须是超级用户。
注意
虽然PL/Perl函数在每个 SQL 角色的单独 Perl 解释器中运行,但在给定会话中执行的所有PL/PerlU函数都在单个 Perl 解释器中运行(它不是用于PL/Perl函数的任何解释器)。这允许PL/PerlU函数自由共享数据,但PL/Perl和PL/PerlU函数之间不能进行通信。
注意
除非使用适当的标志(即usemultiplicity
或useithreads
)构建 Perl,否则 Perl 无法在一个进程中支持多个解释器。(除非您确实需要使用线程,否则首选usemultiplicity
。有关更多详细信息,请参阅perlembed手册页。)如果将PL/Perl与不是这样构建的 Perl 副本一起使用,那么每个会话只能有一个 Perl 解释器,因此任何一个会话只能执行PL/PerlU函数或由同一 SQL 角色调用的所有PL/Perl函数。