SQLite代码分析

本文关键字:代码 SQLite | 更新日期: 2023-09-27 18:11:56

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

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

关于如何实现这一点有什么想法吗?有没有图书馆可以查这个什么的?我搜索了很多,但在6个月内没有找到任何解决方案。

SQLite代码分析

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

如果您对EXPLAIN执行SQL语句,您将得到一个包含虚拟机指令的结果集(而没有实际执行查询)。如果查看包含opcode = 'TableLock'的行,则p4列将给出受影响的表的名称。

图书馆?可能不会。你想要的软件很少存在。这通常意味着你必须自己构建它,或者没有。

你需要的是

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

使用经典的静态分析技术完成所有这些都很简单。如果你想编写自己的答案,你可能需要去学习这个

要在数据库上设置策略,可以使用编译时授权回调:

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

然而,你必须扩展你的c#数据库驱动程序,使这个API可用