44.5. 受信任和不受信任的 PL/Perl

通常,PL/Perl 是作为名为plperl的“受信任”编程语言安装的。在此设置中,某些 Perl 操作被禁用以保持安全性。通常,受限制的操作是与环境交互的操作。这包括文件句柄操作requireuse(用于外部模块)。就像 C 函数一样,无法访问数据库服务器进程的内部或使用服务器进程的权限来获得 OS 级访问。因此,可以允许任何非特权数据库用户使用此语言。

这是一个由于安全原因不允许文件系统操作而无法使用的函数示例:

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 函数的编写者必须注意,该函数不能用于执行不需要的任何操作,因为它可以执行以数据库 Management 员身份登录的用户可以执行的任何操作。请注意,数据库系统仅允许数据库超级用户以不受信任的语言创建函数。

如果上述功能是由超级用户使用plperlu语言创建的,则执行将成功。

同样,如果将语言指定为plperlu而不是plperl,则用 Perl 编写的匿名代码块可以使用受限操作,但是调用者必须是超级用户。

Note

虽然对于每个 SQL 角色,PL/Perl 函数在单独的 Perl 解释器中运行,但是在给定会话中执行的所有 PL/PerlU 函数在单个 Perl 解释器中运行(这不是用于 PL/Perl 函数的任何解释器)。这允许 PL/PerlU 功能自由共享数据,但是 PL/Perl 与 PL/PerlU 功能之间无法进行通信。

Note

Perl 不能在一个进程中支持多个解释器,除非它是使用适当的标志usemultiplicityuseithreads构建的。 (usemultiplicity是首选,除非您实际上需要使用线程.有关更多详细信息,请参见有问题的手册页.)如果 PL/Perl 与不是以这种方式构建的 Perl 副本一起使用,则只能使用一个 Perl 每个会话一个解释器,因此任何一个会话只能执行 PL/PerlU 函数或全部由同一 SQL 角色调用的 PL/Perl 函数。