Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

43.5. 受信任和不受信任的 PL/Perl #

通常,PL/Perl 被安装为名为 plperl受信任 编程语言。在此设置中,某些 Perl 操作被禁用以保持安全性。通常,受限的操作是那些与环境交互的操作。这包括文件句柄操作、requireuse(用于外部模块)。无法访问数据库服务器进程的内部,也无法使用服务器进程的权限获得操作系统级别访问,就像 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 函数在每个 SQL 角色的独立 Perl 解释器中运行,但给定会话中执行的所有 PL/PerlU 函数都在单个 Perl 解释器中运行(不是用于 PL/Perl 函数的任何解释器)。这允许 PL/PerlU 函数自由地共享数据,但 PL/PerlPL/PerlU 函数之间不能进行任何通信。

注意

Perl 无法在一个进程中支持多个解释器,除非它是使用适当的标志构建的,即 usemultiplicityuseithreads。(除非您实际上需要使用线程,否则建议使用 usemultiplicity。有关更多详细信息,请参阅 perlembed 手册页。)如果 PL/Perl 与不是这样构建的 Perl 副本一起使用,则每个会话只能有一个 Perl 解释器,因此任何会话都只能执行 PL/PerlU 函数,或所有由同一个 SQL 角色调用的 PL/Perl 函数。