2014-11-12 4 views
0

SQL 주입에 취약한 잘못된 sql 쿼리를 수정하는 중입니다. 대부분은 입력이없는 직접 쿼리이지만 검색 필드에는 매개 변수가없는 검색어가 사용됩니다. 스 니펫은 다음과 같습니다 :ORMLite에서 임의의 수의 매개 변수 사용 쿼리

using (var db = ORMLite.Open()) 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append("select * from column1, column2"); 

    if (terms.Count() > 0) 
    { 
     sb.Append("where (column1 like '%@term0%' or " + column2 + " like '%@term0%') "); 
     if (terms.Count() > 1) 
     { 
      for (int i = 1; i < terms.Count(); i++) 
      { 
       sb.Append("and (column1 like '%@term" + i + "%' or " + column2 + " like '%@term" + i + "%') "); 
      } 
     } 
    } 

    List<POCO> testQuery = db.Select<POCO>(sb.ToString()); 
} 

내가 매개 변수를 사용하려는 곳 @term 구성 요소는 (그들이 형태 '" + term[i] + '" 될하는 데 사용,하지만 난 내 선택으로 이동하면 악성 코드가 어떤 용어가 바로 삽입됩니다. 매개 변수를 추가하고 싶습니다. 이것은 일반적으로 다음과 같이 수행됩니다 :

List testQuery = db.Select (sb.ToString(), new {term0 = "t", term1 = "te", term2 = "ter"});

그러나 임의의 수의 용어를 가질 수 있습니다 (term.count()는 용어의 수임). 임의의 수의 용어로 익명 객체를 전달할 수 있습니까? 아니면 여기에 더 좋은 방법이 있습니까?

답변

0

저는 PostgreSQL에서 거의 동일한 것을 찾고 있습니다. this SO question 에 대한 답변은 "여러 쿼리를 수행해야합니다."와 같습니다.

부분적으로 매개 변수화 된 쿼리를 사용하여 내 테이블에서 고유 한 행 ID를 가져온 다음 해당 고유 ID를 다시 쿼리에 직접 붙여 넣을 수 있습니다. 행 ID가 안전하므로이 ID를 직접 붙여 넣을 수 있습니다. 여기

무슨 뜻인지의 예,하지만 C#을 아마 잘못 (죄송합니다)입니다 :

string query = "SELECT unique_id FROM table WHERE (column1 LIKE '%@term%' OR column2 LIKE '%@term%')"; 
string safeIDs; 
List uniqueRowIDs = db.Select(query, new {term = term[0]}); 

for (int i = 1; i < terms.Count(); i++) { 
    // Loop to narrow down the rows by adding the additional conditions. 
    safeIDs = uniqueRowIDs.Aggregate((current, next) => current + string.Format(", '{0}'", next)); 

    uniqueRowIDs = db.Select(
      query + string.Format(" AND unique_id IN ({0})", safeIDs), 
      new {term = term[i]}); 
} 
// And finally make the last query for the chosen rows: 
safeIDs = uniqueRowIDs.Aggregate((current, next) => current + string.Format(", '{0}'", next)); 
List testQuery = db.Select(string.Format("SELECT * FROM table WHERE unique_id IN ({0});", safeIDs)); 

이 사건에 대한 또 다른 옵션은 특히 단지 사용 term0처럼 그 모든 값을 얻을 수 있었다 매개 변수가있는 쿼리를 실행 한 다음 C# 프로그램에서 의 결과를 사용자가 입력 한 나머지 조건과 비교하십시오.