Postgresql 只允许对Postgres角色计数?
我需要为其他人创建一个Postgres用户来查询我的数据库,但不能让他们看到列的值,因为它是敏感数据,他们应该只能看到计数。他们需要能够使用where子句的许多不同的可能排列来计算where。有什么办法可以做到这一点吗?我认为处理这一案件唯一足够灵活的办法就是一个新的解决方案。基本上,这些函数中的查询的行为就好像它们是由函数的所有者而不是函数的调用者运行的,从而允许调用者执行通常没有权限的事情(以受控的方式) 当然,您需要小心在其中运行的内容,并且在将任何用户输入合并到查询中时,您需要格外偏执,如果您希望调用方指定自己的Postgresql 只允许对Postgres角色计数?,postgresql,roles,Postgresql,Roles,我需要为其他人创建一个Postgres用户来查询我的数据库,但不能让他们看到列的值,因为它是敏感数据,他们应该只能看到计数。他们需要能够使用where子句的许多不同的可能排列来计算where。有什么办法可以做到这一点吗?我认为处理这一案件唯一足够灵活的办法就是一个新的解决方案。基本上,这些函数中的查询的行为就好像它们是由函数的所有者而不是函数的调用者运行的,从而允许调用者执行通常没有权限的事情(以受控的方式) 当然,您需要小心在其中运行的内容,并且在将任何用户输入合并到查询中时,您需要格外偏执,
WHERE
子句,这将使事情变得困难。用户定义的函数可能是不可能的,因为像my_func(private_col)这样的约束可以简单地将其输入写入某个表中。但是一些无害的东西,如,其中private_col=1
,如果调用者设法潜入他们自己对=
操作符的定义,可能同样糟糕;在编写这样的函数时,请确保
除此之外,即使您有一个完美的解决方案,此设置也可能不像看上去那样安全。您可能没有直接公开值,但仍然公开了有关值的信息,在几个查询过程中,这些信息足以重建值本身。例如:
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';
...
从私人_数据中选择计数(*),其中信用卡>='00000000'和信用卡<'50000000';
从私人_数据中选择计数(*),其中信用卡>='25000000'和信用卡<'50000000';
从私人_数据中选择计数(*),其中信用卡>='25000000'和信用卡<'37500000';
...
这只需要54个步骤就可以收敛到一个数字。即使是一个100个字符的字符串,通常也只需要几百个查询就可以确定下来。我认为处理这种情况唯一足够灵活的方法是一个字符串。基本上,这些函数中的查询的行为就好像它们是由函数的所有者而不是函数的调用者运行的,从而允许调用者执行通常没有权限的事情(以受控的方式) 当然,您需要小心在其中运行的内容,并且在将任何用户输入合并到查询中时,您需要格外偏执,如果您希望调用方指定自己的
WHERE
子句,这将使事情变得困难。用户定义的函数可能是不可能的,因为像my_func(private_col)这样的约束可以简单地将其输入写入某个表中。但是一些无害的东西,如,其中private_col=1
,如果调用者设法潜入他们自己对=
操作符的定义,可能同样糟糕;在编写这样的函数时,请确保
除此之外,即使您有一个完美的解决方案,此设置也可能不像看上去那样安全。您可能没有直接公开值,但仍然公开了有关值的信息,在几个查询过程中,这些信息足以重建值本身。例如:
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';
...
从私人_数据中选择计数(*),其中信用卡>='00000000'和信用卡<'50000000';
从私人_数据中选择计数(*),其中信用卡>='25000000'和信用卡<'50000000';
从私人_数据中选择计数(*),其中信用卡>='25000000'和信用卡<'37500000';
...
这只需要54个步骤就可以收敛到一个数字。即使是100个字符的字符串通常也只需要几百个查询就可以确定。这些
WHERE
子句是否需要引用敏感列?很遗憾,是的,否则我知道我只能访问非敏感列。这些WHERE
子句是否需要引用敏感列?不幸的是,是的,否则我知道我只能访问非敏感列。