2012-01-09 88 views
4

我正在創建一個postgreSQL數據庫閱讀器,其中還包括一個用戶鍵入自己的查詢的方法。我想通過檢查類型查詢是否包含任何修改代碼來保護數據庫。這是我的檢查:檢查只讀查詢字符串

private bool chech_unwanted_text(string query) 
    { 
     if (query.Contains("DELETE") || query.Contains("delete") || query.Contains("CREATE") || 
      query.Contains("create") || query.Contains("COPY") || query.Contains("copy") || 
      query.Contains("INSERT") || query.Contains("insert") || query.Contains("DROP") || 
      query.Contains("drop") || query.Contains("UPDATE") || query.Contains("update") || 
      query.Contains("ALTER") || query.Contains("alter")) 
     { 
      return false; 
     } 
     else return true; 
    } 

這是檢查是否有編輯安全查詢正確的方法或者是有其他的,更可靠的方式來實現這一目標?

我知道授予用戶權限,但這是行不通的,因爲我沒有超級用戶帳戶。

回答

9

您應該通過使用只讀訪問數據庫的帳戶來處理此問題,而不是通過檢查查詢。大多數DBMS都有一個特權機制來處理這種事情,PostgreSQL當然可以。

+0

我會嘗試得到一個現成的只佔HANDELING我的程序 – Moonlight 2012-01-09 10:55:46

0

看這一個短一點comparsion: Case insensitive 'Contains(string)'

基本上使之比較不區分大小寫(否則你將需要大量的代碼來檢查不同版本的刪除(刪除等)

此外,您可以建立與禁止的關鍵字和環通,也許一點點清潔的列表嗎?如果用戶需要查詢使用這些關鍵字的東西

會發生什麼?

SELECT IsDeleted FROM Users; 

也許你可以看看允許參數,或者根據查詢的複雜性(基於數據庫中的內容的一堆下拉列表)來查看允許參數或者可能構建自己的「查詢構建器」。

只是一些建議。

但是,您應該以任何可能的方式遵循關於只讀用戶的建議。

+0

我alreaddy有一個自己的編譯查詢的創造者,可以處理90%的全部你可能想要的東西,只是爲了實現一個'可插入'的查詢。使用case-insnesative的方式是一種方式,我會檢查何時只讀用戶不工作/沒有得到 – Moonlight 2012-01-09 10:48:49

+0

有關使用linq的帖子似乎是處理此問題的好選擇+也許某種形式的參數化查詢,如果根本可能的(但是,我猜你不需要首先編寫自定義查詢的功能)。 – Sverker84 2012-01-09 10:56:01

1

授予用戶輸入自己的查詢絕不是一個好主意。唯一可行的方法是授予他們只讀權限(您說你無法做到這一點)。

關於您的代碼段,一個更好的方法來檢查,如果您的查詢包含一個動詞使用LINQ:

private readonly string[] verbs = new string[] 
    { "delete", "create", "insert", ... }; 

private bool check_unwanted_text(string query) 
{ 
    // convert to lowercase 
    query = query.ToLowerInvariant(); 

    // can any verb be found in query? 
    return verbs.Any(v => query.Contains(v)); 
} 

不過沒有關係,我不會考慮使用此爲SQL消毒。

1

沒有可靠的一般方法來檢查給定的查詢是否正在改變數據庫內容,僅基於查詢文本。

考慮這個查詢:

SELECT * FROM myview; 

myview定義如下:

CREATE VIEW myview AS select foo, bar FROM myfunc(); 
1

如果你不能使該帳戶爲只讀,您仍然可以進行特定的事務讀 - 只有在事務開始後立即發出一條SET TRANSACTION READ ONLY SQL命令。 那麼任何試圖在本次交易修改數據會失敗的

ERROR: transaction is read only

+0

雖然它不是失敗保存,(用戶可以放在他們的查詢後面)是一個很好的選擇。 (我沒有使用這個,因爲我得到我的只讀帳戶後一些搞亂) – Moonlight 2012-01-10 07:41:30