【发布时间】: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