2

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

我们想像这样使用它:

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.

4

4 回答 4

4

根据你所说的,答案是否定的。

您可以做的是为您的数据库设置 2 个连接字符串,其中 1 个在数据库级别设置为只读,另一个可能是读/写连接字符串,然后您只需要使用适当的连接构建数据库会话上下文细绳。这在您的应用程序级别为您提供了一定程度的安全性,但最终仍然依赖于数据库,因为将从那里抛出错误。

于 2012-10-04T11:19:10.877 回答
1

大多数 SQL 实现将允许您使用权限控制访问和权限,通常使用关键字,例如GRANT,DENYREVOKE

于 2012-10-04T11:11:17.680 回答
1

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

你只是解析你的表达式,看看它是否使用了任何被禁止的关键字,比如 DELETE、UPDATE、INSERT 等。解析(很大一部分)SQL 在 Python 中是非常可行的,我建议你研究一下。尽管我仍然认为创建只读用户并通过单独的连接传递所有查询会更干净、更容易。

编辑:

也许您可以使用事务但从不提交它们?这对你有用吗?

于 2012-10-04T11:24:08.687 回答
1

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

这将允许您创建自己的“sql 方言”。

于 2012-10-04T11:34:24.197 回答