支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不受支援的版本: 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

43.5. 受信任與不受信任的 PL/Perl #

通常,PL/Perl 會以名為 受信任的程式語言 plperl 來安裝。 在此設定中,某些 Perl 操作會停用以維護安全性。 一般來說,受限制的操作是那些與環境互動的操作。 這包括檔案控制代碼操作、requireuse(用於外部模組)。 無法存取資料庫伺服器進程的內部,也無法獲得具有伺服器進程權限的作業系統層級存取權,如同 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/PerlPL/PerlU 函數之間無法發生通訊。

注意

除非 Perl 是使用適當的旗標建立的,即 usemultiplicityuseithreads,否則 Perl 無法在一個進程中支援多個直譯器。 (除非您實際上需要使用執行緒,否則首選 usemultiplicity。有關更多詳細資訊,請參閱 perlembed 手冊頁。) 如果 PL/Perl 與未以此方式建立的 Perl 副本一起使用,則每個會話只能有一個 Perl 直譯器,因此任何一個會話只能執行 PL/PerlU 函數,或由同一個 SQL 角色呼叫的所有 PL/Perl 函數。

提交更正

如果您在文件中看到任何不正確、與特定功能的體驗不符或需要進一步澄清的地方,請使用此表單報告文件問題。