2012-05-15 2 views
5

내 프로덕션 ASP.NET MVC 3 사이트에서 가끔 "잠재적으로 위험한 Request.Path 값이 클라이언트에서 감지되었습니다 (%). . " Windows 응용 프로그램 로그에서 처리되지 않은 예외가 발생했습니다.유효한 URL이있는 ASP.NET MVC "잠재적으로 위험한 Request.Path"

이들은 정규 사이트 사용 (즉, 임의의 웹 봇)에서 완벽하게 유효하지만 많은 요청은 유효한 지역 ISP 사용자의 것으로 보입니다. 예외의 요구 사항에

, 요청 URL은 요청 경로와 다른 :

요청 URL : http://www.somesite.com/Images/Image Space.jpg

요청 경로 :/이미지/Imagehttp : // WWW. Space.jpgWithhttp와 somesite.com/Images/Image : Space.jpgSpace.jpg

통지 //www.somesite.com/Images/Image는 "요청 경로"에서, 어떤 장소가 있다는 " space "는 정확한 복사본으로 대체됩니다. 요청 URL의! 이 원인이 될 수있는 어떤

<img src="/Images/Image%20With%20Space.jpg" /> 

어떤 생각 : 사이트 내에서

은 실제 링크는 다음과 같습니다? Request.Path 및 Request.Url에 대한 설명서를 보려고했지만 왜 다른 것일 수 있는지 알 수 없습니다. 요청 URL을 직접 입력하면 리소스가 올바르게 표시됩니다.

업데이트 :

리퍼러 : 나는 IIS 7.0의 실패한 요청 추적 기능을 사용하여 고장 요청 중 하나의 추적을 얻을 수 있었다 Google 검색을

사용자 에이전트 : 모질라/5.0 (아이 패드, 맥 OS X와 ​​같은 CPU OS 5_1_1) AppleWebKit/534.46 (게코 같은 KHTML) 버전/5.1 모바일/9B206 사파리/7534.48.3

RequestURL : http://www.somesite.com:80/Images/Image%20With%20Space.jpg

iOS 5.1.1에 수동으로 URL을 입력하면 이미지가 올바르게 표시됩니다. Google 이미지에서 이미지를 검색하면 이미지가 올바르게 표시됩니다. 여전히 성공적인 재생산은 없습니다.

운행하는 도중에 아래로 내가 볼 추적 :

MODULE_SET_RESPONSE_ERROR_STATUS 경고. MODULENAME = "RequestFilteringModule"통지 = "BEGIN_REQUEST"는 HttpStatus는 "404", HttpReason = "발견되지 않음"HttpSubStatus 요청에서 IIS '문서 404.11에 따라 필터링 모듈은 "11",

이다 = URL에 "이중 인코딩"오류가 있습니다. 예를 들어 http://www.somesite.com/Images/Image%2520With%2520Space.jpg과 같이 이중으로 인코딩 된 URL을 의도적으로 만들면 조작 된 요청 경로로 완료되는 이벤트 로그에 정확한 오류가 표시됩니다.

잘못된 형식의 요청 경로가 이벤트 로그에 오류가 ASP.NET 4.0에서 버그로 나타납니다.

그러나 처음부터 오류가 발생하는 이유는 설명하지 않습니다. 많은 수의 실패한 요청 로그를 확인했습니다. 유일한 공통점은 모두 AppleWebKit을 사용하고 있다는 것입니다.사파리의 버그일까요?

+0

http://stackoverflow.com/questions/5682160/a-potentially-dangerous-request-path-value-was-detected-from-the-client 및 http://stackoverflow.com/questions/6025522/getting - 잠재적으로 위험한 요청 경로 값 - 클라이언트에서 발견되었습니다. – VJAI

+0

URL이 유효하고 MVC/IIS가 조정이나 수정없이 처리합니다. 이는 간단한 요청 유효성 검사 문제가 아닙니다. 위의 오류에 표시된 요청 경로를주의 깊게 살펴보십시오. – ShadowChaser

+0

