【问题标题】:Read only SQL.. Are there any DSL around? [closed]只读 SQL .. 周围有 DSL 吗? [关闭]
【发布时间】:2012-09-25 09:55:06
【问题描述】:

我们想授予我们的一些用户从数据库中读取他们想要的任何内容的权限,因此我们很感兴趣 - 是否有任何 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)

这与数据库引擎无关。我想要 language,它属于 SQL 的子家族,但没有像 DELETE 这样的危险词。

【问题讨论】:

  • 在您的数据库引擎中使用权限!
  • 根据您使用的数据库,有很多不同的答案“如何”,那么您使用的是什么数据库以及您是否使用 OR-M?
  • 您使用的是哪个 SQL 数据库?不同的数据库支持不同的访问控制机制。
  • “从数据库中读取任何他们想要的内容”。这听起来像是一个危险和/或限制性的设计......一个实际的例子将有助于塑造解决方案
  • 为什么你需要在你的 DSL 中进行数据库访问控制而不是使用你的数据库提供的控制?

标签: python sql django dsl


【解决方案1】:

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

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

【讨论】:

  • 其实我现在接受,答案是否定的,没有面向只读操作的 SQL 子语言。谢谢。 :)
【解决方案2】:

大多数 SQL 实现都允许您使用权限来控制访问和权限,通常使用 GRANTDENYREVOKE 等关键字

【讨论】:

  • +1,使用内置的访问控制
  • 不不不。它需要数据库管理,或与数据库的多个连接。我只想检查查询是否已清理。我知道GRANT - 它不适合这个任务。 :)
【解决方案3】:

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

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

编辑:

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

【讨论】:

  • 我考虑过制作类似if ['UPDATE', 'DELETE', 'INSERT'] in query 的东西,并在开始此解决方案后 - 决定询问 SQL 的子语言。 scala 的 sql dsl 有限 - github.com/p3t0r/scala-sql-dsl - 我想要 python 类似的东西。
  • 如果您要使用简单的if [...] in query 方法,我建议您再考虑一下。为整个痛苦世界做好准备。暂时忘记恶意用户,如果有人要构建一个完全合法的SELECT * FROM Person WHERE Status = 'DELETE';。我认为您现在面临构建自己的 SQL 解析器或挂钩到现有解析器的挑战……祝您好运!
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2017-08-25
    • 1970-01-01
    • 2014-09-06
    相关资源
    最近更新 更多