其他多篇文章已经讨论了这个问题,但它们似乎对我没有什么帮助。
我的问题是,我从终端运行以下脚本,该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 上有一些线程可能对此有所帮助: