查询字符串的最大可能长度是多少?


Answers:


995

RFC 2616(超文本传输​​协议,HTTP / 1.1)指出,查询字符串的长度没有限制(第3.2.1节)。RFC 3986(统一资源标识符URI)也声明没有限制,但是由于DNS限制(第2.3.3节),指示主机名限制为255个字符。

尽管规范未指定任何最大长度,但是实际的限制是由Web浏览器和服务器软件强加的。基于不幸的是,该研究基于它的原始站点不再存在(它导致了阴暗的贷款站点),但仍可以在Boutell.com的Internet档案中找到:

  • Microsoft Internet Explorer(浏览器)
    Microsoft声明Internet Explorer中URL的最大长度为2,083个字符,URL的路径部分中最多不超过2,048个字符。尝试使用比此更长的URL会在Internet Explorer中产生明确的错误消息。

  • Microsoft Edge(浏览器)
    限制似乎是大约81578个字符。请参阅Microsoft Edge的URL长度限制

  • Chrome浏览器
    停止显示 URL的64k个字符,但可以提供超过100k个字符。除此之外,没有进一步的测试。

  • Firefox(浏览器)
    65,536个字符后,位置栏不再显示Windows Firefox 1.5.x中的URL。但是,较长的URL将起作用。100,000个字符后未进行进一步的测试。

  • Safari(浏览器)
    至少可以使用80,000个字符。除此之外,没有尝试过测试。

  • 歌剧(浏览器)
    至少需要190,000个字符。190,000个字符后停止测试。Windows的Opera 9继续在位置栏中显示一个完全可编辑,可复制和可粘贴的URL,即使是190,000个字符也是如此。

  • Apache(服务器)
    早期尝试测量Web浏览器中最大URL长度的尝试使服务器URL长度限制达到大约4,000个字符,此后Apache产生“ 413 Entity Too Large”错误。使用了在Red Hat Enterprise Linux 4中找到的最新Apache构建。Apache的官方文档仅提及请求中单个字段的8192字节限制。

  • Microsoft Internet信息服务器(服务器)
    的默认限制为16,384个字符(是的,Microsoft的Web服务器接受的URL比Microsoft的Web浏览器更长的URL)。这是可配置的。

  • Perl HTTP :: Daemon(服务器)
    最多可以使用8,000个字节。使用Perl的HTTP :: Daemon模块构造Web应用程序服务器的所有HTTP请求标头的组合大小将遇到16,384字节的限制。这不包括POST方法的表单数据,文件上传等,但是包含URL。实际上,当URL明显长于8,000个字符时,这会导致413错误。此限制可以轻松消除。在Daemon.pm中查找所有出现的16x1024,然后将其替换为较大的值。当然,这确实会使您更容易遭受拒绝服务攻击。


8
为什么不说版本号而不是“ Microsoft Internet Explorer(浏览器)”呢?
LCJ 2014年

5
看来查询字符串的默认IIS限制明显少于16,384个字符-此处引用为2048:iis.net/configreference/system.webserver/security/…– JTech
2016年


我认为您输入了一种类型,并且DNS限制在RFC3986(而非2.2.3)的“ 3.2.2。主机”部分中进行了讨论。“即使不立即使用DNS,URI生产者也应使用符合DNS语法的名称,并且应将这些名称的长度限制为不超过255个字符。”
Craig Hicks

原因java.lang.IllegalArgumentException: Request header is too large在tomcat spring boot应用服务器上。
Paramvir Singh Karwal,

12

尽管正式没有RFC 2616规定的限制,但是许多安全协议和建议指出服务器上的maxQueryStrings应该设置为最大字符限制1024。而整个URL(包括querystring)应该设置为最大2048。字符。这是为了防止Web服务器上的“ HTTP请求缓慢DDOS”漏洞。这通常在Qualys Web应用程序扫描程序和其他安全扫描程序上显示为漏洞。

请参阅以下带有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列表。谢谢!
莫德雷德

1

不同的Web堆栈确实支持不同长度的http请求。我从经验中知道,Safari的早期堆栈仅支持4000个字符,因此由于USER-STATE而难以处理ASP.net页面。这甚至适用于POST,因此您必须检查浏览器并查看堆栈限制。我认为即使在较新的浏览器上,您也可能会达到极限。我不记得了,但是其中一个(我想是IE6)有16位限制,32,768或类似的限制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.