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

Bri*_*van 523 browser max query-string

它依赖于浏览器吗?另外,不同的Web堆栈对于从请求中获取的数据量有不同的限制吗?

Rob*_*ino 948

RFC 2616(超文本传输​​协议 - HTTP/1.1)规定查询字符串的长度没有限制(第3.2.1节).RFC 3986还声明没有限制,但表明由于DNS限制,主机名限制为255个字符(第2.3.3节).

虽然规范没有规定任何最大长度,但Web浏览器和服务器软件会施加实际限制.根据Boutell.com上的研究结果:

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

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

  • Chrome
    它在64k字符后停止显示 URL,但可以提供超过10万个字符.除此之外没有进行进一步的测试.

  • Firefox(浏览器)
    65,536个字符后,位置栏不再显示Windows Firefox 1.5.x中的URL.但是,较长的网址可以使用.100,000个字符后没有进一步测试.

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

  • Opera(浏览器)
    至少可以使用190,000个字符.在190,000个字符后停止测试.Opera 9 for Windows继续在位置栏中显示完全可编辑,可复制和可粘贴的URL,即使是190,000个字符.

  • Apache(服务器)
    早期尝试测量Web浏览器中的最大URL长度会导致服务器URL长度限制大约为4,000个字符,之后Apache会生成"413 Entity Too Large"错误.使用了目前在Red Hat Enterprise Linux 4中发现的最新Apache构建版本.官方Apache文档仅提到请求中单个字段的8,192字节限制.

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

  • Perl HTTP ::守护进程(服务器)
    最多8,000个字节.那些使用Perl的HTTP :: Daemon模块构建Web应用程序服务器的人将在所有HTTP请求头的组合大小上遇到16,384字节的限制.这不包括POST方法表单数据,文件上载等,但它确实包含URL.实际上,当URL明显长于8,000个字符时,这会导致413错误.可以轻松删除此限制.在Daemon.pm中查找所有出现的16x1024,并用更大的值替换它们.当然,这确实会增加您遭受拒绝服务攻击的风险.

  • 为什么不说版本号而不是"Microsoft Internet Explorer(浏览器)"? (7认同)
  • 看来,查询字符串上的默认IIS限制明显少于16,384个字符 - 在此处引用为2048:https://www.iis.net/configreference/system.webserver/security/requestfiltering/requestlimits (5认同)

Tro*_*ven 6

尽管正式没有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>
Run Code Online (Sandbox Code Playgroud)

注意:限制查询字符串和URL长度可能无法完全阻止慢速HTTP请求DDOS攻击,但这是您可以采取的第一步。

  • 现在我有理由告诉后端工程师,我们不会接受 GET 请求的 queryParams 中包含一百个 36 字符 UUID 的列表。谢谢! (5认同)
  • @Morderd - 我想最好的解决方案是限制请求中的 UUID。我认为将 UUID 放入查询中虽然丑陋,但却是最佳实践。某些数据库引擎(例如 ElasticSearch)将 UUID 放入 GET 请求的正文中,但这并不标准化,并且某些 Web 框架会忽略 GET 上的正文。我还经常看到 API 使用 POST 请求而不是发送 UUID,这还有其他缺点 - GET 与 POST 根本不同 - 因此您最终会破坏一些专为 GET 请求设计的功能,例如缓存。 (3认同)
  • @MaulikModi 是的。它本质上是“/get/records-by-id?ids=10000000001,1000000002,....”的“简单”后端查询,但 ID 当然是 UUID。 (2认同)