쿼리 문자열의 가능한 최대 길이는 얼마입니까?


559

브라우저에 따라 다릅니 까? 또한 웹 스택마다 요청에서 얻을 수있는 데이터 양에 대해 다른 제한이 있습니까?



GET 요청에만 해당됩니다! POST 요청의 최대 크기 (multipart / form-data의 유무에 관계없이)는 여기서 알 수 없습니다!
peterh-복원 모니카

답변:


996

RFC 2616 (하이퍼 텍스트 전송 프로토콜-HTTP / 1.1)은 쿼리 문자열 길이에 제한이 없음을 나타냅니다 (섹션 3.2.1). RFC 3986 (Uniform Resource Identifier — URI)도 제한이 없지만 DNS 제한으로 인해 호스트 이름이 255 자로 제한됨을 나타냅니다 (섹션 2.3.3).

사양에는 최대 길이가 지정되어 있지 않지만 웹 브라우저와 서버 소프트웨어에 의해 실제 제한이 적용됩니다. 안타깝게도 원래 사이트에서 더 이상 사용할 수 없지만 그늘진 것처럼 보이는 대출 사이트로 이어지는 연구에 따르면 Boutell.com의 Internet Archive 에서 여전히 찾을 수 있습니다 .

  • Microsoft Internet Explorer (브라우저)
    Microsoft는 Internet Explorer에서 URL의 최대 길이가 2,083 자이며 URL의 경로 부분에 2,048자를 넘지 않는다고 말합니다. 이보다 긴 URL을 사용하려고하면 Internet Explorer에서 명확한 오류 메시지가 생성됩니다.

  • Microsoft Edge (브라우저)
    한도는 약 81578 자입니다. Microsoft Edge의 URL 길이 제한을 참조하십시오

  • Chrome 64k 자 이후에는 URL 표시를
    중지 하지만 100k 자 이상을 제공 할 수 있습니다. 그 이상의 테스트는 더 이상 수행되지 않았습니다.

  • Firefox (브라우저)
    65,536 자 이후 위치 표시 줄에 Windows Firefox 1.5.x의 URL이 더 이상 표시되지 않습니다. 그러나 더 긴 URL은 작동합니다. 10 만 자 이후에는 추가 테스트가 수행되지 않았습니다.

  • Safari (브라우저)
    80,000 자 이상이 작동합니다. 테스트는 그 이상으로 시도되지 않았습니다.

  • Opera (브라우저)
    190,000 자 이상이 작동합니다. 190,000 자 이후 테스트가 중지되었습니다. Windows 용 Opera 9는 190,000 자로도 위치 표시 줄에 완전히 편집 가능하고 복사 가능하며 붙여 넣기 가능한 URL을 계속 표시했습니다.

  • Apache (서버)
    웹 브라우저에서 서버 URL 길이 제한이 약 4,000 자 정도 인 초기 URL 길이를 측정하려고 시도한 후 Apache에서 "413 Entity Too Large"오류가 발생합니다. Red Hat Enterprise Linux 4에서 발견 된 최신 Apache 빌드가 사용되었습니다. 공식 아파치 문서에는 요청의 개별 필드에 대한 8,192 바이트 제한 만 언급되어 있습니다.

  • Microsoft Internet Information Server (서버)
    기본 제한은 16,384 자입니다 (예, Microsoft 웹 서버는 Microsoft 웹 브라우저보다 더 긴 URL을 허용합니다). 이것은 구성 가능합니다.

  • Perl HTTP :: Daemon (서버)
    최대 8,000 바이트가 작동합니다. Perl의 HTTP :: Daemon 모듈로 웹 애플리케이션 서버를 구성하는 경우 모든 HTTP 요청 헤더의 결합 된 크기에서 16,384 바이트 제한이 발생합니다. POST 방식 데이터, 파일 업로드 등은 포함되지 않지만 URL은 포함됩니다. 실제로 URL이 8,000자를 초과하면 413 오류가 발생했습니다. 이 제한은 쉽게 제거 할 수 있습니다. Daemon.pm에서 16x1024의 모든 항목을 찾아서 더 큰 값으로 바꾸십시오. 물론 이것은 서비스 거부 공격에 대한 노출을 증가시킵니다.


8
왜 "Microsoft Internet Explorer (브라우저)"대신 버전 번호를 말하지 않습니까?
LCJ

5
쿼리 문자열의 기본 IIS 제한은 16,384 자보다 훨씬 적습니다. 여기서 2048로 인용됩니다. iis.net/configreference/system.webserver/security/…
JTech


유형을 만들고 DNS 제한 사항은 2.2.3이 아니라 RFC3986의 "3.2.2 호스트"섹션에서 설명합니다. "URI 제작자는 DNS 사용이 명백하지 않은 경우에도 DNS 구문을 따르는 이름을 사용해야하며 이러한 이름을 255 자 이하로 제한해야합니다."
Craig Hicks

원인 java.lang.IllegalArgumentException: Request header is too large바람둥이 스프링 부팅 응용 프로그램 서버.
Paramvir Singh Karwal

12

공식적으로 RFC 2616에 의해 지정된 제한은 없지만 많은 보안 프로토콜 및 권장 사항에 따르면 서버의 maxQueryStrings는 최대 문자 제한 1024로 설정해야합니다. 쿼리 문자열을 포함한 전체 URL은 최대 2048로 설정해야합니다. 문자. 이것은 웹 서버에서 느린 HTTP 요청 DDOS 취약점을 방지하기위한 것입니다. 이는 일반적으로 Qualys Web Application Scanner 및 기타 보안 스캐너에 취약점으로 나타납니다.

Web.config가있는 Windows IIS 서버에 대한 아래 예제 코드를 참조하십시오.

<system.webServer>
<security>
    <requestFiltering>
        <requestLimits maxQueryString="1024" maxUrl="2048">
           <headerLimits>
              <add header="Content-type" sizeLimit="100" />
           </headerLimits>
        </requestLimits>
     </requestFiltering>
</security>
</system.webServer>

machine.config를 사용하여 서버 수준에서도 작동합니다.

참고 : 쿼리 문자열 및 URL 길이를 제한하면 HTTP 요청 속도 저하 DDOS 공격을 완전히 막을 수는 없지만이를 방지하기 위해 취할 수있는 한 단계입니다.


2
이제 백엔드 엔지니어에게 GET 요청의 queryParams에 백 36 개의 문자 UUID 목록을 허용하지 않을 것이라고 말할 이유가 있습니다. 감사!
Mordred

1

다른 웹 스택은 다른 길이의 http 요청을 지원합니다. Safari의 초기 스택은 4,000 자만 지원하므로 USER-STATE로 인해 ASP.net 페이지를 처리하는 데 어려움이 있음을 알고 있습니다. 이것은 POST 용이므로 브라우저를 확인하고 스택 제한이 무엇인지 확인해야합니다. 최신 브라우저에서도 한계에 도달 할 수 있다고 생각합니다. 기억할 수는 없지만 그중 하나 (IE6, 제 생각에는)는 16 비트 제한, 32,768 또는 기타 제한이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.