2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 函式那樣獲得伺服器程序許可權的 OS 級別訪問。因此,任何沒有特權的資料庫使用者都可以被允許使用該語言。

警告

受信任的 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 語言建立的,執行將成功。

同樣,用 Perl 編寫的匿名程式碼塊可以使用受限制的操作,如果語言被指定為 plperlu 而不是 plperl,但呼叫者必須是超級使用者。

注意

雖然 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 函式。

提交更正

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