根据输入参数

时间:2016-11-16 12:27:37

标签: c# asp.net asp.net-web-api

我们目前在Oracle DB中有一个视图。目前我创建了Web API来接受一个输入参数并在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列。像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一样。我不确定我们是否可以根据输入参数

动态更改where子句

1 个答案:

答案 0 :(得分:1)

您的查询是string,因此当然您可以通过参数化文本来修改它。您需要在操作方法中添加一个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"

您已经prmsOracleParameter添加到。

就使您的字段动态化,在服务器端创建一个有效列列表并根据它验证您的输入。只有当您确定该值是合法的时,才使用它来撰写查询。