SQLite代码分析C#
SQLite Code Analysis C#
我想知道,我如何解析 SQLIte 查询,并将其标记化,以便在查询执行后获得未来受影响的条目,以便能够在单个 SQLite 数据库上设置策略?
到目前为止,我已经创建了一个接受模块的项目。并且有一个 SQLite 数据库。我的目标是创建一个控制器,它将接收来自每个模块的查询,并从本质上检查是否允许该模块更改数据库中的特定内容。
关于如何实现这个的任何想法?有没有这方面的图书馆?我进行了很多搜索,但在 6 个月内没有找到任何解决方案。
图书馆?可能不会。您想要的软件很少存在。这通常意味着您必须自己构建或不构建它。
你需要的是
- SQL 个查询的解析器,
- 用户能力解析器(允许哪个用户更新哪个tables/columns,
- 一个 SQL 分析器,可以判断哪个用户可能 运行 有点 SQL,以及哪个 tables/fields SQL 正在修改。
使用经典的静态分析技术可以很简单地完成所有这些工作。如果你想编写自己的答案,你可能需要去学习这个。
解析 SQLite 查询的最简单方法是让 SQLite 本身 运行 它们。
如果您使用 EXPLAIN
继续执行 SQL 语句,您将得到一个包含虚拟机指令的结果集( 没有 实际执行查询).如果您查看具有 opcode = 'TableLock'
的行,p4
列将为您提供受影响的 table 的名称。
要在数据库上设置策略,您可以使用 Compile-Time Authorization Callback:
At various points during the compilation process, as logic is being created to perform various actions, the authorizer callback is invoked to see if those actions are allowed. The authorizer callback should return SQLITE_OK to allow the action, SQLITE_IGNORE to disallow the specific action but allow the SQL statement to continue to be compiled, or SQLITE_DENY to cause the entire SQL statement to be rejected with an error.
[…]
An authorizer is used when preparing SQL statements from an untrusted source, to ensure that the SQL statements do not try to access data they are not allowed to see, or that they do not try to execute malicious statements that damage the database.
[…]
Applications that need to process SQL from untrusted sources might also consider lowering resource limits using sqlite3_limit() and limiting database size using the max_page_count PRAGMA in addition to using an authorizer.
但是,您必须扩展 C# 数据库驱动程序才能使此 API 可用。
我想知道,我如何解析 SQLIte 查询,并将其标记化,以便在查询执行后获得未来受影响的条目,以便能够在单个 SQLite 数据库上设置策略?
到目前为止,我已经创建了一个接受模块的项目。并且有一个 SQLite 数据库。我的目标是创建一个控制器,它将接收来自每个模块的查询,并从本质上检查是否允许该模块更改数据库中的特定内容。
关于如何实现这个的任何想法?有没有这方面的图书馆?我进行了很多搜索,但在 6 个月内没有找到任何解决方案。
图书馆?可能不会。您想要的软件很少存在。这通常意味着您必须自己构建或不构建它。
你需要的是
- SQL 个查询的解析器,
- 用户能力解析器(允许哪个用户更新哪个tables/columns,
- 一个 SQL 分析器,可以判断哪个用户可能 运行 有点 SQL,以及哪个 tables/fields SQL 正在修改。
使用经典的静态分析技术可以很简单地完成所有这些工作。如果你想编写自己的答案,你可能需要去学习这个。
解析 SQLite 查询的最简单方法是让 SQLite 本身 运行 它们。
如果您使用 EXPLAIN
继续执行 SQL 语句,您将得到一个包含虚拟机指令的结果集( 没有 实际执行查询).如果您查看具有 opcode = 'TableLock'
的行,p4
列将为您提供受影响的 table 的名称。
要在数据库上设置策略,您可以使用 Compile-Time Authorization Callback:
At various points during the compilation process, as logic is being created to perform various actions, the authorizer callback is invoked to see if those actions are allowed. The authorizer callback should return SQLITE_OK to allow the action, SQLITE_IGNORE to disallow the specific action but allow the SQL statement to continue to be compiled, or SQLITE_DENY to cause the entire SQL statement to be rejected with an error.
[…]
An authorizer is used when preparing SQL statements from an untrusted source, to ensure that the SQL statements do not try to access data they are not allowed to see, or that they do not try to execute malicious statements that damage the database.
[…]
Applications that need to process SQL from untrusted sources might also consider lowering resource limits using sqlite3_limit() and limiting database size using the max_page_count PRAGMA in addition to using an authorizer.
但是,您必须扩展 C# 数据库驱动程序才能使此 API 可用。