【问题标题】:SQLite Code Analysis C#SQLite 代码分析 C#
【发布时间】:2016-10-05 17:51:06
【问题描述】:

我想知道,我如何解析 SQLite 查询并将其标记化,以便在执行查询后获得未来受影响的条目,以便能够在单个 SQLite 数据库上设置策略?

到目前为止,我已经创建了一个接受模块的项目。并且有一个单一的 SQLite 数据库。我的目标是创建一个控制器,它将接收来自每个模块的查询,并从本质上检查是否允许该模块更改数据库中的特定内容。

关于如何做到这一点的任何想法?有没有这个或什么的图书馆?我进行了很多搜索,但在 6 个月内没有找到任何解决方案。

【问题讨论】:

  • 这听起来像是一个 XY 问题。当然,“如何找出 SQL 查询将命中哪些表和行” 的问题是可以回答的,但答案将被证明是不切实际的。您要究竟做什么?这些“模块”是什么?谁创建了它们?有一个原因(例如)插件系统公开 API,而不是原始数据源。
  • 看来你是对的。我非常专注于解析 sql 查询,完全忽略了创建一个可以完成这项工作的 api 的可能性。我猜我很傻。
  • 这听起来类似于authorize callback

标签: c# sqlite parsing tokenize code-analysis


【解决方案1】:

解析 SQLite 查询的最简单方法是让 SQLite 自己运行它们。

如果您使用EXPLAIN 继续执行 SQL 语句,您将获得一个包含虚拟机指令的结果集( 没有实际执行查询)。如果您查看具有opcode = 'TableLock' 的行,p4 列将为您提供受影响的表的名称。

【讨论】:

    【解决方案2】:

    图书馆?可能不是。您想要的软件很少存在。这通常意味着您必须自己构建它或不使用它。

    你需要的是

    • SQL 查询解析器,
    • 用户能力解析器(允许哪个用户更新哪些表/列,
    • 一个 SQL 分析器,可以判断哪个用户可能正在运行一些 SQL,以及 SQL 正在修改哪些表/字段。

    使用经典的静态分析技术可以轻松完成所有这些工作。如果您想编写自己的答案,您可能需要学习这一点。

    【讨论】:

      【解决方案3】:

      要对数据库设置策略,您可以使用Compile-Time Authorization Callback

      在编译过程的各个阶段,当创建逻辑以执行各种操作时,将调用授权回调以查看是否允许这些操作。授权回调应返回 SQLITE_OK 以允许该操作,SQLITE_IGNORE 以禁止特定操作但允许 SQL 语句继续编译,或 SQLITE_DENY 导致整个 SQL 语句被拒绝并出现错误。
      […]
      在从不受信任的来源准备 SQL 语句时使用授权器,以确保 SQL 语句不会尝试访问它们不允许查看的数据,或者它们不会尝试执行损坏数据库的恶意语句。
      […]
      需要处理来自不受信任来源的 SQL 的应用程序除了使用授权者外,还可以考虑使用 sqlite3_limit() 降低资源限制并使用 max_page_count PRAGMA 限制数据库大小。

      但是,您必须扩展您的 C# 数据库驱动程序才能使该 API 可用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多