它依赖于浏览器吗?此外,不同的 Web 堆栈对从请求中获取的数据量有不同的限制吗?
4 回答
RFC 2616(超文本传输协议 - HTTP/1.1)声明查询字符串的长度没有限制(第 3.2.1 节)。RFC 3986(统一资源标识符 — URI)也声明没有限制,但指出由于 DNS 限制,主机名限制为 255 个字符(第 2.3.3 节)。
虽然规范没有指定任何最大长度,但实际限制是由网络浏览器和服务器软件强加的。基于研究,不幸的是其原始网站上不再提供(它导致一个看似可疑的贷款网站),但仍然可以在 Boutell.com 的 Internet 档案中找到:
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 攻击,但这是您可以采取的阻止它的一个步骤。
不同的 Web 堆栈确实支持不同长度的 http 请求。我从经验中知道,早期的 Safari 堆栈仅支持 4000 个字符,因此由于 USER-STATE 而难以处理 ASP.net 页面。这甚至适用于 POST,因此您必须检查浏览器并查看堆栈限制是多少。我认为即使在较新的浏览器上您也可能会达到限制。我不记得但其中一个(我认为是 IE6)有 16 位限制,32,768 或其他限制。
2048 个字符
虽然官方没有RFC 2616指定限制,但许多安全协议和建议声明服务器上的maxQueryStrings 应设置为最大字符限制1024。而整个 URL(包括查询字符串)应设置为最多2048个字符。块引用
如果 URL超过100 个字符,则认为 URL太长。过长的 URL 可能会导致可用性和搜索引擎:包含关键字可能带来的任何潜在好处都将被稀释,因为它在总URL 文本中所占的比例很小。