Насколько большой может получить строка агента пользователя?


193

Если бы вы собирались хранить пользовательский агент в базе данных, какой размер вы бы разместили?

Я нашел эту техническую статью, которая рекомендует держать UA ниже 200. Похоже, что это не определено в спецификации HTTP, по крайней мере, я не нашел. Мой UA уже содержит 149 символов, и кажется, что каждая версия .NET будет добавлять к нему.

Я знаю, что могу разобрать строку и сломать ее, но я бы не хотел.


РЕДАКТИРОВАТЬ
На основе этого блога IE9 будет меняться, чтобы отправить короткую строку UA. Это хорошее изменение.



Я разместил этот вопрос: stackoverflow.com/questions/17731699/…
Erx_VB.NExT.Coder

Какая у тебя струна UA? Я нашел только несколько строк из 137 символов в моей базе данных (что не слишком много).
Мартин Тома

Когда я задал этот вопрос пять лет назад или около того. Струны UA становились длинными, они включали много дополнительных вещей ...
JoshBerke

2
Я должен спросить, ответы в этой теме все еще актуальны? Большинству из этих ответов 8 лет.
Пешке

Ответы:


114

Спецификация HTTP вообще не ограничивает длину заголовков. Однако веб-серверы ограничивают размер принимаемого ими заголовка, 413 Entity Too Largeесли он превышает его.

В зависимости от веб-сервера и его настроек эти пределы варьируются от 4 КБ до 64 КБ (всего для всех заголовков).


11
Apache ограничивает максимальную длину поля до 8 КБ ( httpd.apache.org/docs/2.2/mod/core.html#limitrequestfieldsize ).
Гамбо

Меня меньше волнуют ограничения сервера, так как я нахожусь на IIS, я знаю, что он никогда не будет больше, чем их предел, который все еще слишком велик, если память будет
работать

6
@Josh - память хорошо работает, в IIS по умолчанию 16K. ;-)
vartec

70

Мой взгляд на это:

  • Используйте выделенную таблицу для хранения только UserAgents (нормализуйте ее)
  • В ваших связанных таблицах, хранить внешний ключ значение точки обратно в UserAgent автоинкрементного первичного ключа поля
  • Сохраните фактическую строку UserAgent в поле TEXT и не заботьтесь о длине
  • Иметь другой UNIQUE BINARY(32) (или 64, или 128 в зависимости от длины хэша) и хэшировать UserAgent

Некоторые строки UA могут быть неприлично длинными. Это должно избавить вас от забот. Также установите максимальную длину в вашем INSERTer, чтобы строки UA не превышали 4 КБ. Если кто-то не отправляет вам электронное письмо в пользовательском агенте, оно не должно превышать эту длину.


1
Поле TEXT больше не должно использоваться, как указано в MSDN: msdn.microsoft.com/en-us/library/ms187993(v=sql.90).aspx Вместо этого используйте NVARCHAR (MAX). Источник: stackoverflow.com/questions/564755/…
Мэтт Рой

3
Моя база данных имеет 10 235 различных строк пользовательских агентов. Я хотел найти самый быстрый алгоритм хеширования, который не приводил к каким-либо конфликтам. Для моей среды PHP я обнаружил, что md5 работает быстро за 2,3 секунды без коллизий. Интересно, что я попробовал crc32 и crc32b, и они также показали результат за 2,3 секунды без столкновений. Но поскольку md5 имеет больше комбинаций, чем crc32 и crc32b, md5, вероятно, будет иметь меньше возможных коллизий. В любом случае, md5 - мой выбор, и я ожидаю, что он будет работать нормально.
noctufaber

2
Почему хэш агента пользователя? Это для быстрого поиска или что-то?
Бум

2
@Boom Поиски и уникальность как уникальные ключи БД могут быть только такими длинными.
CodeAngry

2
@noctufaber crc32 не является хешем, он не пытается быть устойчивым к столкновениям.

29

Заметил что-то подобное в наших логах apache. Это выглядит ненормально для меня, но я регулярно вижу такие вещи в журналах в основном из систем Windows.

