我需要为其他人创建一个Postgres用户来查询我的数据库,但由于它的敏感数据不能让他们看到列的值,他们应该只能看到计数。他们需要能够在where where子句的许多不同可能排列的情况下进行计数。有没有办法做到这一点?
答案 0 :(得分:0)
我认为处理这种情况的唯一灵活性就是SECURITY DEFINER
function。基本上,这些函数中的查询表现得好像它们是由函数的所有者运行,而不是函数的调用者,允许调用者做他们通常不会拥有的权限。 (以受控方式)。
当然,您需要注意在那里运行的内容,并且在将任何用户输入合并到您的查询中时,您需要异常偏执,这将使您的事情变得困难希望呼叫者指定自己的WHERE
子句。用户定义的函数可能是不可能的,因为像WHERE my_func(private_col)
这样的约束可以简单地将其输入写入某个表的某个地方。但是,如果调用者设法隐藏自己对WHERE private_col = 1
运算符的定义,那么像=
一样无害的东西也可能同样糟糕;写这样的函数时一定要lock down your search path。
除此之外,即使你有一个完美的解决方案,这个设置可能不像看起来那么安全。您可能不会直接公开这些值,但您仍然会公开关于值的信息,并且在几个查询过程中,这些信息足以重建值本身。例如:
SELECT COUNT(*) FROM private_data WHERE creditcard >= '00000000' AND creditcard < '50000000';
SELECT COUNT(*) FROM private_data WHERE creditcard >= '25000000' AND creditcard < '50000000';
SELECT COUNT(*) FROM private_data WHERE creditcard >= '25000000' AND creditcard < '37500000';
...
这只需要54步就可以收敛到一个数字。即使是100个字符的字符串,通常也只需要几百个查询来确定。