pg_dump 不會透過 PHP 運行

pg_dump 不會透過 PHP 運行

這個問題已經在其他各種帖子中解決,但它們似乎並沒有幫助我。

我的問題是我從終端機運行以下腳本,該pg_dump語句有效:

$strBK = '/usr/bin/pg_dump --host localhost --port 5432 --username "postgres" --role "mizk" --no-password  --format plain --data-only --inserts --column-inserts --verbose --file "/home/khalid/tmp/esm/x1" --table "public.\"tblCustomerCategories\"" --table "public.\"tblSellers\"" "dbESM" 2>&1';
    //User has submitted form. Start making backup.
    echo "ok " . shell_exec($strBK);

但是從 php 中,我收到以下錯誤:

 ok pg_dump: [archiver (db)] connection to database "dbESM" failed:
 fe_sendauth: no password supplied
 pg_dump: *** aborted because of error

如圖所示,我沒有要求輸入密碼,但腳本報告了有關身份驗證的錯誤。

我的假設是 PHP 運行,www-data而終端轉儲以電腦使用者身分運行。那我該如何以安全的方式解決這個問題呢?

答案1

您可以透過執行以下命令來測試您的理論(www-data無法運行命令):

sudo -iu www-data /usr/bin/pg_dump ...

這很可能該問題存在多種不同的解決方法,具有不同的安全影響。

  • 建立一個運行轉儲的腳本,該腳本由您的使用者擁有,並應用了 setuid ( chmod 4755 <filename>)。誰運行這個就會運行它作為文件的所有者。如果您的腳本也可由 PHP 編輯,或者您的腳本在某種程度上可被利用,則存在明顯的安全後果。

  • 使用中間人。您可以從 PHP 寫入檔案並從 cron 作業讀取它(以正確的使用者身份運行)。如果該檔案存在,它將運行轉儲並刪除該檔案。這是相當安全的,但顯然它只能像你的 cron 間隔一樣即時。替代方案包括諸如芹菜對於批次或推遲任務(可選)給其他用戶來說,這更加工業化。

  • 擊敗 Postgres 允許www-data存取資料。我建議透過密碼來執行此操作,但這仍然會允許駭客www-data存取您提供的任何內容。

pg_dump指令也可能有一些特殊性。有一些關於 SE 的線程可能對它有特別幫助:

相關內容