我正在使用Rails开发一个数据仓库,我应该允许用户在应用程序数据库上执行任意的选择查询。
我知道这是您通常不应该做的事情,但这是我的客户实际需要的接口(我想不出用户可能想做的所有可能的查询,并将它们转换为ActiveRecord查询)。可能有复杂的联接和子查询等。我宁愿这样做(将它集成到我的应用程序中),也不愿让他们通过pgAdmin访问DB (我正在使用postgresql)。
我的问题是:这样做最安全的方法是什么?我应该能摆脱任何像插入,更新,删除表等.
我正在考虑获取查询字符串并清除这些“危险”单词,然后使用ActiveRecord::Base.connection.execute(sanitized_sql_string).这是否一个合理的方法?
发布于 2013-07-23 21:44:46
最安全的方法是让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中适当地处理它们。
发布于 2013-07-23 21:44:49
创建应用程序,然后创建数据库。
在此之后,在数据库配置(database.yml)中,使用一些非默认用户(比如lame_user )连接到数据库。在关系数据库管理系统上创建这个lame_user (在您的例子中是PostgreSQL ),并且只授予他对所有表的选择权限。
现在您将拥有用户postgres和可以访问数据库的lame_user,但是只有postgres才能完成所有的工作。
如果用户尝试执行SELECT以外的任何操作,则会发生错误。
恢复:将此应用程序约束设置为数据库。会更容易的。
https://stackoverflow.com/questions/17821493
复制相似问题