在 PostgreSQL 中,PL/Perl 是一种允许在数据库中使用 Perl 语言进行存储过程和触发器编程的语言。PL/Perl 分为可信和不可信两种模式,这涉及到对函数的执行环境和安全性的不同要求。

1. 可信的 PL/Perl:
   - 在可信模式下,PL/Perl 函数可以执行一些敏感的操作,如访问文件系统、执行系统命令等。
   - 这需要数据库超级用户或具有足够特权的用户创建。
   - 使用 CREATE TRUSTED 来声明一个可信的 PL/Perl 函数。
   CREATE OR REPLACE FUNCTION trusted_plperl_function()
   RETURNS VOID AS $$
   BEGIN
       -- 可以执行敏感操作
       PERFORM pg_read_file('/etc/passwd');
   END;
   $$ LANGUAGE plperl SECURITY DEFINER;

2. 不可信的 PL/Perl:
   - 不可信模式下,PL/Perl 函数受到更为限制的安全策略,不允许执行一些潜在的危险操作。
   - 在不可信模式下,PL/Perl 函数无法访问文件系统,执行系统命令等危险操作。
   - 使用 CREATE UNTRUSTED 来声明一个不可信的 PL/Perl 函数。
   CREATE OR REPLACE FUNCTION untrusted_plperl_function()
   RETURNS VOID AS $$
   BEGIN
       -- 不能执行敏感操作
       PERFORM pg_read_file('/etc/passwd');  -- 这将导致错误
   END;
   $$ LANGUAGE plperl SECURITY DEFINER;

在上述的例子中,关键的区别在于 SECURITY DEFINER 部分。SECURITY DEFINER 意味着函数将以声明该函数的用户的权限执行。对于可信的 PL/Perl,这可能包括超级用户权限。而 SECURITY DEFINER 对于不可信的 PL/Perl 函数会导致函数以不可信的方式执行,受到更多的限制。

在编写 PL/Perl 函数时,请根据函数的要求和安全性需求选择适当的安全策略。避免使用超级用户权限运行不可信的代码,以提高数据库的安全性。


转载请注明出处:http://www.zyzy.cn/article/detail/8532/PostgreSQL