2016-10-05 65 views
1

我想知道,如何解析SQLIte查詢,並將其標記爲獲得未來在執行查詢後受到影響的條目,以便能夠在單個SQLite數據庫上設置策略?SQLite代碼分析C#

到目前爲止,我已經創建了一個接受模塊的項目。還有一個SQLite數據庫。我的目標是創建一個控制器,它將接收來自每個模塊的查詢,並從本質上檢查是否允許此模塊更改數據庫中的特定事物。

有關如何完成此任何想法?有沒有任何圖書館?我搜查了很多,但在6個月內沒有找到任何解決方案。

+2

這聽起來像一個XY問題。當然,問題_「如何找出SQL查詢要觸及哪個表和行」是可以回答的,但答案將不實際。你想做什麼_exactly_?那些「模塊」是什麼以及是誰創造的?有一個原因(例如)插件系統公開一個API,而不是原始數據源。 – CodeCaster

+0

看來你是對的。我非常關注解析sql查詢,完全忽略了創建一個可以完成這項工作的api的可能性。我猜我傻了。 – Devian

+1

這聽起來與[授權回調](http://www.sqlite.org/c3ref/set_authorizer.html)相似。 –

回答

1

解析SQLite查詢的最簡單方法是讓SQLite自己運行它們。

如果繼續使用EXPLAIN的SQL語句,將會得到一個包含虛擬機指令(而不是實際執行查詢)的結果集。如果您查看具有opcode = 'TableLock'的行,則p4列將顯示受影響的表的名稱。

1

一個庫?可能不會。您希望的軟件很少存在。這通常意味着你必須自己構建或者沒有。

你需要的是

  • SQL查詢分析器,
  • 的用戶功能的解析器(它允許用戶更新其表/列,
  • 一個SQL分析器,它可以告訴該用戶可能運行了一下SQL的,哪些表/字段中的SQL被修改。

做這一切的是簡單的使用傳統的靜態分析技術,你可能要學點讀筆他如果你想編碼自己的答案。

0

要在數據庫上設置的策略,你可以使用一個Compile-Time Authorization Callback:在編譯過程中

在不同的點,爲正在創建的邏輯來執行各種操作時,授權調用回調函數,看看那些行動是允許的。授權人回調應該返回SQLITE_OK以允許操作SQLITE_IGNORE禁止特定的操作,但允許繼續編譯SQL語句,或者SQLITE_DENY導致整個SQL語句被拒絕並出現錯誤。

授權人員在準備來自不受信任源的SQL語句時使用,以確保SQL語句不會嘗試訪問他們不被允許查看的數據,或者他們不會嘗試執行損壞數據庫。

需要處理來自不受信任來源的SQL的應用程序還可能考慮使用sqlite3_limit()降低資源限制,並使用max_page_count PRAGMA限制數據庫大小以及使用授權程序。

但是,您必須擴展您的C#數據庫驅動程序才能使此API可用。