Quelle taille peut avoir une chaîne d'agent utilisateur?

193

Si vous deviez stocker un agent utilisateur dans une base de données, quelle taille accepteriez-vous?

J'ai trouvé cet article technet qui recommande de garder UA sous 200. Il ne semble pas que cela soit défini dans la spécification HTTP, du moins pas que j'ai trouvé. Mon UA ​​compte déjà 149 caractères, et il semble que chaque version de .NET y ajoutera.

Je sais que je peux analyser la chaîne et la décomposer, mais je préfère ne pas.


EDIT
Sur la base de ce blog, IE9 changera pour envoyer la courte chaîne UA. C'est un bon changement.


JoshBerke
la source
J'ai posté cette question: stackoverflow.com/questions/17731699/…
Erx_VB.NExT.Coder
Quelle est votre chaîne UA? Je n'ai trouvé que quelques chaînes avec 137 caractères dans ma base de données (qui n'est pas trop grande).
Martin Thoma
Quand j'ai posé cette question il y a environ cinq ans. Les cordes UA devenaient longues, elles incluaient beaucoup de choses supplémentaires ...
JoshBerke
2
Je dois demander, les réponses sur ce fil sont-elles toujours pertinentes? La plupart de ces réponses ont 8 ans.
Peschke

Réponses:

114

La spécification HTTP ne limite pas du tout la longueur des en-têtes. Cependant, les serveurs Web limitent la taille d'en-tête qu'ils acceptent, en la jetant 413 Entity Too Largesi elle dépasse.

Selon le serveur Web et leurs paramètres, ces limites varient de 4 Ko à 64 Ko (total pour tous les en-têtes).

vartec
la source
11
Apache limite la longueur maximale de champ à 8 Ko ( httpd.apache.org/docs/2.2/mod/core.html#limitrequestfieldsize ).
Gumbo
Je suis moins préoccupé par les limites du serveur puisque je suis sur IIS, je sais que ce ne sera jamais plus grand que leur limite qui est toujours grande si la mémoire est
bonne
6
@Josh - la mémoire vous sert bien, sur IIS c'est 16K par défaut. ;-)
vartec
70

Mon point de vue sur ceci:

  • Utiliser une table dédiée pour stocker uniquement les UserAgents (normaliser)
  • Dans vos tables connexes, stockez une valeur de clé étrangère pour pointer vers le champ de clé primaire d'incrémentation automatique de UserAgent
  • Stockez la chaîne UserAgent réelle dans un champ TEXTE et ne vous souciez pas de la longueur
  • Avoir un autre UNIQUE BINARY(32) (ou 64, ou 128 selon votre longueur de hachage) et hacher l'UserAgent

Certaines chaînes UA peuvent devenir incroyablement longues. Cela devrait vous épargner les soucis. Appliquez également une longueur maximale dans votre INSERTer pour garder UA les chaînes sous 4 Ko. À moins que quelqu'un ne vous envoie un e-mail dans l'agent utilisateur, il ne doit pas dépasser cette longueur.

CodeAngry
la source
1
Le champ TEXT ne doit plus être utilisé comme indiqué dans MSDN: msdn.microsoft.com/en-us/library/ms187993(v=sql.90).aspx Utilisez plutôt NVARCHAR (MAX). Source: stackoverflow.com/questions/564755/…
Matt Roy
3
Ma base de données contient 10 235 chaînes d'agent utilisateur distinctes. Je voulais trouver l'algorithme de hachage le plus rapide qui n'ait produit aucune collision. Pour mon environnement PHP, j'ai trouvé que md5 fonctionnait rapidement à 2,3 secondes sans collision. Fait intéressant, j'ai essayé crc32 et crc32b et ils ont également fonctionné à 2,3 secondes sans collision. Mais, parce que md5 a plus de combinaisons que crc32 et crc32b, md5 aurait probablement moins de collisions possibles. Quoi qu'il en soit, md5 est mon choix et je m'attends à ce que cela fonctionne bien.
noctufaber
2
Pourquoi hacher l'agent utilisateur? Est-ce pour une recherche rapide ou quelque chose?
Boom
2
Les recherches @Boom et l'unicité en tant que clés uniques DB ne peuvent être que longues.
CodeAngry
2
@noctufaber crc32 n'est pas un hachage, il n'essaie pas d'être résistant aux collisions.
29

J'ai remarqué quelque chose comme ça dans nos journaux Apache. Cela me semble anormal, mais je vois régulièrement de telles choses dans les journaux, principalement à partir des systèmes 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)

Harry
la source
36
Y a-t-il quelqu'un qui aimerait commenter ce qui se passe avec cet agent utilisateur? lol je dois ajouter, je suis curieux de voir comment une telle bête peut se former.
Erx_VB.NExT.Coder
22
Si quelqu'un est curieux; celui-ci horloge à 8010 caractères . Comment un membre de l'équipe du navigateur aurait-il pu penser que c'était une bonne idée? C'est aussi fou qu'un sac de chats!
Docteur Jones
15
La tronçonnage de cette chaîne d'agent utilisateur à 256 ou 512 supprime-t-elle toutes les données utiles?
JackAce
12
J'ai fait quelques observations, mais je n'ai pas encore trouvé de solution. Il y a des 642chiffres. Les quatre premiers chiffres sont toujours 6, 7, 8ou 9. Le cinquième chiffre est toujours 0. Les trois derniers sont toujours 603, 703, 803ou 903. Peut-être que quelqu'un pourrait reconnaître ce modèle? (Demi-vie 3 confirmée?)
Mesh
Intéressant. J'ai maintenant ajouté du code pour tronquer la chaîne UA à 255 caractères pour mes journaux db.
Deepak Thomas
28

Comme c'est à des fins de base de données et qu'il n'y a pas de limite pratique, j'opterais pour une table UserAgents avec UserAgentId comme Int et UserAgentString comme NVarChar (MAX) et utiliser une clé étrangère sur la table d'origine.

Diadistis
la source
19
Vous vous retrouveriez probablement avec des agents utilisateurs dans une relation 1 contre une poignée avec vos utilisateurs. La plupart des agents utilisateurs sont tellement modifiés par les éléments qu'un utilisateur a installés, et dans un ordre particulier, qu'ils sont presque personnellement identifiables (une autre réponse a un bon exemple de ce qui se passe). En fait, l'EFF a fait une étude (pdf) à ce sujet.
patridge
1
@patridge +1 pour le lien, très bonne étude. C'est un peu hors sujet car ils regardent plusieurs empreintes digitales et pas seulement les chaînes d'agent utilisateur. Dans un scénario réel, pour un site qui obtient plusieurs millions de pages vues par mois, vous vous retrouvez avec quelques milliers de chaînes d'agent utilisateur, donc la normalisation est logique à mon humble avis. Cela dit, je ne suis pas très positif sur le stockage des chaînes d'agent utilisateur dans la base de données: P
Diadistis
@patridge Le lien vers l'étude est maintenant rompu: lien mis à jour
Boris Dalstein
1
@patridge Je suis d'accord que votre idée semble plausible, mais mes données sont en désaccord avec nous deux. Je travaille avec exactement ce type de système en ce moment, et j'ai environ 70 000 UA uniques pour 1,2 million d'utilisateurs. La raison pour laquelle je suis sur cette page est que j'ai choisi 256 comme limite sur le champ de ma base de données et j'ai trouvé que 50k sur les 70k étaient tronqués, j'ai donc perdu des informations. Je vais maintenant l'augmenter à 4k. Sera intéressant de savoir combien auraient été uniques s'ils n'avaient pas été tronqués
Darren H
10

Comment est-ce pour les grands?:

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)

