2012-10-04 100 views
2

我们想让我们的一些用户有权从数据库中读取他们想要的任何内容,所以我们感兴趣 - 是否有任何只支持SELECT,WHERE和JOIN运算符的SQL方言?只读SQL ..有没有DSL?

我们想利用这样的:

class MyModelWithSQLRule(models.Model): 
    sql_rule = models.TextField() 

    def what_data_i_will_get(self): 
     """ 
     Here we must get exception with attempt of query like 
     DELETE * FROM users_users; SELECT id FROM users_users; 
     """ 
     parsed_sql_rule = select_only_parser(self.sql_rule) 
     return Users.objects.raw(parsed_sql_rule) 

这不是数据库引擎。我想语言,在SQL的子族,但没有像DELETE危险的话。

+1

在数据库引擎中使用权限执行它! –

+1

根据你使用的数据库有很多不同的答案“如何”,所以你使用的是哪个数据库,并且你使用的是否是OR-M? –

+0

您正在使用哪个SQL数据库?不同的数据库支持访问控制的不同机制。 –

回答

4

根据你所说的关键词,答案是

什么你可以做的是为你的数据库设置2个连接字符串,1在数据库级设置为只读,另一个可以是读/写连接字符串,然后你只需要用适当的连接字符串构造一个数据库会话上下文。这使您在应用程序级别获得一定程度的安全性,但最终仍然依赖于数据库,因为会从中引发错误。

+0

其实我现在接受,答案是否定的,没有面向只读操作的SQL的子语言。谢谢。 :) –

1

大多数SQL实现将允许您使用权限来控制访问和权限,通常如GRANTDENYREVOKE

+0

+1,使用内置的访问控制 –

+0

不,不需要..它需要数据库管理,或多个连接到数据库。我只想检查该查询是否已过滤。我知道'GRANT' - 这不是为了这个任务。 :) –

1

如果您不希望数据库进行授权,我认为您必须将问题转移到使用SQL的编程语言。我知道没有SQL方言可以使用,只会允许非修改查询。

你怎么解析你的表达式,看看它是否使用任何禁止的关键字,如DELETE,UPDATE,INSERT等。解析(一大部分)SQL在Python中非常可行,我建议你看看代之以。 尽管我仍然认为只需要一个只读用户并通过单独的连接传递所有查询将会更简洁,更简单。

编辑:

也许你可以使用交易,但从来没有承诺呢?这对你有用吗?

+0

我曾考虑过在查询中使用'if'['UPDATE','DELETE','INSERT']和启动此解决方案之后 - 决定询问SQL的子语言。 scala的sql dsl数量有限 - https://github.com/p3t0r/scala-sql-dsl - 我想为Python这样的东西。 –

+0

如果你打算在查询中使用简单的'if'方法,我建议再想一想。设置自己的整个世界的痛苦。在某个时刻忘记恶意用户,如果有人构建完全合法的'SELECT * FROM Person WHERE Status ='DELETE';'。我认为你现在面临着构建你自己的SQL解析器或挂钩到现有的解析器的挑战......祝你好运! –

1

最简单的方法,如果你需要支持的是django - 就是编写你自己的数据库适配器来为你过滤查询。

这将允许你创建你自己的“sql语言”。

相关问题