/ search / <searchterm>을 통해 물건을 검색 할 수있는 경로가있는 ASP.NET MVC 응용 프로그램이 있습니다.
“search / abc”를 제공하면 잘 작동하지만 “/ search / a + b + c”(올바로 URL 인코딩)를 제공하면 IIS7은 HTTP 오류 404.11로 요청을 거부합니다 ( 요청 필터링 모듈은 이중 이스케이프 시퀀스가 포함 된 요청 ). 우선, 왜 이렇게합니까? URL의 일부이지만 쿼리 문자열의 일부가 아닌 경우에만 오류가 발생하는 것 같습니다 (/ transmit? q = a + b + c는 정상적으로 작동합니다).
이제 web.config의 보안 섹션에서 이중 이스케이프 요청을 활성화 할 수 있지만 그 의미를 이해하지 못하고 서버가 요청 “a + b + c”를 거부하지 않는 이유는 무엇입니까? URL의 일부이지만 쿼리 문자열의 일부로 허용합니다.
누군가 설명하고 조언을 해줄 수 있습니까?
답변
편집 : 관련 섹션에 강조를 추가했습니다.
기본적으로 IIS는 편집증이 심합니다. uri 디코딩 된 데이터 (예 : 문자열 연결을 통한 로컬 파일 시스템 URI 생성)에 대해 특히 현명하지 않은 작업을 수행하지 않는 경우이 검사를 안전하게 비활성화 할 수 있습니다.
확인을 비활성화하려면 다음을 수행하십시오 ( here ) : (이중 탈출에 대한 내용은 아래의 내 의견 참조).
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
</system.webServer>
더하기 기호가 검색 입력에서 유효한 문자 인 경우 IIS가 URI 경로에서 이러한 입력을 처리 할 수 있도록 “allowDoubleEscaping”을 활성화 해야 합니다.
마지막으로, 해결 방법이 제한되어 있다면 매우 간단합니다. 단순히 ‘+’를 피하고 대신 ‘% 20’을 사용하십시오. 어쨌든 공백을 인코딩하기 위해 ‘+’기호를 사용하는 것은 유효한 URL 인코딩 이 아니라 제한된 프로토콜 세트에만 적용되며 이전 버전과의 호환성을 위해 광범위하게 지원 될 수 있습니다. 정규화 목적으로 만 사용하는 경우 공간을 ‘% 20’으로 인코딩하는 것이 좋습니다. 그리고 이것은 IIS7 문제를 멋지게 회피합니다 (이는 % 25ab와 같은 다른 시퀀스에서 여전히 발생할 수 있습니다).
답변
질문 의 ” 무엇을해야할까요 “부분 과 관련된 Eamon Nerbonne의 답변 에 몇 가지 정보 를 추가 하고 싶습니다 (이유를 설명하지 않음).
당신은 쉽게 특정 응용 프로그램의 설정을 변경할 수 있습니다
- 관리자 권한으로 콘솔 열기 (시작-cmd-마우스 오른쪽 단추 클릭, 관리자 권한으로 실행)
-
다음을 입력하십시오 ( http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls- 포함 .aspx ) :
%windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
(당신은 대체 예 수
YOURSITENAME
와를Default Web Site
기본 웹 사이트에이 규칙을 적용하기위한) - 준비 됐어요
예를 들면 :
답변
‘/ search / a / b / c’와 같은 검색 URL이 있다고 생각하십니까?
당신은 같은 경로를 설정해야합니다
search/{*path}
그런 다음 작업의 경로 문자열에서 검색 값을 추출하십시오.
HTHs
찰스
답변
IIS 7.5에서 응용 프로그램에서 Server.TransferRequest ()를 수행 하여이 문제가 발생했습니다.
파일 이름을 인코딩하면 이중 이스케이프 문제가 발생했지만 인코딩하지 않으면 “잠재적으로 위험한 Request.Path” 오류가 발생합니다.
Server.TranferRequest ()에 전달한 URL에 빈 프로토콜이라도 프로토콜을 넣으면 문제가 해결되었습니다.
작동하지 않습니다 :
context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");
공장:
context.Server.TransferRequest("://folder/bar%20bar.jpg");