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

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

480902 次浏览

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

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

虽然规范没有规定任何最大长度,但实际的限制是由web浏览器和服务器软件施加的。根据研究,不幸的是,在其原来的网站上不再可用(它导致一个可疑的贷款网站),但仍然可以在Boutell.com的互联网档案上找到:

    <李> < p > # EYZ0
    限制似乎在81578个字符左右。看到# EYZ0 < / p > <李> < p > # EYZ0
    它在64k字符后停止显示 URL,但可以服务超过100k字符。

    <李> < p > # EYZ0
    在Windows Firefox 1.5.x中,超过65536个字符后,位置栏将不再显示URL。但是,更长的url也可以。

    <李> < p > # EYZ0
    至少8万个字符就可以了。

    <李> < p > # EYZ0
    至少190,000个字符就可以了。19万字符后停止测试。Windows版Opera 9继续显示完全可编辑的, 在位置栏中复制和粘贴URL,即使在190,000个字符 <李> < p > # EYZ0
    微软声明,Internet Explorer中URL的最大长度为2083个字符,URL的路径部分不超过2048个字符。尝试使用超过这个长度的url会在Internet Explorer中产生一个明确的错误消息 <李> < p > # EYZ0
    早期在web浏览器中测量最大URL长度的尝试碰到了服务器URL长度限制大约4000个字符,在此之后Apache产生了“413 Entity Too large”。错误。使用了Red Hat Enterprise Linux 4中最新的Apache版本。Apache官方文档只提到了请求中单个字段的8192字节限制 <李> < p > # EYZ0
    默认限制是16384个字符(是的,微软的网络服务器接受比微软的网络浏览器更长的url)。

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

推荐的安全性和性能最大: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攻击,但这是可以采取的一个步骤。

添加注释中要求的引用: # EYZ0 < / p >