CD.
la source
15
Pour ceux qui gardent le score, c'est 1546 caractères, y compris les guillemets de début et de fin.
Doug Harris
6

Il n'y a pas de limite indiquée, seulement la limite de la plupart des serveurs HTTP. Gardant cela à l'esprit cependant, j'implémenterais une colonne avec une longueur fixe raisonnable (utilisez Google pour trouver une liste d'agents utilisateurs connus, trouvez le plus grand et ajoutez 50%), et recadrez simplement tout agent utilisateur trop long - exceptionnellement l'agent utilisateur long est probablement assez unique même lorsqu'il est rogné, ou est le résultat d'une sorte de bogue ou d'une tentative de "piratage".

David
la source
Il semble que la longueur standard soit de 120 à 150, basée sur networkinghowtos.com/howto/common-user-agent-list . Par conséquent, je recadrerais la longueur maximale à 200.
gène b.
4

J'ai reçu cet agent utilisateur aujourd'hui, débordant le champ de stockage de notre fournisseur:

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

Ridicule! 229 caractères?

Prenez donc cette taille, doublez-la, doublez-la à nouveau, et vous devriez être réglé jusqu'à la prochaine erreur de Microsoft (peut-être cette fois l'année prochaine).

Allez plus de 1000!

bleuâtre
la source
Je me demande ce que font .Net CLR et Trident à faire avec Mozilla
Gherman
3

Je vais vous donner la réponse standard:

Prenez la plus grande valeur possible que vous pouvez imaginer être, doublez-la, et c'est votre réponse.

Ed Marty
la source
heh alors quelle taille pensez-vous que ce sera?
JoshBerke
1
Bien sûr, deux fois ce que je pense. Bien que 256 semble être un bon chiffre rond à doubler.
Ed Marty
4
Je trouve ça drôle chaque fois que nous ne savons pas ce que serait une bonne longueur, nous nous retrouvons toujours avec 256 ou un autre multiple de 2.
JoshBerke
2
Eh bien 512 sonne bien, ce qui me donne au moins 10 ans de versions .net et d'autres déchets à accumuler et d'ici là, j'espère être à la retraite. Merci encore
JoshBerke
1
@Josh: "d'ici là j'espère être à la retraite" ... où ai-je déjà entendu ça?! ;-)
Cerebrus
3

Supposons que la chaîne d'agent utilisateur n'a pas de limite sur sa longueur et préparez-vous à stocker une telle valeur. Comme vous l'avez vu, la longueur est imprévisible.

Dans Postgres, il existe un type de texte qui accepte des chaînes de longueur illimitée. Utiliser ça.

Cependant, vous devrez probablement commencer à tronquer à un moment donné. Appelez-le bon à un incrément raisonnablement utile (200, 1k, 4k) et jetez le reste.

Brad Koch
la source
2

En voici un qui fait 257

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

bleuâtre
la source
Jusqu'à présent, j'ai vu jusqu'à 255 caractères sur un site à très faible trafic. Pas étonnant donc. .Net 4.0 ajoutera probablement 20 autres caractères également.
JoshBerke
1

Pas une indication de la taille d'un agent utilisateur, car il y a beaucoup de réponses montrant les cas marginaux qu'ils ont rencontrés, mais la plus longue que l'on puisse trouver sur http://www.useragentstring.com/pages/useragentstring.php? name = Tout était de 250 octets.

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

Travis
la source