我们目前在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一样。我不确定我们是否可以根据输入参数
答案 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"
您已经prms
将OracleParameter
添加到。
就使您的字段动态化,在服务器端创建一个有效列列表并根据它验证您的输入。只有当您确定该值是合法的时,才使用它来撰写查询。