用户代理字符串有多大?

时间:2009-03-17 16:10:57

标签: http database-design http-headers user-agent

如果您要将用户代理存储在数据库中,您可以使用多大的数据?

我发现这个technet article建议将UA保持在200以下。看起来这似乎不是HTTP规范中定义的,至少不是我发现的。我的UA已经有149个字符,似乎每个版本的.NET都会添加它。

我知道我可以将字符串解析出来并将其分解,但我不愿意。


修改
基于此Blog IE9将更改为发送短UA字符串。这是一个很好的改变。


11 个答案:

答案 0 :(得分:100)

HTTP规范根本不限制标头长度。 但是,Web服务器会限制它们接受的标头大小,如果超过则抛出413 Entity Too Large

根据网络服务器及其设置,这些限制从4KB到64KB不等(所有标题的总数)。

答案 1 :(得分:58)

我对此的看法:

  • 使用专用表仅存储UserAgents (规范化)
  • 在相关表格中,存储外键值以指回UserAgent 自动增加主键字段
  • 将实际的UserAgent字符串存储在 TEXT字段中,而不关心长度
  • 拥有另一个UNIQUE BINARY(32) (或64或128,具体取决于您的哈希长度)哈希UserAgent

有些UA字符串可能会变得非常长。这可以免除您的后顾之忧。还要在INSERTer中强制执行最大长度,以使UA字符串保持在4KB以下。除非有人通过用户代理向您发送电子邮件,否则它不应该超过这个长度。

答案 2 :(得分:28)

由于它是出于数据库目的而且没有实际限制,我会选择UserAgent项,其中UserAgentId为Int,UserAgentString为NVarChar(MAX),并在原始表上使用外键。

答案 3 :(得分:23)

答案 4 :(得分:9)

对于大人来说这是怎么回事?:

  

Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 5.1; Trident / 4.0; YPC   3.2.0; SearchSystem6829992239; SearchSystem9616306563; SearchSystem6017393645; SearchSystem5219240075;   SearchSystem2768350104; SearchSystem6919669052;   SearchSystem1986739074; SearchSystem1555480186;   SearchSystem3376893470; SearchSystem9530642569;   SearchSystem4877790286; SearchSystem8104932799;   SearchSystem2313134663; SearchSystem1545325372;   SearchSystem7742471461; SearchSystem9092363703;   SearchSystem6992236221; SearchSystem3507700306;   SearchSystem1129983453; SearchSystem1077927937;   SearchSystem2297142691; SearchSystem7813572891;   SearchSystem5668754497; SearchSystem6220295595;   SearchSystem4157940963; SearchSystem7656671655;   SearchSystem2865656762; SearchSystem6520604676;   SearchSystem4960161466; .NET CLR 1.1.4322; .NET CLR 2.0.50727;快捷栏   10.2.232.0; SearchSystem9616306563; SearchSystem6017393645; SearchSystem5219240075; SearchSystem2768350104;   SearchSystem6919669052; SearchSystem1986739074;   SearchSystem1555480186; SearchSystem3376893470;   SearchSystem9530642569; SearchSystem4877790286;   SearchSystem8104932799; SearchSystem2313134663;   SearchSystem1545325372; SearchSystem7742471461;   SearchSystem9092363703; SearchSystem6992236221;   SearchSystem3507700306; SearchSystem1129983453;   SearchSystem1077927937; SearchSystem2297142691;   SearchSystem7813572891; SearchSystem5668754497;   SearchSystem6220295595; SearchSystem4157940963;   SearchSystem7656671655; SearchSystem2865656762;   SearchSystem6520604676; SearchSystem4960161466; .NET CLR   3.0.4506.2152; .NET CLR 3.5.30729)

答案 5 :(得分:4)

没有声明的限制,只有大多数HTTP服务器的限制。但请记住这一点,我会实现一个具有合理固定长度的列(使用Google查找已知用户代理列表,找到最大并添加50%),然后只裁剪任何太长的用户代理 - 任何异常即使在裁剪时,长用户代理也可能是唯一的,或者是某种错误或“黑客”尝试的结果。

答案 6 :(得分:4)

我今天收到了这个用户代理,溢出了我们供应商的存储区域:

  

Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 5.1; Trident / 4.0; GTB6;   .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; MDDR;   OfficeLiveConnector.1.3; OfficeLivePatch.0.0; .NET CLR 3.0.4506.2152;   .NET CLR 3.5.30729)

荒谬! 229个字符?

所以采取这个规模,加倍,再加倍,你应该设置,直到微软下一次失误(也许明年这个时候)。

超过1000!

答案 7 :(得分:3)

假设用户代理字符串的长度没有限制,并准备存储这样的值。如你所见,长度是不可预测的。

在Postgres中,有text类型接受无限长度的字符串。使用它。

但最有可能的是,你必须在某个时候开始截断。称之为合理有用的增量(200,1k,4k)并扔掉其余部分。

答案 8 :(得分:2)

我会给你标准答案:

获取你可能想象的最大可能值,加倍,这就是你的答案。

答案 9 :(得分:2)

这是一个257

  

Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 5.1; Trident / 4.0; GTB6;   .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30;   InfoPath.2; .NET CLR 3.0.04506.648; OfficeLiveConnector.1.3;   OfficeLivePatch.0.0; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

答案 10 :(得分:0)

不能说明用户代理可以达到多大,因为有很多答案显示了他们遇到的极端情况,但是在http://www.useragentstring.com/pages/useragentstring.php?name=All上可以找到的最长长度是250个字节。

  

Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 6.1; Trident / 4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Media Center PC 5.0; SLCC1; OfficeLiveConnector.1.5; OfficeLivePatch.1.3; .NET4.0C; Lunascape 6.3。