支援的版本: 目前 (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 函數。

提交更正

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