2011-12-12 143 views
3

什麼是評估C#中的SQL語句,以確定它不僅僅是選擇? - 即 - 如果語句稍後執行,則檢查值是否會更改(插入,更新,刪除,修改或刪除)。在C#中評估sql語句的最佳方法是什麼?

只要我可以使用C#dlls /函數即可使用的任何想法,或者這是我應該使用字符串分析技術編碼自己的東西嗎?

謝謝。

+1

什麼是用例?您正在評估用戶輸入的即席查詢(可能是惡意的),還是在應用程序內部實施某些內容? – mellamokb

+0

http://stackoverflow.com/questions/589096/parsing-sql-code-in-c-sharp? –

+0

用戶將輸入查詢,然後我的代碼將執行查詢(如果它被確定爲非惡意,並且不修改數據源)。 – Chris

回答

12

我會使用db權限。創建一個只有讀取訪問權限的數據庫用戶,然後,執行除SELECT之外的任何查詢都將失敗。

+2

+1更好的回答:) – mellamokb

+3

小小的警告 - 即使是一個'SELECT'可以削弱服務器...一個交叉加入或7應該是足夠的... –

+0

嗯 - 這是他必須做出的折衷,如果他想要安全地檢查查詢是否要更改數據。嘗試解析SQL會產生一個問題世界,只是在等待注入攻擊。 –

1

一種方法是使用事務,然後回滾,具有明顯的限制(可能無法在複雜查詢上工作,例如在其他更新之間返回多個結果集,並且對使用非回滾的查詢無效像DBCC命令 - 可能想要捕捉異常以及類似情況):

using(SqlConnection sqlConn = new sqlConnection(CONNECTION_STRING)) 
{ 
    sqlConn.Open(); 
    using (SqlTransaction trans = sqlConn.BeginTransaction()) 
    { 
     // execute code and see if rows are affected here 
     var query = " ... " ; 
     var cmd = new SqlCommand(query, sqlConn); 
     var rowsAffected = cmd.ExecuteNonQuery(); 
     if (rowsAffected > 0) { ... } 

     // roll back the transaction 
     trans.RollBack(); 
    } 
    sqlConn.Close(); 
} 
相關問題