是否有可能在PostgreSQL中过滤查询?
问题描述:
我想访问的用户名+密码表限制在一个查询模式,如:是否有可能在PostgreSQL中过滤查询?
SELECT count(id) AS auth_result
FROM user
WHERE username = '%s'
AND password = SHA1('%s')
(此查询不假装从注入漏洞,只是一个例子点工作)
那可能吗?还是我错过了一些不同的方法?
答
您可以撤消所有用户,只拥有者所有访问user
表,并创建一个视图,像这样:
create view auth_view as
select id, username, sha1(password) as sha1pass
from user;
然后你的查询将是这样的:
select count(id)
from auth_view
where username = '%s'
and sha1pass = sha1('%s')
其他可能性可能会使用PostgreSQL's rule system来重写或避免user
表中某些查询之王。但我不确定你在这里做什么。
答
我建议你写一个函数,并使其成为SECURITY DEFINER。参见例如http://www.hagander.net/talks/hidden%20gems%20of%20postgresql.pdf,第28-36页。
我想排除用这种有限帐户转储用户表的可能性。视图方法仍允许转储所有用户名和散列密码。 – forker 2010-09-21 15:46:21
然后你可以写一个函数。您的函数将接收用户/密码,并且如果用户/传递组合匹配,则返回true/false ... – 2010-09-21 16:18:03