【问题标题】:User-generated SQL Query用户生成的 SQL 查询
【发布时间】:2013-07-23 04:33:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您说得对,让用户键入他们自己的 SQL 是很危险的。您可以锁定他们不能破坏您的数据库的权限,但您不能阻止他们错误地加入表,这可能会创建 失控查询。 Andyne (sp?) 曾经有一个名为 GQL(图形查询语言)的产品,它允许用户单击对象和线条以图形方式创建查询。它在幕后完成了创建良好 SQL 的工作。您可以采用类似的方法,以便用户 1) 不必了解您的数据库模型,以及 2) 不必了解 SQL 即可构建即席查询。
  • 您最好选择商店购买的产品,如水晶报表或业务对象。事实上,带有链接表的 Microsoft Access 并没有那么糟糕。
  • 我不知道,我可能一个人在这里,但我认为如果处理得当,允许临时查询是非常好的。这显然是一个强大的工具,仅适用于某些了解 SQL 的用户。一些蹩脚的编辑器总是有局限性;我还没有看到任何我发现可用的东西。如果使用得当,Postgres 的安全性非常好,您可以通过将查询超时设置为 5 秒左右来避免 失控查询。请记住,StackOverflow 实际上允许临时查询。

标签: sql ruby-on-rails ruby-on-rails-3 activerecord postgresql-9.1


【解决方案1】:

最安全的方法是让 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 中适当地处理它们。

【讨论】:

  • 您还需要对包含感兴趣的表的架构拥有GRANT 权限。这无疑是正确的做法。不过,您是否可以说服 Rails 为不同目的使用不同用户登录完全是另一回事..
  • 我喜欢这种方法。问题是,我需要使用不同的连接访问相同的模型,所以我最终需要在非只读环境中执行查询(我使用查询结果来更新其他模型)。我正在考虑做的是使用只读用户验证查询,然后将其保存以供将来实际使用。这听起来合理吗?
【解决方案2】:

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

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

如果用户尝试执行 SELECT 之外的任何操作,则会发生错误。

Resuming:使这个应用程序约束成为数据库的东西。会更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多