【问题标题】:What is the maximum possible length of a query string?查询字符串的最大可能长度是多少?
【发布时间】:2010-10-23 05:05:25
【问题描述】:

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

【问题讨论】:

标签: browser max query-string


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    RFC 2616(超文本传输​​协议 — HTTP/1.1)声明查询字符串的长度没有限制(第 3.2.1 节)。 RFC 3986 (Uniform Resource Identifier — URI) 也声明没有限制,但表示由于 DNS 限制,主机名限制为 255 个字符(第 2.3.3 节)。

    虽然规范没有指定任何最大长度,但实际限制是由网络浏览器和服务器软件强加的。基于研究,不幸的是,在其原始网站上不再可用(它导致一个看似可疑的贷款网站),但仍然可以在 Internet Archive Of Boutell.com 找到:

    • Microsoft Edge(浏览器)
      限制似乎是大约 81578 个字符。见URL Length limitation of Microsoft Edge

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

    • Firefox(浏览器)
      在 65,536 个字符之后,位置栏不再显示 Windows Firefox 1.5.x 中的 URL。但是,更长的 URL 也可以。 100,000 个字符后没有进行进一步测试。

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

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

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

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

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

    • Perl HTTP::Daemon(服务器)
      最多 8,000 个字节可以工作。那些使用 Perl 的 HTTP::Daemon 模块构建 Web 应用程序服务器的人将遇到所有 HTTP 请求标头的总大小限制为 16,384 字节。这不包括 POST 方法的表单数据、文件上传等,但它确实包括 URL。实际上,当 URL 明显超过 8,000 个字符时,这会导致 413 错误。这个限制可以很容易地消除。在 Daemon.pm 中查找所有出现的 16x1024 并将它们替换为更大的值。当然,这确实会增加您遭受拒绝服务攻击的风险。

    【讨论】:

    • 为什么不说版本号而不是“Microsoft Internet Explorer(浏览器)”?
    • 似乎 IIS 对查询字符串的默认限制明显少于 16,384 个字符 - 此处引用为 2048:iis.net/configreference/system.webserver/security/…
    • 我认为您创建了一个类型,并且 DNS 限制在 RFC3986 的“3.2.2. Host”部分中讨论,而不是 2.2.3。 “URI 生产者应该使用符合 DNS 语法的名称,即使 DNS 的使用不是很明显,并且应该将这些名称的长度限制为不超过 255 个字符。”
    • 在tomcat spring boot应用服务器上导致java.lang.IllegalArgumentException: Request header is too large
    【解决方案3】:

    推荐的安全性和性能最大值:2048 个字符

    虽然官方没有 RFC 2616 规定的限制,但许多安全协议和建议规定服务器上的 maxQueryStrings 应设置为最大字符数限制 1024。而整个 URL(包括查询字符串)应设置为最多 2048 个字符。这是为了防止 Web 服务器上的慢速 HTTP 请求 DDOS/DOS 攻击漏洞。这通常显示为 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 的服务器级别。

    这仅适用于基于 windows 操作系统的服务器,我不确定 apache 或其他服务器上是否存在类似问题。

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

    【讨论】:

    • 现在我有理由告诉后端工程师,我们不会接受 GET 请求的 queryParams 中包含 100 个 36 个字符的 UUID 的列表。谢谢!
    • @Mordred,这个 API 是做什么用的 - 在查询参数中接收 100 个 UUID?它是一种过滤 UI 吗?
    • @MaulikModi 是的。它本质上是/get/records-by-id?ids=10000000001,1000000002,.... 的“简单”后端查询,但 ID 当然是 UUID。
    • @Morderd - 我想最好的解决方案是限制请求中的 UUID。我认为将 UUID 放在查询中,虽然丑陋,但却是最佳实践。一些数据库引擎(例如 ElasticSearch)将 UUID 放在 GET 请求的主体中,但这不是标准化的,并且一些 Web 框架会忽略 GET 上的主体。我还经常看到 API 使用 POST 请求来发送 UUID,它还有其他缺点 - GET 与 POST 根本不同 - 所以你最终会破坏一些为 GET 请求设计的功能,例如缓存。跨度>
    • 有什么方法可以参考一些关于此的安全建议示例?
    【解决方案4】:

    2048 个字符

    虽然官方没有限制RFC 2616 指定,但许多 安全协议和建议声明 ma​​xQueryStrings 服务器上的最大字符数限制应设置为 1024。 而整个 URL,包括查询字符串,应该设置为 最多 2048 个字符。 块引用

    如果 URL 超过 100 个字符,则认为它太长过长的网址会导致可用性和搜索引擎:包含关键字可能会带来的任何潜在好处 被稀释,因为它占总 URL 的比例很小 文本。

    【讨论】:

    • 您能否分享一些有关安全协议建议的参考资料?
    猜你喜欢
    • 2011-12-01
    • 2010-09-13
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多