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 上有一些线程可能对此有所帮助:

相关内容