★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 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 | 7.2

45.5. 信頼されたPL/Perlおよび信頼されないPL/Perl

通常、PL/Perlはplperlという名前で信頼されたプログラミング言語としてインストールされます。 この設定では、セキュリティを確保するためにPerlの特定の操作は無効にされます。 一般的には、制限される操作は環境に作用するものです。 これには、ファイルハンドル操作やrequireuse(外部モジュール用)が含まれます。 C関数では可能ですが、Perlでは、データベースサーバ内部にアクセスする方法や、サーバプロセスの権限によるOSレベルのアクセスを行う方法はありません。 この結果、データベースの全ての非特権ユーザはこの言語を使用することができます。

セキュリティ上の理由により許されていないファイルシステム操作を行うため、うまく動作しない関数の例を以下に示します。

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言語を使用して作成された場合、実行は可能となります。

同じ方法で、言語をplperlではなくplperluと指定することで、Perl内に作成された匿名コードブロックは制限された操作を使用することができます。 ただし呼び出し元はスーパーユーザでなければなりません。

注記

PL/Perl関数はSQLロール毎に別々のPerlインタプリタ内で実行されますが、あるセッションで実行されるPL/PerlU関数はすべて、単一のPerlインタプリタ(PL/Perl関数用に使用されるインタプリタのいずれかではありません)内で実行されます。 これによりPL/PerlU関数はデータを自由に共有することができます。 しかしPL/Perl関数とPL/PerlU関数の間で通信することはできません。

注記

Perlは適切なフラグ、すなわちusemultiplicityまたはuseithreadsを付けて構築していない限り、1つのプロセス内で複数のインタプリタをサポートすることはできません。 (実際にスレッドの使用が必要でなければusemultiplicityを勧めます。 詳細はperlembedマニュアルページを参照してください。) PL/Perlがこの方法で構築されていないPerlのコピーを使用する場合、1つのセッション内で1つのPerlインタプリタしか持つことができません。 このため、1つのセッションでは、PL/PerlU関数、もしくは、すべて同一のSQLロールで呼び出されるPL/Perl関数のいずれかのみを実行することができます。