2016-11-16 61 views
0

我們目前在Oracle DB中有一個視圖。目前,我創建了Web API來接受一個輸入參數並在where子句中的特定字段中使用它們。下面是該服務的代碼根據輸入參數動態地更改where子句

public HttpResponseMessage Getdetails(string JRS_NO) 
{ 

    List<OracleParameter> prms = new List<OracleParameter>(); 
    List<string> selectionStrings = new List<string>(); 
    string connStr = ConfigurationManager.ConnectionStrings["TGSDataConnection"].ConnectionString; 
    using (OracleConnection dbconn = new OracleConnection(connStr)) 
    { 
     DataSet userDataset = new DataSet(); 
     var strQuery = "SELECT * from LIMS_SAMPLE_RESULTS_VW where JRS_NO =" + JRS_NO; 

     var returnObject = new { data = new OracleDataTableJsonResponses(connStr, strQuery, prms.ToArray()) }; 
     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; 
    } 
} 

視圖有16列it.Like REQUEST_ID,JRS_NO,ROOM,SUBMITDATE,DOB等我檢查是否有離開我們可以得到任何字段作爲輸入參數,我們可以改變我們的where子句相應。 就像我們用api/TGSSampData?JRS_NO=379&SUBMITDATE='01-JAN-2016'api/TGSSampData?ROOM=111&DOB='22-AUG-2014'調用API一樣。我不知道我們是否能夠動態地根據輸入參數

回答

1

您的查詢是string被改變where子句,所以你當然可以然而修改你想要的,通過參數化的文本。您需要在您的操作方法中添加一個seconde參數。

一個完全不同的問題是,無論你應該更改where子句。這不能立即回答。您必須考慮您從HTTP請求字符串(它可以包含任何內容)接收您的條件。您的示例已經這樣做了,這是非常危險的:

var strQuery = "SELECT * from LIMS_SAMPLE_RESULTS_VW where JRS_NO =" + JRS_NO; 

您正在打開SQL注入的閘門。您未驗證您的JRS_NO並將其直接附加到您的查詢字符串。這是一個巨大的安全風險。如果您現在還使用動態列名組合字符串,則可以爲攻擊者提供可能性。

所以答案是:你可以讓你的代碼更加動態,但是你不應該像你一樣編寫查詢字符串。在查詢中,它可以保護你免受SQL注入有使用參數:

"SELECT * from LIMS_SAMPLE_RESULTS_VW where JRS_NO = @Value" 

您已經prms添加您OracleParameter到。

至於使您的字段動態,請在服務器端創建一個有效列的列表並根據它驗證您的輸入。只有在您確定該值是合法的情況下,纔可以使用它來撰寫查詢。