Jak duży może być ciąg agenta użytkownika?


193

Jeśli miałbyś przechowywać agenta użytkownika w bazie danych, jak duży byłby dla ciebie nocleg?

Znalazłem ten artykuł w technecie, który zaleca utrzymanie UA poniżej 200. Nie wygląda na to, że jest to zdefiniowane w specyfikacji HTTP, przynajmniej nie to, że znalazłem. Mój UA ma już 149 znaków i wygląda na to, że każda wersja .NET będzie do niego dodawać.

Wiem, że mogę przeanalizować sznurek i go rozbić, ale wolałbym nie.


EDYCJA
Na podstawie tego bloga IE9 zmieni się, aby wysłać krótki ciąg UA. To dobra zmiana.




Jaki jest twój ciąg UA? W mojej bazie danych znalazłem tylko kilka ciągów zawierających 137 znaków (co nie jest zbyt duże).
Martin Thoma,

Kiedy zadałem to pytanie jakieś pięć lat temu. Struny UA były długie, zawierały wiele dodatkowych rzeczy ...
JoshBerke,

2
Muszę zapytać, czy odpowiedzi w tym wątku są nadal aktualne? Większość z tych odpowiedzi ma 8 lat.
Peschke,

Odpowiedzi:


114

Specyfikacja HTTP wcale nie ogranicza długości nagłówków. Jednak serwery WWW ograniczają rozmiar akceptowanego nagłówka, wyrzucając 413 Entity Too Largego, jeśli przekracza.

W zależności od serwera WWW i ich ustawień limity te wahają się od 4KB do 64 KB (łącznie dla wszystkich nagłówków).


11
Apache ogranicza maksymalną długość pola do 8k ( httpd.apache.org/docs/2.2/mod/core.html#limitrequestfieldsize ).
Gumbo,

Nie jestem zainteresowany limitami serwerów, ponieważ korzystam z IIS, wiem, że nigdy nie będzie większy niż ich limit, który jest wciąż bardzo duży, jeśli pamięć służy ...
JoshBerke

6
@Josh - pamięć dobrze ci służy, w IIS domyślnie jest to 16K. ;-)
vartec

70

Moje zdanie na ten temat:

  • Użyj dedykowanej tabeli do przechowywania tylko UserAgents (znormalizuj ją)
  • W pokrewnych tabelach przechowuj wartość klucza obcego, aby wskazywała pole klucza automatycznego autorekreacji UserAgent
  • Przechowuj rzeczywisty ciąg UserAgent w polu TEXT i nie dbaj o jego długość
  • Mieć inny UNIQUE BINARY(32) (lub 64 lub 128 w zależności od długości skrótu) i haszować UserAgent

Niektóre ciągi znaków UA mogą być nieprzyzwoicie długie. To powinno oszczędzić ci zmartwień. Wymuszaj także maksymalną długość w INSERTerze, aby UA sznurował go poniżej 4KB. O ile ktoś nie wysyła Ci e-maila do klienta użytkownika, nie powinien przekraczać tej długości.


1
Nie należy już używać pola TEXT, jak podano w MSDN: msdn.microsoft.com/en-us/library/ms187993(v=sql.90).aspx Zamiast tego należy użyć NVARCHAR (MAX). Źródło: stackoverflow.com/questions/564755/…
Matt Roy

3
Moja baza danych zawiera 10 235 różnych ciągów agenta użytkownika. Chciałem znaleźć najszybszy algorytm mieszania, który nie spowodował żadnych kolizji. W moim środowisku PHP zauważyłem, że md5 działa szybko w 2,3 sekundy bez kolizji. Co ciekawe, wypróbowałem crc32 i crc32b, a one także działały w 2,3 sekundy bez kolizji. Ponieważ jednak md5 ma więcej kombinacji niż crc32 i crc32b, md5 prawdopodobnie miałby mniej możliwych kolizji. W każdym razie md5 jest moim wyborem i spodziewam się, że będzie dobrze działać.
noctufaber

2
Dlaczego hash Agent użytkownika? Czy to jest szybkie wyszukiwanie?
Boom

2
Wyszukiwania @Boom i unikalność jako unikalne klucze DB mogą być tylko tak długie.
CodeAngry

2
@noctufaber crc32 nie jest skrótem, nie próbuje być odporny na kolizje.

29

Zauważyliśmy coś takiego w naszych logach Apache. Wydaje mi się to nienormalne, ale regularnie widzę takie rzeczy w logach głównie z systemów 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
Czy jest ktoś, kto chciałby skomentować, co się dzieje z tym agentem użytkownika? lol Muszę dodać, jestem ciekawy, jak może powstać taka bestia.
Erx_VB.NExT.Coder

22
Jeśli ktoś jest ciekawy; ten rejestruje 8010 znaków . Jak ktokolwiek z zespołu przeglądarki mógł pomyśleć, że to dobry pomysł? Jest szalony jak worek kotów!
Doktor Jones,

15
Czy obcięcie tego ciągu agenta użytkownika na 256 lub 512 pozbywa się jakichkolwiek użytecznych danych?
JackAce

12
Poczyniłem pewne obserwacje, ale jeszcze tego nie wypracowałem. Są 642liczby. Pierwsze cztery numery są zawsze 6, 7, 8, lub 9. Piąta liczba jest zawsze 0. Trzy ostatnie są zawsze 603, 703, 803, lub 903. Być może ktoś może rozpoznać ten wzór? (Potwierdzony okres półtrwania 3?)
meshy 10.10.16

Ciekawy. Dodałem teraz kod do obcięcia łańcucha UA do 255 znaków dla moich dzienników db.
Deepak Thomas

