2009-08-12 2 views
3

DataView RowFilter 속성을 사용하여 AppRelativeCurrentExecutionFilePath를 기반으로 캐싱 된 DataTable을 필터링하는 처리기를 작성하고 있습니다. 주입 공격을 방지하기 위해 입력을 인코딩하는 가장 좋은 방법은 무엇입니까?.NET DataView RowFilter에 대한 인젝션 공격

다음 중 충분한 것이 있습니까? 더 나은 /보다 우아한 방법이 있습니까?

dataView.RowFilter = String.Format("Name LIKE '{0}%'", EncodeString(query)); 

private string EncodeString(string s) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < s.Length; i++) 
    { 
     char c = s[i]; 
     if (c == '*' || c == '%' || c == '[' || c == ']') 
      sb.Append("[").Append(c).Append("]"); 
     else if (c == '\'') 
      sb.Append("''"); 
     else 
      sb.Append(c); 
    } 

    return sb.ToString(); 
} 
+0

난 단지 ... 당신이 여기에 SQL을 삽입 할 수 있다고 생각하지 않습니다 : 지적했듯이, 다음과 같은 작업 같은 것을 수 주입하여 테이블의 모든 행을 얻을 수 있습니다 예외가 발생합니다. 그러나 그렇습니다. 그것은 제가하는 일입니다. – dotjoe

+0

메모리 내 데이터를 사용하는 경우 어떤 컬렉션이 아닌 왜 'DataTable'을 사용해야합니까? 당신은'Where'로 그것을 걸러 낼 수있을 것이고 주사 만 신경 쓰지 않아도 될 것입니다. –

+0

@SergRogovtsev - '09 년에 질문을했습니다. 아마도 .NET 1.1 앱이었을 것입니다. 기업은 업그레이드 속도가 느립니다. – MyItchyChin

답변

0

RowFilter에는 sql을 삽입 할 수 없습니다.

편집 :

dataTable.AsEnumerable() 
    .Where(r => r.Field<string>("StringColumn").Contains(userInput)) 
    .ToList().ForEach(r => Console.WriteLine(r.Field<string>("StringColumn"))); 
+0

RowFilter는 SQL Where 절과 매우 유사한 문자열이며 사용자 입력에서 필터 문자열을 구성하는 경우 주입을 통해 악용 될 수 있습니다. 내 예제에서는 URL (예 : http : // site/handler/stringUsedInFilter)을 기반으로 DataTable을 필터링하고 있으며 필터는 LIKE 비교이므로 "처리기 /"다음에 아무 것도 "% 25 % 25 % 25 % 25 % 25 "는 테이블의 전체 내용을 반환하기 위해 최소 길이와 빈 문자열 검사를 무시합니다. " '"는 필터가 유효하지 않게하고 예외를 발생시킵니다. 등등 ... – MyItchyChin

+0

네, 보호해야 할 전체 테이블을 반환하지 않으려면. 테이블 전체가 반환되는 경우 또는 보호 할 수있는 경우가 있습니까? –

+0

@Yuriy : 필터를 입력하려는 입력이 실제로 %%%%%일까요? 그것은 그들에게 많은 도움이되지 않을 것입니다. 입력이 오브라이언이라면? 그러면 SyntaxErrorException이 발생합니다. 입력을 필터링해야합니다. – MyItchyChin