2017-10-14 60 views
0

假设我有(过简化,非安全)表,看起来像:保护柱/键选择呼叫

CREATE TABLE users (id SERIAL PRIMARY KEY, user VARCHAR(25), _password VARCHAR(25), email VARCHAR(80)); 

我想对阻止其返回的列_password添加一个额外的故障安全在SELECT * FROM users调用中,这在PostgreSQL中是可能的,如果是这样,怎么做?

我试过https://stackoverflow.com/a/7250991/929999的一些版本,但这可能不是我所期待的。但是这让我想到可能会有一个可以创建的约束。我找不到任何人试过这个或之前问过它,所以我有点失落,因为我不是一个数据库专家。

因此,现在我将数据库中的所有结果转储到Python中的自定义字典占位符中,并使用名为.safe_dump()的函数删除从_<key>开始的所有密钥。

而且我想我可以创建一个包含敏感关键字的列表一个单独的表,并通过JOIN或类似匹配那些在每个SELECT说法,但是这将只是移动的不慎从SELECT检索敏感关键风险呼吁保持该“JOIN表”更新。

PostgreSQL中是否有一个标志可以过滤掉尝试访问某个键的块调用,同时仍然允许在WHERE x=y子句中使用它?

+0

视图或选择规则 –

+0

@ a_horse_with_no_name我想我可以创建一个选择规则与https://dba.stackexchange.com/questions/1957/sql-select-all-columns-except-some结合删除某些密钥? – Torxed

+0

首先,密码不应该作为纯文本存储。 – jira

回答

2

您可以拒绝准许该列:

CREATE TABLE users (
    id SERIAL PRIMARY KEY, 
    "user" VARCHAR(25), 
    _password VARCHAR(25), 
    email VARCHAR(80) 
); 

REVOKE ALL ON users FROM laurenz; 

GRANT SELECT (id, "user", email) ON users TO public; 

test=> SELECT * FROM users; 
ERROR: permission denied for relation users 
test=> SELECT id, "user", email FROM users; 
id | user | email 
----+------+------- 
(0 rows) 

如果你宁愿要排除从输出列,使用一个观点:

CREATE VIEW users_v AS SELECT id, "user", email FROM users; 

GRANT SELECT ON users_v TO PUBLIC; 
+0

不应该从公共场所撤销...? – klin

+0

@klin我应该提到,我是以用户laurenz的身份连接的......从'PUBLIC'撤销权限没有任何意义,因为'PUBLIC'没有授予该表的权限。我撤销了我自己(表格的所有者)的权利,因为否则以我作为所有者的默认权利,我将无​​法证明其效果。 –

+0

是的,它没有任何意义,只是在第一次看起来似乎不清楚。 – klin