ASP .NET 웹 API에서 매개 변수 배열 전달

asp.net asp.net-mvc asp.net-web-api dapper

문제

id의 배열이 전달되는 웹 API를 생성하고 OracleDB에서 결과를 반환합니다.

public class SampleController : ApiController
{
    public string Getdetails([FromUri] int []id)
    {
       string inconditons = "";
        for (int i = 0; i < id.Length; i++)
        {
            if (i == id.Length - 1)
            {
                inconditons = inconditons + id[i];
            }
            else
            {
                inconditons = inconditons + id[i] + ", ";
            }
        }
        using (var dbConn = new OracleConnection("DATA SOURCE=X;PASSWORD=03JD;PERSIST SECURITY INFO=True;USER ID=IN"))
        {
            dbConn.Open();
            var strQuery = @"Select PRIO_CATEGORY_ID as PRIO,LANG_ID as LANG, REC_DATE as REC, REC_USER as RECUSER, DESCR,COL_DESCR AS COL,ROW_DESCR as DROW,ABBR from STCD_PRIO_CATEGORY_DESCR where REC_USER  IN (" + inconditons + ");";
            var queryResult = dbConn.Query<SamModel>(strQuery);
            return JsonConvert.SerializeObject(queryResult);
        }
    }
}

API를 http : // localhost : 35432 / api / Sample? id = 1 & id = 83로 호출하면 var queryResult = dbConn.Query (strQuery);에서 오류가 발생합니다. 여기에 이미지 설명을 입력하십시오. 하지만 아래 매개 변수 하나만 입력하면 작동합니다.

var strQuery = @"Select PRIO_CATEGORY_ID as PRIO,LANG_ID as LANG, REC_DATE as REC, REC_USER as RECUSER, DESCR,COL_DESCR AS COL,ROW_DESCR as DROW,ABBR from STCD_PRIO_CATEGORY_DESCR where REC_USER  =" +id ; 

아무도 나에게 하나의 매개 변수로서 문제가 무엇인지 제안 해 주실 수 있습니까? 감사

수락 된 답변

귀하의 검색어에 빠진 문자가 없는지 확인하십시오.

의견에 언급 된 바와 같이

매개 변수가있는 쿼리를 사용하십시오. 그렇지 않으면이 SQL 인젝션 공격과 같은 오류에 취약합니다.

따라서 실행할 때 id 배열을 매개 변수화 된 쿼리에 전달하십시오.

다음은 리팩토링 된 예제입니다.

public class SampleController : ApiController {
    public string Getdetails([FromUri] int[] id) {
        var inconditions = id.Distinct().ToArray();
        using (var dbConn = new OracleConnection("DATA SOURCE=h;PASSWORD=C;PERSIST SECURITY INFO=True;USER ID=T")) {
            dbConn.Open();
            var strQuery = "SELECT PRIO_CATEGORY_ID AS PRIO, LANG_ID AS LANG, REC_DATE AS REC, REC_USER AS RECUSER, DESCR, COL_DESCR AS COL, ROW_DESCR AS DROW, ABBR FROM STCD_PRIO_CATEGORY_DESCR WHERE REC_USER  IN (:p)";
            var queryResult = dbConn.Query<SamModel>(strQuery, new { p = inconditions });
            return JsonConvert.SerializeObject(queryResult);
        }
    }
}

인기 답변

귀하의 코드는 나에게 잘 보인다. id 배열 매개 변수가 비어 있으면 오류가 발생할 수 있습니다 (그러나 지금 보는 것과는 다른 오류가됩니다). 코드에 중단 점을 넣고 그 값을 검사하십시오.

배열을 문자열로 변환하는 경우에도 String.Join 메서드를 사용할 수 있습니다.

var ids = String.Join(",",id);

이것은 당신의 int 배열이 3 개의 아이템, 1,3과 5를 가지고 있다고 가정 할 때 "1,3,5" 와 같은 결과를 줄 것입니다

이제이 문자열 변수를 쿼리에 사용할 수 있습니다. 또한이 데이터를 매개 변수로 전달할 수도 있습니다.

 var q= " ...  where REC_USER IN (@ids);" //Please fill the  missing part of query
 var result = con.Query<SomeModel>(q,new { ids });


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.