它依赖于浏览器吗?此外,不同的 Web 堆栈对从请求中获取的数据量有不同的限制吗?
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 并将它们替换为更大的值。当然,这确实会增加您遭受拒绝服务攻击的风险。
建议的安全性和性能最大值: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/records-by-id?ids=10000000001,1000000002,....
的“简单”后端查询,但 ID 当然是 UUID。
不同的 Web 堆栈确实支持不同长度的 http 请求。我从经验中知道,早期的 Safari 堆栈仅支持 4000 个字符,因此由于 USER-STATE 而难以处理 ASP.net 页面。这甚至适用于 POST,因此您必须检查浏览器并查看堆栈限制是多少。我认为即使在较新的浏览器上您也可能会达到限制。我不记得但其中一个(我认为是 IE6)有 16 位限制,32,768 或其他限制。
2048 个字符
尽管官方没有 RFC 2616 规定的限制,但许多安全协议和建议规定服务器上的 maxQueryStrings 应设置为最大字符限制 1024。而整个 URL(包括查询字符串)应设置为最大 2048人物。 Blockquote 如果 URL 超过 100 个字符,则认为它太长。过长的 URL 会导致可用性和搜索引擎:包含关键字可能带来的任何潜在好处都将被稀释,因为它在整个 URL 文本中所占的比例很小。
java.lang.IllegalArgumentException: Request header is too large
。