2012-07-06 1 views
5

this question과 유사하지만 어떤 문자가 오류를 일으키지 않겠습니까? 현재 문자열이 위의 오류 메시지를 발생시키는 경우, 내가 전화 할 수있는 방법, 자신을 확인하는 방법에 관해서 더 궁금합니다.문자열이 화재 여부를 확인하는 방법 "잠재적으로 위험한 Request.Form 값이 감지되었습니다 ..."오류

배경을 조금 부여하려면 사용자가 암호를 잊어 버렸고 재설정해야 할 때 임의의 암호를 생성합니다. 불행히도, 임의 암호 생성기는 최근 "&#"이라는 암호를 "실수로"생성했습니다. 이로 인해 사용자가 로그인하려고 할 때 페이지가 중단되었습니다.

이 주제에 관한 많은 게시물에서 언급했듯이 ValidateRequest=false (또는 .NET 4.0의 경우 <httpRuntime requestValidationMode="2.0" />)을 사용하면 .NET 악성 코드 검사를 사용하지 않도록 설정할 수 있지만이 추가 레이어를 잃을만한 이유는 없습니다. 보안 내가 처음에는 문자열을 만드는 사람입니다. 불완전한 목록 (<, &# 등)에서 무작위 추출기를 다시 무작위로 생성한다고 말하면 가장 똑똑한 솔루션처럼 보이지 않으므로 .NET에서 사용하는 것과 동일한 검사 방법을 사용하고 싶습니다.

악용에 대한 Microsoft의 설명과 이에 대한 방어 조치가 here입니다.

This guy 반사경으로 조사한 후 IsDangerousString이라는 기능을 찾는데 대해 이야기하지만이 기능을 사용하려면 찾을 수 없습니다. 또한 그는 .NET 1.1을 말하는 중이며 .NET 3.5를 사용하고 있습니다.

+0

흥미로운 질문,하지만 난 당신이 그런 모호한 문자를 포함 할 이유가 표시되지 않습니다. 아마도 RandomNumberGenerator 클래스를 사용하여 바이트 []를 채운 다음 z-base32 인코더를 사용하여 바이트를 문자열로 인코딩해야합니다. – Shelakel

+2

당신은 "익스플로잇"문자를 알고 싶습니다. 왜 html로 인코딩하기 전에 인코딩하고 html로 해독해야합니까? – HatSoft

+0

@Shelakel 물론, 임의의 암호를 생성 할 수있는 많은 방법이 있습니다. 그러나 불행히도 우리는이 프로젝트의 암호로 4 문자 규칙 (소문자, 대문자, 숫자, 특수 문자) 모두 4 개를 수행해야 할 필요가 있습니다. 물론 불쾌한 "모호한"문자는 제거 할 수 있지만 사양이 명확하지 않기 때문에 시스템에서 확인하는 것과 동일한 기능을 사용하고 싶습니다. – Mercurybullet

답변

5

요청을 확인하는 ASP.NET 클래스는 System.Web.CrossSiteScriptingValidation이고 원하는 메서드는 IsDangerousString입니다. 죄송 합니다만 두 가지 모두 internal으로 표시되므로 직접 액세스 할 수 없습니다. 몇 가지 옵션이 있습니다 :

옵션 1 : Reflection을 통해 IsDangerousString으로 전화하십시오. 그러나 Microsoft는 언제든지이 방법을 변경할 수 있으므로 응용 프로그램이 손상 될 수 있습니다.

옵션 2 :IsDangerousString을 디 컴파일하여 자신의 응용 프로그램에 복사하십시오. 아래 코드를 참조하십시오.

옵션 3 :Membership.GeneratePassword으로 전화하십시오. 이렇게하면 요청 유효성 검사를 통과 할 수있는 암호가 반환됩니다. (.NET 리플렉터를 통해) ASP.NET CrossSiteScriptingValidation 클래스

발췌 :

private static char[] startingChars = new char[] { '<', '&' }; 

internal static bool IsDangerousString(string s, out int matchIndex) 
{ 
    matchIndex = 0; 
    int startIndex = 0; 
    while (true) 
    { 
     int num2 = s.IndexOfAny(startingChars, startIndex); 
     if (num2 < 0) 
     { 
      return false; 
     } 
     if (num2 == (s.Length - 1)) 
     { 
      return false; 
     } 
     matchIndex = num2; 
     char ch = s[num2]; 
     if (ch != '&') 
     { 
      if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?')))) 
      { 
       return true; 
      } 
     } 
     else if (s[num2 + 1] == '#') 
     { 
      return true; 
     } 
     startIndex = num2 + 1; 
    } 
} 

private static bool IsAtoZ(char c) 
{ 
    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))); 
} 
+3

정보를 제공해 주셔서 감사합니다.함수가 내부이고 업데이트를 위해 함수에 직접 액세스 할 수 없기 때문에 ignoreCase를 사용하여 다음 정규식을 사용하지 않는 이유가 있습니까? '\ <[a-z! /?] | & #' – Mercurybullet

+0

정규식은 옵션 2와 동일하며, 훨씬 더 간결합니다. :-) 이것은 현재 당신이 할 수있는 최선의 방법 일 것입니다. 그러나 다음 버전의 ASP.NET에서는 [HttpRequest.Unvalidated] (http://msdn.microsoft.com/en-us/library/system.web)를 사용하여 특정 필드에 대한 유효성 검사를 건너 뛸 수 있습니다. .httprequest.unvalidated (v = VS.110) .aspx) 속성. –

관련 문제