Postgresql 中文操作指南
45.5. Trusted and Untrusted 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 创建的,则执行将成功。
同样,以 Perl 编写的匿名代码块可以使用受限操作,如果语言指定为 plperlu 而不是 plperl,但调用者必须是超级用户。