我正在使用Ruby on Rails开发数据仓库,我应该允许用户在应用程序数据库上执行任意SELECT查询。
我知道这是你通常不应该做的,但它是我的客户端实际需要的接口(我无法想到用户可能想要做的所有可能的查询并将它们转换为ActiveRecord查询)。可能存在复杂的连接和子查询等。 我宁愿这样做(将它集成到我的应用程序),而不是让他们通过pgAdmin访问数据库(我正在使用postgresql)。
我的问题是:最安全的做法是什么?我应该能够逃脱INSERT,UPDATE,DROP TABLE等等......
我正在考虑获取查询字符串并清理这些“危险”单词,然后使用ActiveRecord :: Base.connection.execute(sanitized_sql_string)。 这是一种合理的方法吗?
答案 0 :(得分:3)
最安全的方法是让Postgres为您处理此安全问题。创建一个新用户:
CREATE USER Reader; -- Your Rails app should logon with this user
然后,明确授予您希望他们能够查询的对象的SELECT
权限:
GRANT INSERT ON TableFoo TO Reader;
GRANT INSERT ON TableBar TO Reader;
然后,他们将能够从这两个表中运行任意SELECT
个查询,但如果他们尝试INSERT
,他们将获得权限被拒绝。你然后可以捕获这些安全异常并在您的UI中适当地处理它们。
答案 1 :(得分:1)
创建应用程序,然后创建数据库。
在此之后,在您的数据库配置(database.yml
)中,使用某个非默认用户连接到数据库,例如lame_user
。在您的RDBMS上创建此lame_user
,在您的情况下为PostgreSQL,并且仅授予他对所有表的SELECT权限。
您现在将拥有可以访问您的数据库的用户postgres
和lame_user
,但只有postgres
可以执行所有操作。
如果用户尝试除SELECT之外的任何其他操作,则会发生错误。
恢复:使此应用程序约束成为数据库事物。这会更容易。