"如果想要一些容易重用或自动化的东西,可以使用Postgresql内置的COPY命令。例如
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',';
这种方法完全在远程服务器上运行,不能写入本地PC。它还需要作为Postgres“超级用户”(通常称为“root”)运行,因为Postgres无法阻止它使用该机器的本地文件系统做恶心的事情。
这实际上并不意味着你必须以超级用户的身份进行连接(自动化,这将是另一种安全风险),因为你可以使用这个SECURITY DEFINER选项CREATE FUNCTION来创建一个像超级用户一样运行的功能。
关键的一点是,你的函数是在那里执行额外的检查,而不仅仅是绕过安全 - 所以你可以编写一个函数,导出你需要的确切数据,或者你可以写一些东西,可以接受各种选项,只要他们遇到一个严格的白名单。你需要检查两件事情:
应该允许用户在磁盘上读写哪些文件?例如,这可能是一个特定的目录,文件名可能必须有一个合适的前缀或扩展名。
用户能够在数据库中读/写哪些表?这通常由GRANT数据库中的s 定义,但是该函数现在以超级用户的身份运行,所以通常是“越界”的表将被完全访问。你可能不想让别人调用你的函数,并在你的“用户”表的最后添加行..."
相似问题