97690420803; 79980706603; 9867086703; 996602846703; 87690803; 6989010903; 977809603; 666601903; 876905337803; 89670603; 89970200903; 786903603; 696901911703; 788905703; 896709803; 96890703; 998601903; 88980703; 666604769703; 978806603; 7988020803; 996608803; 788903297903; 98770043603; 899708803; 66960371603; 9669088903; 69990703; 99660519903; 97780603; 888801803; 9867071703; 79780803; 9779087603; 899708603; 66960456803; 898706824603; 78890299903; 99660703; 9768079803; 977901591603; 89670605603; 787903608603; 998607934903; 799808573903; 878909603; 979808146703; 9996088603; 797803154903; 69790603; 99660565603; 7869028603; 896707703; 97980965603; 976907191703; 88680703; 888809803; 69690903; 889805523703; 899707703; 997605035603; 89970029803; 9699094903; 877906803; 899707002703; 786905857603; 69890803; 97980051903; 997603978803; 9897097903; 66960141703; 7968077603; 977804603; 88980603; 989700803; 999607887803; 78690772803; 96990560903; 98970961603; 9996032903; 9699098703; 69890655603; 978903803; 698905066803; 977806903; 9789061703; 967903747703; 976900550903; 88980934703; 8878075803; 8977028703; 97980903; 9769006603; 786900803; 98770682703; 78790903; 878906967903; 87690399603; 99860976703; 796805703; 87990603; 968906803; 967904724603; 999606603; 988705903; 989702842603; 96790603; 99760703; 88980166703; 9799038903; 98670903; 697905248603; 7968043603; 66860703; 66860127903; 9779048903; 89670123903; 78890397703; 97890603; 87890803; 8789030603; 69990603; 88880763703; 9769000603; 96990203903; 978900405903; 7869022803; 699905422903; 97890703; 87990903; 878908703; 7998093903; 898702507603; 97780637603; 966907903; 896702603; 9769004803; 7869007903; 99660158803; 7899099603; 8977055803; 99660603; 7889080903; 66660981603; 997604603; 6969089803; 899701903; 9769072703; 666603903; 99860803; 997608803; 69790903; 88680756703; 979805677903; 9986047703; 89970803; 66660603; 96690903; 8997051603; 789901209803; 8977098903; 968900326803; 87790703; 98770024803; 697901794603; 69990803; 887805925803; 968908903; 97880603; 897709148703; 877909476903; 66760197703; 977908603; 698902703; 988706504803; 977802026603; 88680964703; 8878068703; 987705107903; 978902878703; 8898069803; 9768031703; 79680803; 79980803; 669609328703; 89870238703; 99960593903; 969904218703; 78890603; 9788000703; 69690630903; 889800982903; 988709748803; 7968052803; 99960007803; 969900800803; 668604817603; 66960903; 78790734603; 8868007703; 79780034903; 8878085903; 976907603; 89670830803; 877900903; 969904889703; 7978033903; 8987043903; 99860703; 979805903; 667603803; 976805348603; 999604127603; 97790701603; 78990342903; 98770672903; 87990253903; 9877027703; 97790803; 877901895603; 8789076903; 896708595603; 997601903; 799806903; 97690603; 87790371703; 667605603; 99760303703; 97680283803; 788902750803; 787909803; 79780603; 79880866903; 9986050903; 87890543903; 979800803; 97690179703; 876901603; 699909903; 96990192603; 878904903; 877904734903; 796801446903; 977904803; 9887044803; 797805565603; 98870789703; 7869093903; 87790727703; 797801232803; 666604803; 9778071903; 9799086703; 6969000903; 89670903; 8799075903; 897708903; 88680903; 97980362603; 97980503903; 889803256703; 88980388703; 789909376803; 69690703; 6969025903; 89970309903; 96690703; 877901847803; 968901903; 96690603; 88680607603; 7889001703; 789904761803; 976807703; 976902903; 878907889703; 9897014903; 896707046603; 696909903; 666603998903; 969902703; 79680421803; 9769075603; 798800192703; 97990903; 9689024903; 668604803; 969908671903; 9996094703; 69990642703; 97890895903; 977805619903; 79980859903; 88980443803; 98970649603; 997602703; 888802169903; 699907803; 667602028803; 786903283903; 997607703; 969909803; 798809925903; 9976045603; 97790903; 9789001903; 966903603; 9789069603; 968906603; 6989091803; 896701603; 6979059803; 978803903; 997606362603; 88980803; 98970803; 88880921703; 8997065703; 899700703; 698908703; 797801027903; 7889050903; 87890603; 78690703; 99660069703; 97980309903; 976800603; 666606803; 898707703; 79880019803; 66960250803; 7978049803; 88780602603; 79680903; 88880792703; 96990903; 667608603; 87790730903; 98970903; 9699032903; 8987004803; 88880703; 89770046603; 978800803; 969908903; 9798022603; 696901903; 799803703; 989703703; 668605903; 79780903; 998601371703; 796803339703; 87890922603; 898708903; 9966061903; 66960891903; 96790903; 8779050803; 98870858803; 976909298603; 9887029903; 669608703; 979806903; 878903803; 99960703; 9789086703; 979801803; 66960008703; 979806830803; 99760212703; 786906603; 797807603; 789907297703; 96990703; 786901603; 796807766603; 896702651603; 789902585603; 66660925903; 9986085703; 66960302703; 69890703; 789900703; 89970903; 9679060703; 9789002903; 979908821603; 986708140803; 976809828703; 7988082803; 79680997903; 99960803; 9788081903; 979805703; 787908603; 66960602803; 9887098703; 978803237703; 888806804603; 999604703; 977904703; 966904635703; 97680291703; 977809345603; 8878046703; 988709803; 976900773603; 989703903; 88780198603; 87790603; 986708703; 78890604703; 87790544803; 976809850903; 887806703; 987707527603; 79880803; 9897059603; 897709820603; 97880804803; 66960026703; 9789062803; 9867090803; 669600603; 8967087703; 78890903; 89770903; 97980703; 976802687603; 66860400803; 979901288603; 96990160903; 99860228903; 966900703; 66760603; 9689035703; 9779064703; 7968023603; 87890791903; 98770870603; 9798005803; 6969087903; 9779097903; 6979065703; 699903252603; 79780989703; 87690901803; 978905763903; 977809703; 97790369703; 899703269603; 8878012703; 78790803; 87690395603; 8888042803; 667607689903; 8977041803; 6666085603; 6999080703; 69990797803; 88680721603; 99660519803; 889807603; 87890146703; 699906325903; 89770603; 669608615903; 9779028803; 88880603; 97790703; 79780703; 97680355603; 6696024803; 78790784703; 97880329903; 9699077703; 89870803; 79680227903; 976905852703; 8997098903; 896704796703; 66860598803; 9897036703; 66960703; 9699094703; 9699008703; 97780485903; 999603179903; 89770834803; 96790445603; 79680460903; 9867009603; 89870328703; 799801035803; 989702903; 66960758903; 66860150803; 6686088603; 9877092803; 96990603; 99860603; 987703663603; 98870903; 699903325603; 87790803; 97680703; 8868030703; 9799030803; 89870703; 97680803; 9669054803; 6979097603; 987708046603; 999608603; 878904803; 998607408903; 968903903; 696900703; 977907491703; 6686033803; 669601803; 99960290603; 887809169903; 979803703; 69890903; 699901447903; 8987064903; 799800603; 98770903; 8997068703; 967903603; 66760146803; 978805087903; 697908138603; 799801603; 88780964903; 989708339903; 8967048603; 88880981603; 789909703; 796806603; 977905977603; 989700603; 97780703; 9669062603; 88980714603; 897709545903; 988701916703; 667604694903; 786905664603; 877900803; 886805490903; 89970559903; 99960531803; 7998033903; 98770803; 78890418703; 669600872803; 996605216603; 78690962703; 667604903; 996600903; 999608903; 9699083803; 787901803; 97780707603; 787905312703; 977805803; 8977033703; 97890708703; 989705521903; 978800703; 698905703; 78890376903; 878907703; 999602903; 986705903; 668602719603; 979901803; 997606903; 66760393903; 987703603; 78790338903; 96890803; 97680596803; 666601603; 977902178803; 877902803; 78790038603; 8868075703; 99960060603) 787905312703; 977805803; 8977033703; 97890708703; 989705521903; 978800703; 698905703; 78890376903; 878907703; 999602903; 986705903; 668602719603; 979901803; 997606903; 66760393903; 987703603; 78790338903; 96890803; 97680596803; 666601603; 977902178803; 877902803; 78790038603; 8868075703; 99960060603) 787905312703; 977805803; 8977033703; 97890708703; 989705521903; 978800703; 698905703; 78890376903; 878907703; 999602903; 986705903; 668602719603; 979901803; 997606903; 66760393903; 987703603; 78790338903; 96890803; 97680596803; 666601603; 977902178803; 877902803; 78790038603; 8868075703; 99960060603)


