PostgreSQL 可信的和不可信的 PL/Perl

2021-09-06 10:17 更新

通常,PL/Perl 被作為一種可信的編程語言安裝,其名稱 為plperl。在這種設(shè)置下,為了保持安全性禁用了某些 Perl 操作。一般來說,被限制的操作是那些與環(huán)境交互的操作。它們 包括文件處理操作、require以及 use(外部模塊)。沒有辦法像 C 函數(shù)那樣訪問 數(shù)據(jù)庫服務(wù)器進程的內(nèi)部或者用服務(wù)器進程的權(quán)限得到 OS 級別的訪問。 因此,任何沒有特權(quán)的數(shù)據(jù)庫用戶也被允許使用這種語言。

下面例子中的函數(shù)將無法工作,因為出于安全原因不允許它做文件操作:

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;

這個函數(shù)的創(chuàng)建會失敗,因為驗證器會捕捉到它使用了禁用的操作。

有些時候需要編寫不受限制的 Perl 函數(shù)。例如,我們可能想要一個能發(fā)送 電子郵件的 Perl 函數(shù)。要處理這些情況,可以把 PL/Perl 安裝成一種 不可信的語言(通常被稱作 PL/PerlU )。 在這種情況下整個 Perl 語言的特性都可以使用。在安裝語言時,用語言 名稱plperlu將會選擇不可信的 PL/Perl 變體。

PL/PerlU函數(shù)的編寫者必須注意該函數(shù)不能被用來做 其設(shè)計目的之外的事情,因為該函數(shù)能做一個作為數(shù)據(jù)庫管理員登錄的用戶 可以做的任何事情。注意數(shù)據(jù)庫系統(tǒng)只允許數(shù)據(jù)庫超級用戶用不可信語言 創(chuàng)建函數(shù)。

如果上述函數(shù)是一個超級用戶用語言plperlu創(chuàng)建的,則可以 執(zhí)行成功。

以和plperl語言同樣的方式,可以用plperlu 編寫 Perl 中的匿名代碼塊,這樣的代碼塊能夠使用受限的操作,不過調(diào)用 者必須是超級用戶。

注意

雖然對每個 SQL 角色會在一個獨立的 Perl 解釋器中運行 PL/Perl函數(shù),但是在一個給定會話中執(zhí)行的所有 PL/PerlU函數(shù)都運行在一個 Perl 解釋器中(與用于 任何PL/Perl函數(shù)的解釋器不同)。這允許 PL/PerlU函數(shù)自由地共享數(shù)據(jù),但是 PL/PerlPL/PerlU函數(shù)之間不會 發(fā)生任何交流。

注意

Perl 不支持一個進程中的多個解釋器,除非編譯它時使用了合適的標志, 即usemultiplicity或者useithreadsusemultiplicity會更好,除非你確實需要使用線程。更多細節(jié), 請見perlembed手冊頁)。 如果PL/Perl用的是一份沒有這樣編譯的 Perl 拷貝,那么 在每個會話中只能有一個 Perl 解釋器,并且因此任一會話只能要么執(zhí)行 PL/PerlU函數(shù),要么執(zhí)行同一個 SQL 角色調(diào)用的 PL/Perl函數(shù)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號