[Authorize]를 사용할 때 요청이 구성된 maxQueryStringLength를 초과합니다.


122

여기에 이미지 설명 입력
C #으로 된 MVC3 사이트가 있고 JavaScript 함수에서 쿼리 매개 변수가 제공되는 특정보기가 있으며 함수는 다음을 통해 사이트로 리디렉션됩니다.

window.location.href = "../ActionName?" + query_string;

query_string은 JavaScript 함수에 의해 구축 된 동적 쿼리 매개 변수 문자열입니다.

이 이상한 이유는 reportviewer 컨트롤 을 사용해야하기 때문에 동일한 함수가 URL을 ASP.Net 웹 양식으로 전달하는 경우가 있습니다. 대체 작업은이 경우 뷰에 전달하는 일부 매개 변수를 저장하는 것입니다. (말이 안되는 경우 더 자세히 설명 할 수 있음)

액션 메서드에 [Authorize]를 도입 할 때까지 모든 것이 잘 작동합니다. 제자리에 있으면 중단되고,없이 잘 작동하며, 다른 모든 방법에서는 [Authorize]가 잘 작동합니다.

이 경우 전체 URL은 길이가 966 자입니다. 연구 결과 maxQueryStringLength 값은 기본적으로 2048이지만 정수 유형의 값으로 재정의 할 수 있는 것으로 보이 므로 grins를 위해 다음을 추가했습니다.

<security>
  <requestFiltering>
    <requestLimits maxQueryString="2048"></requestLimits>
  </requestFiltering>
</security>

키 아래의 웹 구성 파일에 대한 키.

거기에는 기쁨이 없어서 우스꽝스러워서 4096으로 만들었지 만 여전히 기쁨이 없었습니다.

이제 전체 URL이 966 자이므로 권한 부여 속성이 1082-3130자를 추가 할 수는 없으므로 실제로 오류가 무엇인지 또는 설정이 적용되지 않는 이유를 어떻게 확인할 수 있습니까?

VS2010 Pro SP1


수신중인 자세한 오류 메시지를 추가하십시오.
카운슬러 벤

답변:


70

승인되지 않은 요청이 들어 오면 전체 요청이 URL로 인코딩되고 승인 양식에 대한 요청에 쿼리 문자열로 추가되므로 상황에 따라 문제가 발생할 수있는 위치를 알 수 있습니다.

MSDN에 따르면 web.config에서 maxQueryStringLength를 재설정하기 위해 수정해야하는 올바른 요소는 <httpRuntime>요소 내부의 <system.web>요소입니다. httpRuntime 요소 (ASP.NET 설정 스키마)를 참조하십시오 . 해당 요소를 수정 해보십시오.


1
아아, 올바른 위치에 배치하는 것이 트릭 인 것 같습니다. 충분한 지능을 사용하면 원래 게시 한 위치의 동일한 키로 안내합니다.
Saber

8
또한 알아두면 좋은 점은이 매개 변수의 최대 값이 2097151이라는 것입니다. 처음에는 Int32.MaxValue를 사용하려고했지만 런타임에 발생한 예외는 0에서 2097151 사이의 값을 사용하도록
지시했습니다


1
이 매개 변수의 최대 값을 2097151로 설정할 수 있지만 허용되는 최대 쿼리 길이에 영향을 미치는 다른 매개 변수가 있다고 생각합니다. 허용되지 않는이 최대 값보다 훨씬 짧은 쿼리 문자열이 있습니다. 길이는 3,393 자였습니다. 3,200 자 길이의 다른 쿼리가 제대로 작동했습니다.
markthewizard1234 2015

@ markthewizard1234 : 합의 :이 4096 2048에서 내 증가 하고있다 더 이상 나타나지 않습니다 너무 긴 쿼리 문자열을 404.something 원래 오류 메시지로 일부 영향을 미쳤다. 하지만 지금은, 코드 (400)와 또 다른 오류 메시지가 반환됩니다 또한 너무 긴 쿼리 문자열을 나타냅니다.
OR Mapper

213

web.config프로젝트 루트 의 system.web노드 아래 :

<system.web>
    <httpRuntime maxUrlLength="10999" maxQueryStringLength="2097151" />
...

또한 system.webServer노드 아래에 이것을 추가해야 하거나 긴 쿼리 문자열에 대한 보안 오류가 발생했습니다.

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...

1
이것을 열면 심각한 보안 결함이 발생합니까? maxurl 및 maxquery를 2097151로 설정하는 데 어떤 부정적인 영향이 있습니까?
Brian

1
브라이언, 좋은 질문입니다. 브라우저 제한 외에 쿼리 문자열에 더 긴 내용을 추가하는 것이 해로울 수있는 경우가 아니면 보안 결함을 볼 수 없습니다. 브라우저 최대 길이 쿼리 문자열이이 값보다 우선하는 것은 내가 대답 할 수없는 또 다른 질문입니다. 질문 해 주셔서 감사합니다. 여기있는 누군가가 이것에 대해 더 많은 것을 밝힐 수있을 것입니다.
theJerm

잠재적 인 DOS 취약점이 있다고 생각하지만 실제로 요청을 처리하는 방법에 따라 다릅니다. 한 번의 요청에 100 명의 사용자를 추가하려고 시도하는 동안이 문제가 발생했습니다. 어쨌든 일어나고 싶은 일이 아닙니다.
Martin

4
MVC 4 프로젝트에서 동일한 문제가 발생했기 때문에 이것은 내 문제를 즉시 해결했습니다. 위의 두 가지를 모두 추가하면 내 오류가 해결되었습니다. 정말 고맙습니다!!
Ed DeGagne 2012

3
마음 maxQueryString에 길이 바이트 4294967295의 최대 값 UINT 같은과 maxQueryStringLength에 길이 문자 (int)로하지만 0-2097151의 범위.
marsze

5

이 문제가 발생할 수 있고 위의 옵션 중 하나로 해결되지 않는 다른 사람에게는 이것이 저에게 효과적이었습니다.

1. Click on the website in IIS
2. Double Click on Authentication under IIS
3. Enable Anonymous Authentication

우리가 자체 인증을 사용하고 있었기 때문에 이것을 비활성화했지만 동일한 문제가 발생했으며 수락 된 답변이 어떤 식 으로든 도움이되지 않았습니다.


4

나는 datatables.net을 사용 하여이 오류가 있습니다.

DataTable ()의 te 속성에서 기본 ajax Get to POST 변경을 수정했습니다.

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },

나는 datatables도 사용하고 있었고 위의 제안을 성공적으로 시도하지 못한 후에이 트릭이 해냈습니다.
AidaM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.