2011-12-12 103 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(); 
} 
相关问题