3

我正在使用 Ruby on Rails 开发数据仓库,我应该允许用户对应用程序数据库执行任意 SELECT 查询。

我知道这是你通常不应该做的,但它是我的客户实际需要的接口(我想不出用户可能想要做的所有可能的查询并将它们转换为 ActiveRecord 查询)。可能有复杂的连接和子查询等等。我宁愿这样做(将它集成到我的应用程序中)而不是让他们通过 pgAdmin 访问数据库(我正在使用 postgresql)。

我的问题是:这样做最安全的方法是什么?我应该能够逃避任何东西,如 INSERT、UPDATE、DROP TABLE 等......

我正在考虑获取查询字符串并清理这些“危险”单词,然后使用 ActiveRecord::Base.connection.execute(sanitized_sql_string)。这是一个合理的方法吗?

4

2 回答 2

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,他们将获得Permission denied。 然后,您可以捕获这些安全异常并在您的 UI 中适当地处理它们。

于 2013-07-23T21:44:46.990 回答
1

创建应用程序,然后创建数据库。

之后,在您的数据库配置 ( database.yml) 中,使用一些非默认用户连接到数据库,例如lame_userlame_user在您的 RDBMS(在您的情况下为 PostgreSQL)上创建它,并仅授予他对您所有表的 SELECT 权限。
您现在将拥有可以访问您的数据库的用户postgres和用户,但只能执行所有操作。lame_userpostgres

如果用户试图做除了 SELECT 之外的任何事情,就会发生错误。

恢复:使此应用程序约束成为数据库事物。它会更容易。

于 2013-07-23T21:44:49.200 回答