28

Ponieważ jest to do celów bazy danych i nie ma praktycznego limitu, wybrałbym tabelę UserAgents z UserAgentId jako Int i UserAgentString jako NVarChar (MAX) i użyłem klucza obcego w oryginalnej tabeli.


19
Prawdopodobnie skończyłbyś z agentami użytkowników w relacji 1-do-garści z użytkownikami. Większość programów klienckich jest tak dostosowywana przez elementy, które użytkownik zainstalował, i w określonej kolejności, że są prawie osobiście identyfikowalne (jedna inna odpowiedź ma dobry przykład takiego zdarzenia). W rzeczywistości EFF przeprowadził na ten temat badanie (pdf) .
patridge

1
@patridge +1 dla linku, bardzo dobre badanie. To trochę nie na temat, ponieważ patrzą na kilka odcisków palców, a nie tylko na ciągi użytkownika. W scenariuszu ze świata rzeczywistego w przypadku witryny, która uzyskuje kilka milionów wyświetleń stron miesięcznie, otrzymujesz kilka tysięcy ciągów agenta użytkownika, więc normalizacja ma sens w przypadku IMHO. Powiedziawszy to, nie jestem zbyt pozytywny w kwestii przechowywania ciągów agenta użytkownika w bazie danych: P
Diadistis

@patridge Link do badania jest teraz zepsuty: zaktualizowany link
Boris Dalstein

1
@patridge Zgadzam się, że Twój pomysł wydaje się wiarygodny, ale moje dane nie zgadzają się z nami obojgiem. Obecnie pracuję z dokładnie tego rodzaju systemem i mam około 70 000 unikalnych UA dla 1,2 miliona użytkowników. Powodem, dla którego jestem na tej stronie jest to, że wybrałem 256 jako ograniczenie w polu bazy danych i stwierdziłem, że 50 000 z 70 000 zostało obciętych, więc straciłem trochę informacji. Teraz zwiększę go do 4k. Będzie ciekawie wiedzieć, ile byłoby wyjątkowych, gdyby nie zostały obcięte
Darren H

10

Jak to na duże ?:

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
Dla tych, którzy zachowują wynik, jest to 1546 znaków, w tym wiodące i końcowe cytaty.
Doug Harris

6

Nie ma określonego limitu, tylko limit większości serwerów HTTP. Pamiętając o tym, zaimplementowałbym kolumnę o rozsądnej stałej długości (użyj Google, aby znaleźć listę znanych klientów użytkownika, znajdź największy i dodaj 50%), i po prostu przytnij dowolnego użytkownika użytkownika, który jest zbyt długi - każdy wyjątkowo długi klient użytkownika jest prawdopodobnie wystarczająco wyjątkowy, nawet jeśli został przycięty lub jest wynikiem jakiegoś błędu lub próby „włamania”.


Wygląda na to, że standardowa długość wynosi 120-150, w oparciu o networkinghowtos.com/howto/common-user-agent-list . Dlatego chciałbym przyciąć Max Length na 200.
gen b.

4

Mam dziś tego klienta użytkownika, który przepełnia pole pamięci naszego dostawcy:

Mozilla / 4.0 (kompatybilny; 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)

Śmieszny! 229 znaków?

Więc weź ten rozmiar, podwoj go, podwoj jeszcze raz i powinieneś być ustawiony do następnego błędu Microsoft (może tym razem w przyszłym roku).

Idź większy niż 1000!


Zastanawiam się, co .Net CLR i Trident mają wspólnego z Mozillą
Gherman

3

Dam ci standardową odpowiedź:

Wybierz największą możliwą wartość, jaką możesz sobie wyobrazić, podwoj ją i to jest twoja odpowiedź.


heh, jak myślisz, jak duży będzie?
JoshBerke

1
Oczywiście dwa razy cokolwiek myślę. Chociaż 256 wydaje się być ładną okrągłą liczbą do podwojenia.
Ed Marty,

4
Uważam to za zabawne, ilekroć nie wiemy, jaka byłaby dobra długość, zawsze otrzymujemy 256 lub kolejną wielokrotność liczby 2.
JoshBerke

2
Cóż, 512 brzmi dobrze, co daje mi co najmniej 10 lat wydawnictw .net i innych śmieci, a ja mam nadzieję na emeryturę.
Jeszcze

1
@Josh: „do tego czasu mam nadzieję na emeryturę” ... gdzie to wcześniej słyszałem ?! ;-)
Cerebrus

3

Załóżmy, że ciąg agenta użytkownika nie ma ograniczenia jego długości i przygotuj się do przechowywania takiej wartości. Jak widzieliście, długość jest nieprzewidywalna.

W Postgres istnieje typ tekstu, który akceptuje ciągi o nieograniczonej długości. Użyć tego.

Najprawdopodobniej w pewnym momencie będziesz musiał zacząć obcinać. Nazwij to dobrze przy rozsądnie przydatnym przyrostie (200, 1k, 4k) i wyrzuć resztę.


2

Oto 257

Mozilla / 4.0 (kompatybilny; 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)


Do tej pory widziałem do 255 znaków na stronie o bardzo niskim natężeniu ruchu. Nic dziwnego. .Net 4.0 prawdopodobnie również doda kolejne 20 znaków.
JoshBerke,

1

Nie oznacza to, jak duży może być klient użytkownika, ponieważ istnieje wiele odpowiedzi pokazujących przypadki, w których się natknęli, ale najdłuższy, jaki można znaleźć na stronie http://www.useragentstring.com/pages/useragentstring.php? name = Wszystkie miały 250 bajtów.

Mozilla / 4.0 (kompatybilny; 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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.