通常,PL/Perl 安装为名为 plperl
的“可信”编程语言。 在此设置中,某些 Perl 操作会被禁用以保持安全性。 通常,受限操作是那些与环境交互的操作。 这包括文件句柄操作、require
和 use
(对于外部模块)。 没有办法访问数据库服务器进程的内部结构或使用服务器进程的权限来获得操作系统级别的访问权限,就像 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
创建的,则执行将成功。
同样,如果将语言指定为 plperlu
而不是 plperl
,则以 Perl 编写的匿名代码块可以使用受限操作,但调用者必须是超级用户。
虽然 PL/Perl 函数为每个 SQL 角色在单独的 Perl 解释器中运行,但给定会话中执行的所有 PL/PerlU 函数都在单个 Perl 解释器中运行(这不是任何用于 PL/Perl 函数的解释器)。 这允许 PL/PerlU 函数自由共享数据,但 PL/Perl 和 PL/PerlU 函数之间无法进行通信。
除非 Perl 是使用适当的标志(即 usemultiplicity
或 useithreads
)构建的,否则 Perl 不支持在一个进程中包含多个解释器。(除非您实际上需要使用线程,否则首选 usemultiplicity
。有关更多详细信息,请参见 perlembed 手册页。) 如果 PL/Perl 使用未以此方式构建的 Perl 副本,则每个会话只能有一个 Perl 解释器,因此任何一个会话只能执行 PL/PerlU 函数,或者执行所有由同一个 SQL 角色调用的 PL/Perl 函数。
如果您在文档中发现任何不正确、与您的特定功能体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。