2016-08-03 85 views
0

我们创建了用于查询Oracle数据库的WebAPI。 API接收ID的字符串数组作为输入参数。下面是我们正在使用的API控制器,但建议使用命令参数来避免SQLite注入。下面是我们使用使用命令参数避免SQL注入

public HttpResponseMessage Getdetails([FromUri] string[] id) 
{ 
string connStr = ConfigurationManager.ConnectionStrings["ProDataConnection"].ConnectionString; 
using (OracleConnection dbconn = new OracleConnection(connStr)) 
{ 
    var inconditions = id.Distinct().ToArray(); 
    var srtcon = string.Join(",", inconditions); 
    DataSet userDataset = new DataSet(); 
    var strQuery = @"SELECT * from STCD_PRIO_CATEGORY where STPR_STUDY.STD_REF IN(" + srtcon + ")"; 
    using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) 
    { 
      using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand)) 
     { 
      DataTable selectResults = new DataTable(); 
      adapter.Fill(selectResults); 
      var returnObject = new { data = selectResults }; 
      var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); 
      ContentDispositionHeaderValue contentDisposition = null; 

      if (ContentDispositionHeaderValue.TryParse("inline; filename=ProvantisStudyData.json", out contentDisposition)) 
      { 
       response.Content.Headers.ContentDisposition = contentDisposition; 
      } 

      return response; 
     } 
    } 
} 
} 

我试着用搜索引擎就这个问题和发现

var strQuery = @"SELECT * from STCD_PRIO_CATEGORY where STPR_STUDY.STD_REF IN(@strcon)"; 
    using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) 
    { 
    using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand)) 
     {   
adapter.SelectCommand.Parameters.Add("@strcon",strcon); 

,我会被直接给予STRCON变量,其中我参加字符串数组的代码。我是新的C#和Asp.Net,非常感谢任何帮助。 谢谢

+1

没有您使用IN参数的示例是错误的。这将创建一个独特的值的字符串,不能在单个参数中解析 – Steve

+0

此链接显示几个选项:[http://stackoverflow.com/questions/541466/oracleparameter-and-in-clause](http://stackoverflowflow .com/questions/541466/oracleparameter-and-in-clause) –

回答

1

正如我的评论中所解释的,您不能为IN子句创建一个唯一的参数,并且所有值都需要用逗号分隔。这会创建一个字符串值,而不是要在您的STD_REF字段中搜索的ID列表。相反,您需要更长的方法,为每个值创建一个不同的参数并正确准备IN子句

List<OracleParameter> prms = new List<OracleParameter>(); 
var strQuery = @"SELECT * from STCD_PRIO_CATEGORY 
        where STPR_STUDY.STD_REF IN("; 

// Create a list of parameters and prepare the placeholders for the IN  
StringBuilder sb = new StringBuilder(strQuery); 
for(int x = 0; x < inconditions.Length; x++) 
{ 
    // Placeholder 
    sb.Append(":p" + x + ","); 

    // Parameter 
    OracleParameter p = new OracleParameter(":p" + x, OracleType.Int32); 
    p.Value = inconditions[x]; 
    prms.Add(p); 
} 

// Remove the last comma 
if(sb.Length > 0) sb.Length--; 
// Prepare the correct IN clause 
strQuery = sb.ToString() + ")"; 

using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) 
{ 
    // Add the whole set of parameters 
    selectCommand.Parameters.AddRange(prms.ToArray()); 
    using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand)) 
    {   
     DataTable selectResults = new DataTable(); 
     adapter.Fill(selectResults); 
     ..... 
+0

你好史蒂夫我无法找到System.Data.OracleClient.OracleParameter.dll作为参考添加。我在OracleParameter语句中出现错误 – user4912134

+0

Steve我按照你的建议尝试了,但没有获取数据我已经打开了一个新的问题http://stackoverflow.com/questions/38758637/web-api-using-command-parameters -is-not-returning-any-data here。我试图调试它不会返回任何错误,但没有数据返回。非常感谢您的帮助 – user4912134