無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

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

通常、PL/Perlは plperl という名前で "信頼された" プログラミング言語としてインストールされます。 この設定では、セキュリティを確保するためにPerlの特定の操作は無効にされます。 一般的には、制限される操作は環境に作用するものです。 これには、ファイルハンドル操作や require use (外部モジュール用)が含まれます。 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 関数のいずれかのみを実行することができます。


powered by SEO.CUG.NET