2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不受支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

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

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

警告

受信任的 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,否则 Perl 不能在一个进程中支持多个解释器。(如果实际上不需要使用线程,则首选 usemultiplicity。有关更多详细信息,请参阅 perlembed 手册页。)如果 PL/Perl 与未按此方式构建的 Perl 副本一起使用,则每个会话只能有一个 Perl 解释器,因此任何一个会话只能执行 PL/PerlU 函数,或者由同一个 SQL 角色调用的所有 PL/Perl 函数。

提交更正

如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。