我知道理论上HTTP头的大小没有限制,但在实践中,过了某个点后,我可能会在某些平台、浏览器或客户端计算机或机器上安装某些软件时遇到问题。我更希望得到使用HTTP头的安全实践指南。换句话说,可以在没有潜在问题的情况下使用HTTP头来传输其他数据的范围有多大?
感谢您对这个问题的所有输入,非常感激和有趣。托马斯的答案得到了悬赏,但是乔恩·汉纳的答案提出了一个关于代理的很好的观点。
感谢您对这个问题的所有输入,非常感激和有趣。托马斯的答案得到了悬赏,但是乔恩·汉纳的答案提出了一个关于代理的很好的观点。
简短回答:
行为是否相同:否
主流浏览器中找到的最低限制:
在运行 Mac OS X 10.6.4 的 MacBook 上测试结果:
成功加载的最大响应,所有数据都在一个头部中:
注意: 在 Opera、Safari 和 IE 中出现过于庞大的头部会花费几分钟的时间来加载。
注意 Chrome: 实际限制似乎是整个 HTTP 头部的256KB。 错误消息显示:"Error 325 (net::ERR_RESPONSE_HEADERS_TOO_BIG): Unknown error."
注意 Firefox: 通过多个头部发送数据时,100MB 的数据能够正常工作,只需分成10,000个头部即可。
我的结论: 如果您想要支持所有主流浏览器,则每个头部的大小限制为10KB,而所有头部的总大小限制为256KB。
生成这些响应的 PHP 代码:
<?php
ini_set('memory_limit', '1024M');
set_time_limit(90);
$header = "";
$bytes = 256000;
for($i=0;$i<$bytes;$i++) {
$header .= "1";
}
header("MyData: ".$header);
/* Firfox multiple headers
for($i=1;$i<1000;$i++) {
header("MyData".$i.": ".$header);
}*/
echo "Length of header: ".($bytes / 1024).' kilobytes';
?>
两件事。
首先,为什么不运行一个测试,逐渐增加浏览器的头部大小,并等待它达到无法工作的数字?只需在每个浏览器上运行一次。这是找出答案最可靠的方法。即使它并不完全全面,你至少有一些实际的数字可以参考,而这些数字很可能涵盖了绝大多数用户。
其次,我同意所有说这是个坏主意的人。如果你真的很担心达到限制,应该不难找到其他解决方案。即使你在每个浏览器上都进行了测试,仍然需要担心防火墙等问题,而且几乎没有人能够测试每种组合(我几乎可以肯定在你之前没有人这样做过)。你将无法为每种情况得到硬性限制。
尽管在理论上,这一切都应该很好地解决,但如果你决定这样做,可能会有那么一个边缘情况会让你后悔。
简而言之:这是个坏主意。 不要给自己找麻烦,找一个真正的解决方案,而不是一个变通方法。
编辑:由于你提到请求可能来自多种类型的来源,为什么不只在请求头中指定来源,并将数据完全包含在正文中呢?在头部中添加某种Source
或ClientType
字段,指定请求来自何处。如果是来自浏览器,请在正文中包含HTML;如果来自PHP应用程序,请在其中放置一些特定于PHP的内容;等等。如果该字段为空,则根本不添加任何额外数据。