ChatGPT解决这个技术问题 Extra ChatGPT

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

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

它仅适用于 GET 请求! POST 请求的最大大小(有或没有 multipart/form-data)在这里是未知的!

C
Community

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

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

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

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 继续在地址栏中显示完全可编辑、可复制和可粘贴的 URL,即使是 190,000 个字符。

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

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

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

Perl HTTP::Daemon (Server) 最多 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
T
TroySteven

建议的安全性和性能最大值:2048 个字符

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

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

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

根据评论中的要求添加参考: https://www.raiseupwa.com/writing-tips/what-is-the-limit-of-query-string-in-asp-net/


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

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


Y
Yogi Ghorecha

2048 个字符

尽管官方没有 RFC 2616 规定的限制,但许多安全协议和建议规定服务器上的 maxQueryStrings 应设置为最大字符限制 1024。而整个 URL(包括查询字符串)应设置为最大 2048人物。 Blockquote 如果 URL 超过 100 个字符,则认为它太长。过长的 URL 会导致可用性和搜索引擎:包含关键字可能带来的任何潜在好处都将被稀释,因为它在整个 URL 文本中所占的比例很小。


您能否分享一些有关安全协议建议的参考资料?