저는 개인적으로 서버에 공백이있는 파일/페이지를 허용하지 않습니다. 나는 항상 공백을 -로 대체한다. –

답변

1

Web.Config의 httpRuntime 섹션을 수정하여 URL 유효성을 조정할 수 있습니다. ASP MVC 프로젝트는 일반적으로 유효성 검사 모드 2.0에서 실행되며 기본 유효하지 않은 문자 (쉼표로 구분)가 아래에 나열되어 있습니다.

<httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" /> 

% 기호는 유효하지 않은 것으로 간주됩니다. 검증 오류를 일으키는 공간을 % 20으로 인코딩 할 수 있습니다. requestPathInvalidCharacters 특성을 Web.Config 파일의 httpRuntime 섹션에 추가하고 "%"부분을 제외하고 아래에 나열된 값을 복사하면됩니다.

스콧 Hanselman은이 문제에 대한 블로그 게시물이 있습니다 - 제한된 사용자 에이전트가 주어 - 나는 그런 생각을 떨칠 수 없습니다

http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx

+0

불행히도, 나는 그게 문제라고 생각하지 않습니다. 브라우저에 URL을 입력하면 % 20 값으로 완료됩니다. IIS 및 MVC는 요청을 처리하고 기본 요청 유효성 검사를 비활성화하거나 변경하지 않고 올바르게 처리합니다. 모든 테스트에서 URL이 작동합니다. 오류를 자세히 살펴보면 비정상적인 동작이 발생하며 URL의 복사본을 모든 공간에 배치하는 것이 있습니다. – ShadowChaser

+0

흥미롭게도 요청이 ASP.NET 4.0에 도착하기 전에 문제가 발생하고있는 것처럼 보입니다. 디버거에 중단 점을 넣으면 Request.Path는 백분율 기호를 표시하지 않고 공백 문자가있는 완전히 디코딩 된 URL을 포함합니다. 처리되지 않은 예외가 URL에서 % 문자를 감지하면 ASP.NET에서 발생합니다. 즉, 어떤 이유로 든 IIS 7.0은 URL을 잘못 또는 처음부터 잘못된 형식으로 디코딩합니다. 이벤트 로그에 아무 것도 "실제"(원본) 인코딩 된 URL이 표시되지 않습니다. – ShadowChaser

1

을이 해당 브라우저에 의해 URL의 잘못된 취급을 나타낼 수 IOS 5.1.1. 나는 개인적으로 그러한 장치를 소유하고 있지 않으므로 이것을 시험 할 수는 없다. 그러나 실제로 URL 대신 공백이있는 것으로 어떻게 작동하는지 조사하는 것은 흥미로울 것이다.

페이지 소스의 URL에 %20이 표시되어있어 이중 인코딩하는 것이 도움이된다고 생각합니다. 문제는 IIS가 공간을 대신하여 문자 그대로 %20을 볼 수 있기 때문에 IIS가 ASP.net이 실행되기 전에 다시 디코딩하여 문제가 발생한다는 것입니다.

개인적으로 서버의 보안 설정을 수정하지 않는 것이 좋습니다. 그러나 그것은 가장 쉬운 해결책이 될 것이므로 나는 그것이 당신이 무엇을 할 것이라고 말합니다.

오히려이 '버그'(Apple의 변호사로부터 안전한 은신처를 찾는 길)를 확인할 수 있다면이 장치에서 작동하는 형식을 찾으십시오. 또는 귀하의 리소스 URL에서 모든 공간을 가져 가라. -이 최선의 대안입니다.

+2

에 대한 소스 코드 Safari에서 이미지 요청과 동일한 것을 찾는 중입니다. 인코딩은 "?"입니다. url은 경로의 일부로 취급되므로 asp.net은 "Wahh, 누군가가 경로에 물음표를 넣어 해킹하려고 시도하고 있습니다!"라고 말하고 있습니다. 내가 생각하는 특정 경로에 대해 물음표없이 URL을 사용하도록 리팩터링해야 할 것입니다 ... – MajorRefactoring

관련 문제