36
Есть ли кто-нибудь, кто хотел бы прокомментировать, что на самом деле происходит с этим агентом пользователя? LOL Я должен добавить, мне любопытно, как такой зверь может образоваться.
Erx_VB.NExT.Coder

22
Если кому-то любопытно; это на 8010 символов . Как кто-то из команды браузеров мог подумать, что это хорошая идея? Это так безумно, как мешок кошек!
Доктор Джонс

15
Обрезает ли эта строка агента пользователя 256 или 512 какие-либо полезные данные?
JackAce

12
Я сделал несколько замечаний, но пока не решил. Есть 642цифры. Первые четыре цифры всегда 6, 7, 8или 9. Пятое число всегда 0. Последние три всегда 603, 703, 803или 903. Возможно, кто-то может узнать эту модель? (Период полураспада 3 подтвержден?)
meshy

Интересный. Теперь я добавил код для усечения строки UA до 255 символов для моих журналов БД.
Дипак Томас

28

Так как это для целей базы данных и нет практического ограничения, я бы пошел для таблицы UserAgents с UserAgentId как Int и UserAgentString как NVarChar (MAX) и использовал внешний ключ в исходной таблице.


20
Вы, вероятно, в конечном итоге с пользовательскими агентами в отношениях 1 к горстке с вашими пользователями. Большинство пользовательских агентов настолько подправлены элементами, которые пользователь установил, и в определенном порядке, что их можно почти идентифицировать (у другого ответа есть хороший пример этого). Фактически, EFF провела исследование (pdf) об этом.
патрон

1
@patridge +1 за ссылку, очень хорошая учеба. Это немного не по теме, потому что они смотрят несколько отпечатков пальцев, а не только строки агента пользователя. В реальном сценарии для сайта, который получает несколько миллионов просмотров страниц в месяц, вы получите несколько тысяч строк пользовательского агента, так что нормализация имеет смысл ИМХО. С учетом сказанного, я не очень уверен в сохранении строк пользовательских агентов в базе данных: P
Diadistis

@patridge Ссылка на исследование теперь не работает: обновленная ссылка
Борис

1
@patridge Я согласен, что ваша идея звучит правдоподобно, но мои данные не согласны с нами обоими. Я сейчас работаю именно с такой системой, и у меня есть около 70 тысяч уникальных UA для 1,2 миллиона пользователей. Причина, по которой я нахожусь на этой странице, заключается в том, что я выбрал 256 в качестве предела для поля своей базы данных и обнаружил, что 50 000 из 70 000 были усечены, поэтому я потерял некоторую информацию. Я собираюсь увеличить его до 4к сейчас. Будет интересно узнать, сколько было бы уникально, если бы они не были усечены
Даррен Х

10

Как это по большому?

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) 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) 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) 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) 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)


15
Для тех, кто ведет счет, это 1546 символов, включая ведущие и конечные кавычки.
Даг Харрис

6

Там нет установленного ограничения, только ограничение большинства HTTP-серверов. Имея это в виду, однако, я бы реализовал столбец с разумной фиксированной длиной (используйте Google, чтобы найти список известных пользовательских агентов, найдите самый большой и добавьте 50%), и просто обрежьте любой пользовательский агент, который является слишком длинным - любой исключительно Длинный пользовательский агент, вероятно, достаточно уникален, даже когда обрезан, или является результатом какой-то ошибки или попытки взлома.


Похоже, стандартная длина составляет 120-150, на основе networkhowtos.com/howto/common-user-agent-list . Поэтому я бы обрезал максимальную длину в 200.
ген б.

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 символов?

Так что возьмите этот размер, удвойте его, удвойте его снова, и вы должны быть настроены до следующего промаха Microsoft (возможно, на этот раз в следующем году).

Перейти больше, чем 1000!


Интересно, какое отношение .Net CLR и Trident имеют к Mozilla
Gherman,

3

Я дам вам стандартный ответ:

Возьмите максимально возможное значение, которое вы можете себе представить, удвойте его, и это ваш ответ.


хех так, как вы думаете, насколько большой она будет?
JoshBerke

1
Конечно, в два раза больше, чем я думаю. Хотя 256 кажется хорошим круглым числом для удвоения.
Эд Марти

4
Я нахожу это забавным всякий раз, когда мы не знаем, какой будет хорошая длина, мы всегда получаем 256 или другое кратное 2.
JoshBerke

3
Хорошо 512 звучит хорошо, что дает мне по крайней мере 10 лет .net-релизов и прочего мусора для накопления, и к тому времени я надеюсь уйти в отставку.
Еще

1
@Josh: «к тому времени я надеюсь уйти в отставку» ... где я слышал это раньше ?! ;-)
Cerebrus

3

Предположим, что строка агента пользователя не имеет ограничений по длине, и подготовьтесь к сохранению такого значения. Как вы видели, длина непредсказуема.

В Postgres есть текстовый тип, который принимает строки неограниченной длины. Используйте это.

Скорее всего, в какой-то момент вам придется начинать усечение. Назовите это хорошим с достаточно полезным приращением (200, 1k, 4k) и отбросьте все остальное.


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)


На сайте с очень низким трафиком я видел до 255 символов. Так что не удивительно. .Net 4.0, вероятно, также добавит еще 20 символов.
ДжошБерке

2

Не является показателем того, насколько большим может быть пользовательский агент, поскольку есть множество ответов, показывающих крайние случаи, с которыми они сталкивались, но самый длинный из них можно найти на http://www.useragentstring.com/pages/useragentstring.php? имя = все было 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.