/
588.txt
734 lines (552 loc) · 35.1 KB
/
588.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
* 仕様書
[REFS[
- [83] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-5.5.3>
- [33] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-9.6>
- [119] [CITE@en-US[Fetch Standard]] ([TIME[2016-03-31 16:33:52 +09:00]] 版) <https://fetch.spec.whatwg.org/#default-user-agent-value>
- [29] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-04-03 15:54:50 +09:00]] 版) <https://html.spec.whatwg.org/#navigatorid>
]REFS]
* 意味
[106] [CODE(HTTP)@en[[[User-Agent:]]]] や [CODE(JS)@en[[[navigator.userAgent]]]]
は、次のような目的で用いられています。
[FIG(list)[
- [107] [[利用者エージェント]]に基づく[[内容折衝]]
-- [112] [[利用者エージェント]]の実装する機能や不具合の状況による分岐
-- [111] [[ダウンロード]]ページ等における[[ダウンロード]]対象や説明文の差し替え
-- [114] 有害な[[利用者エージェント]]からのアクセスの遮断
- [113] [[クライアント]]のアクセス環境の調査
-- [108] [[利用者]]の環境に関する統計的情報の取得 (いわゆる[[アクセス解析]])
-- [110] 正しくない挙動や[[サーバー]]に害を与える[[利用者エージェント]]の特定
-- [109] [[Webアプリケーション]]の[[お問い合わせ]]フォーム等における[[利用者]]の環境の情報の取得
]FIG]
[120] [DFN[[RUBYB[既定[CODE(HTTP)@en[User-Agent]]値]@en[default `[CODE[User-Agent]]` value]]]]は、
[CODE(HTTP)@en[User-Agent:]] [[ヘッダー]]に使う[[利用者エージェント]]定義の値です
[SRC[>>119]]。
この値は [[HTTP-network-or-cache fetch]] で [CODE(HTTP)@en[User-Agent:]]
[[ヘッダー]]に設定されるほか、 [CODE(JS)@en[navigator.userAgent]] でも使われます。
* HTTP
[46] [[HTTP]] では [CODE[User-Agent:]] [[ヘッダー]]の値として[[利用者エージェントの識別]]情報を記述できます。
;; [CODE[User-Agent:]] 参照。
* JavaScript
[51] [[利用者エージェント]]は、
[DFN[[RUBYB[navigator互換性モード]@en[navigator compatibility mode]]]]を持ちます。
[[Chrome]]、[[Gecko]]、[[WebKit]] のいずれかです。 [SRC[>>29]]
;; [52] 本来いずれか1つに統一するべきところですが、
[[Web互換性]]を保ちつつ統一する方法が見出されず、やむを得ず3種類のまま[[標準化]]されました。
[35] [CODE(DOMi)@en[Navigator]] [[オブジェクト]]には次のメンバー
(特記がない限り[[IDL属性]]) があります。
これらは[[仕様書]]上は [DFN[[CODE(DOMi)@en[NavigatorID]]]] [[インターフェイス]]
([CODE(xattr IDL)@en[NoInterfaceObject]]) と呼ばれています。 [SRC[>>29]]
[FIG(table)[
:name: メンバー名
:window: [[文書環境]]
:worker: [[ワーカー環境]]
:Chrome: [[navigator互換性モード]] = [[Chrome]]
:WebKit: [[navigator互換性モード]] = [[WebKit]]
:Gecko: [[navigator互換性モード]] = [[Gecko]]
:name: [DFN[[CODE(DOMa)@en[appCodeName]]]]
:window: ○
:worker: ○
:Chrome: [CODE[Mozilla]]
:Gecko: [CODE[Mozilla]]
:WebKit: [CODE[Mozilla]]
:name: [DFN[[CODE(DOMa)@en[appName]]]]
:window: ○
:worker: ○
:Chrome: [CODE[Netscape]]
:Gecko: [CODE[Netscape]]
:WebKit: [CODE[Netscape]]
:name: [DFN[[CODE(DOMa)@en[appVersion]]]]
:window: ○
:worker: ○
:Chrome: [CODE[4.0]] または[[ブラウザー]]の版の[[文字列]]
:Gecko: [CODE[4.0]] または[[ブラウザー]]の版の[[文字列]]
:WebKit: [CODE[4.0]] または[[ブラウザー]]の版の[[文字列]]
:name: [DFN[[CODE(DOMa)@en[platform][navigator.platform]]]]
:window: ○
:worker: ○
:Chrome: [[空文字列]]または[[プラットフォーム][プラットフォーム (Web)]]名の[[文字列]]
:Gecko: [[空文字列]]または[[プラットフォーム][プラットフォーム (Web)]]名の[[文字列]]
:WebKit: [[空文字列]]または[[プラットフォーム][プラットフォーム (Web)]]名の[[文字列]]
:name: [DFN[[CODE(DOMa)@en[product][navigator.product]]]]
:window: ○
:worker: ○
:Chrome: [CODE[Gecko]]
:Gecko: [CODE[Gecko]]
:WebKit: [CODE[Gecko]]
:name: [DFN[[CODE(DOMa)@en[productSub]]]]
:window: ○
:worker: ×
:Chrome: [CODE[20030107]]
:Gecko: [CODE[20100101]]
:WebKit: [CODE[20030107]]
:name: [DFN[[CODE(DOMa)@en[userAgent][navigator.userAgent]]]]
:window: ○
:worker: ○
:Chrome: [[既定[CODE(HTTP)@en[User-Agent]]値]]
:Gecko: [[既定[CODE(HTTP)@en[User-Agent]]値]]
:WebKit: [[既定[CODE(HTTP)@en[User-Agent]]値]]
:name: [DFN[[CODE(DOMa)@en[vendor]]]]
:window: ○
:worker: ×
:Chrome: [CODE[Google Inc.]]
:Gecko: [[空文字列]]
:WebKit: [CODE[Apple Computer, Inc.]]
:name: [DFN[[CODE(DOMa)@en[vendorSub]]]]
:window: ○
:worker: ×
:Chrome: [[空文字列]]
:Gecko: [[空文字列]]
:WebKit: [[空文字列]]
:name: [DFN[[CODE(DOMa)@en[oscpu]]]]
:window: ○
:worker: ×
:Chrome: なし
:WebKit: なし
:Gecko: [[空文字列]]または[[プラットフォーム]]を表す[[文字列]]
:name: [DFN[[CODE(DOMm)@en[taintEnabled]]]]
:window: ○
:worker: ×
:Gecko: [[偽]]を返す[[メソッド]]
:WebKit: なし
:Chrome: なし
]FIG]
-*-*-
[86] [CODE[navigator.appVersion]] は、 [[Web互換性]]と [[fingerprinting]] 防止のため、
次の値を返すべきです。
[FIG(steps)[
= [87] [VAR[ua]] を、 [[既定[CODE(HTTP)@en[User-Agent]]値]]に設定します。
= [92] [VAR[ua]] の先頭から [CODE[Mozilla/]] を除去します。
= [88] [[navigator互換性モード]]が [[Gecko]] の場合、
== [90] [VAR[ua]] の最初の [CODE[;]] とそれ以後を除去します。
== [94] [VAR[ua]] が [CODE[5.0 (Windows]] から始まる場合、
=== [95] [CODE[ua]] を [CODE[5.0 (Windows]] に設定します。
== [96] [VAR[ua]] の末尾に [CODE[)]] を追加します。
= [93] [VAR[ua]] を返します。
]FIG]
-*-*-
[85] [CODE[navigator.platform]] は、 [[Web互換性]]と [[fingerprinting]] 防止のため、
次の値を返すべきです。
[FIG(switch)[
: [[Windows]] : [[navigator互換性モード]]が [[Gecko]] なら [CODE[Win64]]、
それ以外なら [CODE[Win32]]
: [[Mac OS X]] : [CODE[MacIntel]]
: [[iPad]]: [CODE[iPad]]
: [[iPhone]] : [CODE[iPhone]]
: [[Linux]] : [CODE[Linux x86_64]]
: [[Android]] : [CODE[Linux armv7l]]
: それ以外 : [[空文字列]]
]FIG]
[66] [CODE[navigator.platform]] が [[Windows]] であるかどうかは、
[CODE[endings]] の挙動に影響します。
-*-*-
[97] [CODE[navigator.oscpu]] は、 [[Web互換性]]と [[fingerprinting]] 防止のため、
次の値を返すべきです。
[FIG(switch)[
= [98] [CODE[navigator.platform]] の値が [CODE[Win64]] の場合、
== [CODE[Windows NT 10.0; Win64; x64]] を返します。
= [100] それ以外の場合、
== [CODE[navigator.platform]] の値を返します。
]FIG]
* 利用者エージェント値の命名規則
[55] [[スマートフォン]] ([[タブレット]]を含みません。) として動作する[[利用者エージェント]]は、
値に [CODE[Mobile]] が含まれることが期待されてます [SRC[>>79]]。
;; [56] [[タブレット]]で共通に含まれる[[文字列]]はありません。
[53] [[テレビ]]として動作する[[利用者エージェント]]は、
値に [CODE[TV]] が含まれることが期待されています [SRC[>>122]]。
[103]
[[Web互換性]]のため[[利用者エージェント]]は
[[Webブラウザー]]であるか否かに関わらず
「[[Webブラウザー]]らしい」
[[利用者エージェント]]値を使わなければなりません。
[105]
一方で[[利用者エージェント]]値が
[[Webブラウザー]]かどうかで場合分けする[[サーバー]]も存在するため、
そのすべての機能を利用するためには、
「[[Webブラウザー]]らし」くない[[利用者エージェント]]値を使うこともできなければなりません。
- [20] Mozilla での UA 名の指針
-- [32] '''user-agent string'''
--- <http://www.mozilla.org/build/revised-user-agent-strings.html> (原文)
--- <http://jt.mozilla.gr.jp/build/revised-user-agent-strings.html> (和訳)
- [21] ''J-Sky Web/技術資料 ユーザーエージェントについて''
<http://www.dp.j-phone.com/jsky/user.html>
- [22] ''iモード対応HTMLの考え方'' <http://www.nttdocomo.co.jp/mc-user/i/tag/s2.html>
- [23] ''NTT東日本:Lモード'' <http://www.ntt-east.co.jp/Lmode/06_contents/02_tsukuri.html> から入手できる技術条件説明書 <http://www.ntt-east.co.jp/Lmode/06_contents/pdf/cp_gijutsu2_2.exe>
- [24] [[Monazilla]] <http://members.jcom.home.ne.jp/monazilla/document/oyster_subjecttxt.html>
- [25] [[DOLIB]] 1.00 <http://kage.monazilla.org/system_DOLIB100.html>
- [60] [[au]] ''技術情報'' <http://www.au.kddi.com/ezfactory/tec/spec/4_4.html>
[64]
[CITE[端末属性通知プロトコルの標準提案]] ([TIME[2002-09-05 20:59:22 +09:00]] 版) <http://www.mcf.to/eia/news/0909protocol.html>
;; [26] [CODE[User-Agent:]] も参照。
** アプリ内ブラウザーの利用者エージェント名
[126] [[アプリ内ブラウザー]]を参照。
* User-Agent: 欄詐称問題
[36] HTTP 要求頭欄の User-Agent: では、伝統的に [[Mozilla]] を名乗る人達が多いです。
- [37] User-Agent: Mozilla/4.0 (compatible; ・・・)
のように [CODE[compatible]] と名乗るのはまだ良い方で、 Mozilla と区別出来ない
UA を送りつける UA もいます。
[28] >>36 最近でも使われてるブラウザーでいうと、 [[BBB]] が [CODE[Mozilla/2]]
を名乗るけど [CODE[compatible]] を含めないとか。
[38] かつて Mozilla が市場独占に近い状態だった (ほんとか?) 頃に、
UA: を見て Mozilla と非 Mozilla で処理を分けていたサーバーが少なくなかったんで、
非 Mozilla UA がこれに対抗するため Mozilla を名乗ったという伝説が
ありますが、真偽は定かじゃありません。知ってたら教えて下さい。
[39] ReGet とか IRIA とか wget とかの download 専門家達は一部サーバー管理者から
迫害されているので、 UA: を見て締め出されていて、それに対抗するために
詐称機能 (というか、 UA: を自由に設定できる機能) があります。
昔は既定値が Mozilla とかだったりすることも少なくなかったみたいですが、
最近はちゃんと自分の名前を名乗ってるっぽいです。
- [41] ちなみに、 [[WinIE]]1 はちゃんと ''Microsoft Internet Explorer'' と名乗っていました。 Mozilla compatible と詐称するようになったのは 2 からです。
- [42] ''Mac関連ネタを凄い勢いで翻訳スレ2'' <http://pc.2ch.net/test/read.cgi/mac/1035938842/347-351> [[Safari]] の [[Gecko]] 詐称についての開発者の釈明 (の和訳) あり
** Q&A コーナー
[1] ブラウザレポートに出てくる
Netscape (compatible)
ってのは、NN互換の他のブラウザってことなのかな。
それとも、 NNそのものなわけ?
で結局、これはIE5-6,NN6並に
CSSを認識してくれるブラウザなのかと問いたい。
[2] >>1 どんな report なのかわかりませんが、その元になっている
[[HTTP]] の [[User-Agent:欄]]の情報は、みんなそろって [[Mozilla]]
を名乗るという悪しき伝統がありまして、既知の情報から推定した
細かい条件をチェックして、ほんとに Mozilla/[[Netscape]]
なのか、それとも IE なのか、はたまた(以下略)を推測するんです。
(IE とかは、いちおう compatible という文字を入れてるので
区別できるんですが、中には本家 Mozilla と全く区別がつかない
奴もいるとか。)
[3] というわけで、 compatible を名乗るんだから互換性が
あるとみなして送りつけてやったらどうですか? としか言いようが
ありませぬ。
たとえば「Mozilla/2.0 (compatible; Ask Jeeves)」
だったら自称 Mozilla (Netscape Navigator) 2.0 互換ですので、
(もし相手にするのなら) それ相応の応答 (新機能! の[[フレーム]]
とか、[[プラグイン]] (たしか [[Windoze]] 版のみ実装。)とか、
[[Java]] とか [[JavaScript]] (旧称 [[LiveScript]]) とかを使ったもの。)
を返すのがいいのではないでしょうか:-)
[4] >>2-3 てことは、
「おかしなブラウザ使ってるオタク野郎」と見なしていいでしょうか。
もしくは、おかしなブラウザしか使えないあほ組織のPCとか。
[5] >>4 [[ブラウザ]]じゃない、[[検索円陣]]とかの [[UA]] の可能性もあります。
** その他メモ
- [40] [WEAK[2002-12-27 09:29]] ''[[Mozilla]]'': [[User-Agent:欄]]から詐称部門を引越しして、元の内容は Q&A コーナーとしますた。今後 UA 詐称問題は (Mozilla に限らず) こちらで扱いましょう。
[43]
[CITE@ja[CaminoのUA文字列 - Torisugari の日記]] ([CODE[2007-06-22 02:44:08 +09:00]] 版) <http://slashdot.jp/~Torisugari/journal/407122?from=rss>
([[名無しさん]] [WEAK[2007-06-24 07:21:01 +00:00]])
[44]
[CITE@ja[ウィルスバスター(トレンドマイクロ)からのアクセス - えむもじら]] ([CODE[2007-08-05 18:01:24 +09:00]] 版) <http://level.s69.xrea.com/mozilla/index.cgi?id=20070805_VirusBuster>
([[名無しさん]] [WEAK[2007-08-06 12:07:49 +00:00]])
[45]
[CITE@en[Browser Sniffing History in the Chrome UA String]] ([[Henri Sivonen]] 著, [TIME[2008-09-09 00:47:11 +09:00]] 版) <http://hsivonen.iki.fi/chrome-ua/>
([[名無しさん]])
[19] 文字列に [CODE[[[iPhone]]]] が入っているかどうかで、[[スマートフォン版]]かどうかを切り替えるサイトが存在します。
* UA sniffing
[47] [[Webブラウザー]]には不具合や制約があって、
[[著者]]が[[スクリプト]]から[[Webブラウザー]]を判定して対処せざるを得ないことがあります
[SRC[>>29]]。
[48] そのような判定は、既知の現在の版を判定するものとする[SHOULD[べきです]]。
将来の版や未知の版は、[[仕様書]]に[[適合]]するものと仮定する[SHOULD[べきです]]。
[SRC[>>29]]
[49] この情報は、 [[fingerprinting vector]] です。
[[利用者エージェント]]は、できるだけ少ない情報にとどめることが[RUBYB[強く望まれています]@en[strongly urged]]。
[SRC[>>29]]
[FIG(short list)[ [18] [[UA sniffing]] 手法
- [CODE(HTTP)@en[User-Agent]] 検査
- [CODE(DOMi)@en[Navigator]] 検査
- [[CSS hack]]
- [[条件付注釈]]
]FIG]
[50] 実際のところ、規格違反の文字列を使う例や詐称により実際の情報が注釈内に押し込まれている例が多すぎることから、仕様に基づいた parser を作って前半(名前)・後半(版)を見て処理を云々というのは現実的でなく、そうした処理をする多くの実装 ([[CGI]] script やサーバーなど。) は[[正規表現]]を使って処理しています。確かにこれが最も現実的な方法でしょう。
[57] ''ブラウザ判別では"Gecko"を調べてください - Web標準普及プロジェクト'' <http://www.mozilla.gr.jp/standards/webtips1005.html>
[58] [[RFC2936]] HTTP MIME 型取扱器判別
-*-*-
[34] 機能の有無の判定には、 [[UA sniffing]] を使うべきではありません。
近年導入されたほとんどの機能には、それぞれの機能の判定方法が用意されています。
特定の [[Webブラウザー]]であるかどうかではなく、特定の機能が利用可能かどうかを判定するべきです。
[127] 版番号検知の失敗事案: [[バージョニングの失敗]], [[年問題]]
[129]
[CITE@ja[Opera 10は「Opera 1」に間違えられる? | スラド IT]], [TIME[2024-01-25T08:07:53.000Z]] <https://it.srad.jp/story/08/12/26/0047250/>
* 利用者エージェント名の一覧
[20] [[HTTP]] で [[User-Agent:欄]]に実際に使われている名前についての
情報源:
- [21] <http://www.dais.is.tohoku.ac.jp/logs/agentgripes.html>
- [22] <IW:YukiWiki:UserAgent>
- [23] <http://inhand.jp/index.cgi?action=viewnews&id=99>
- [5] [[WikiUserAgentList]]
- [6] '':: 偽られたUA ::'' <http://pc3.2ch.net/test/read.cgi/hp/1015925179/>
- [7] ''あなたの User-Agent 教えてください'' <http://pc.2ch.net/test/read.cgi/php/990173593/>
- [8] ''User-Agent統計'' <http://www2.startshop.co.jp/~68user/cgi-bin/view-browser.cgi>
- [9] ''偽装UAを熱烈に募集し、まとめてみたページ''' <http://members.tripod.co.jp/g_ua/>'''''
- [10] [[NN]] 1.22 = [CODE[Mozilla/1.22 (Windows; I; 32bit)]]
[11] HTTP じゃないですけど、最近の [[Mew]] はこんなのをつけるらしいです。
[PRE[
User-Agent: Mew/3.1.53 Emacs/21.2.93 (i386-mingw-nt4.0.1381) Mule/5.0
=?iso-2022-jp?B?KBskQjgtTFobKEIp?= Meadow/1.99 Alpha4
=?iso-2022-jp?B?KBskQkU0GyhCKQ==?=
]PRE]
設定次第, かもしれません。 Kazu さんのは従来通り [[X-Mailer:]] だし。
で、この例のように [[encoded-word]] を生で使っていると、例えば [CODE(ABNF)["="]]
は [[tspecials]] ですから、 [[HTTP]] や [[usefor-article]]
の構文に照らして不当です。
もっとも、現時点で[[電子メイル]]における [CODE[User-Agent:]]
欄の定義は存在しない以上, 非構造欄だとか, そうでなくても [CODE(ABNF)[tspecials]]
も使えるんだとか, そういう主張はできなくもないですが。
- [12] ''Comments on AgentGripes'' <http://web.archive.org/web/20011019120517/http://www.dais.is.tohoku.ac.jp/logs/comment.html#reqheaader>
- [13] UA じゃなくて [[Server:]] の方ですが、 [[Zope]] の例: [CODE(HTTP)[Server: Zope/(Zope 2.5.1 (source release, python 2.1, linux2), python 2.1.3, freebsd4) ZServer/1.1b1]]。面白い例でしょ? 文法違反だけど。
- [14] なんと、 <IW:Google:"UserAgent 一覧"> (日本語) で[WEAK[<IW:YukiWiki:UserAgent> を6位に抑えて]] 3位!
- [31] [TIME[2003-08-29 11:48:17 +00:00]] ''>>14'': ほんとだ! すごいじゃん。内容ないのに(w
- [16] ''WWW Agents List'' <http://www.kmc.gr.jp/~ranran/tips/www-agents.html>
- [43] '''Some Gripes on User-Agent'''
<http://www.dais.is.tohoku.ac.jp/logs/agentgripes.html> [[UA]] の実例が一杯。
[63]
[CITE@en[The ELinks Manual]] ([[Petr Baudis, Jonas Fonseca Madsen, Miciah Dashiel Butler Masters]] 著, [CODE[2007-03-18 16:03:15 +09:00]] 版) <http://elinks.or.cz/documentation/manual.html#useragent>
[FIG(table)[ [54] [[利用者エージェントの識別]]情報の実例
:n: [[利用者エージェント]]
:compat: [[navigator互換性モード]]
:ua: [CODE[navigator.userAgent]]
:appversion: [CODE[navigator.appVersion]]
:platform: [CODE[navigator.platform]]
:oscpu: [CODE[navigator.oscpu]]
:n: [[Firefox]] [[Windows]]
:compat: [[Gecko]]
:oscpu: [CODE[Windows NT 10.0; Win64; x64]]
:vendor: [CODE[]]
:vendorsub: [CODE[]]
:productsub: [CODE[20100101]]
:buildID: [CODE[20171206182557]]
:appcodename:[CODE[Mozilla]]
:appname:[CODE[Netscape]]
:appversion:[CODE[5.0 (Windows)]]
:platform:[CODE[Win64]]
:ua:[CODE[Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0]]
:product:[CODE[Gecko]]
:n: [[Firefox]] [[Linux]]
:ua: [CODE[Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0]]
:platform: [CODE[Linux x86_64]]
:oscpu: [CODE[Linux x86_64]]
:appversion: [CODE[5.0 (X11)]]
:compat: [[Gecko]]
:n: [[Firefox]] [[Android]]
:ua: [CODE[Mozilla/5.0 (Android 4.4; Mobile; rv:55.0) Gecko/55.0 Firefox/55.0]]
:appversion: [CODE[5.0 (Android 4.4)]]
:platform: [CODE[Linux armv7l]]
:oscpu: [CODE[Linux armv7l]]
:compat: [[Gecko]]
:n: [[Chrome]] [[Linux]]
:ua: [CODE[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3103.0 Safari/537.36]]
:platform: [CODE[Linux x86_64]]
:appversion: [CODE[5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3103.0 Safari/537.36]]
:compat: [[Chrome]]
:n: [[Chrome]] [[Android]]
:ua: [CODE[Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/KRT16M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.116 Mobile Safari/537.36]]
:appversion: [CODE[5.0 (Linux; Android 4.4; Nexus 5 Build/KRT16M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.116 Mobile Safari/537.36]]
:platform: [CODE[Linux armv7l]]
:compat: [[Chrome]]
:n: [[Chrome]] [[Android]] ([[Windows]] 版でエミュレート)
:ua: [CODE[Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Mobile Safari/537.36]]
:appversion: [CODE[5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Mobile Safari/537.36]]
:platform: [CODE[Win32]]
:compat: [[Chrome]]
:n: [[Chrome]] [[Windows]]
:ua: [CODE[Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36]]
:appversion: [CODE[5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36]]
:platform: [CODE[Win32]]
:compat: [[Chrome]]
:n: [[Chrome]] [[Windows]]
:ua: [CODE[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36]]
:appversion: [CODE[5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36]]
:platform: [CODE[Win32]]
:compat: [[Chrome]]
:n: [[IE9]]
:ua: [CODE[Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)]]
:appversion: [CODE[5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)]]
:platform: [CODE[Win32]]
:compat: [[Gecko]] だが
[CODE[navigator.product]],
[CODE[navigator.productSub]],
[CODE[navigator.vendor]],
[CODE[navigator.vendorSub]], [CODE[navigator.oscpu]] は未実装
:n: [[IE11]]
:ua: [CODE[Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; HCTE; rv:11.0) like Gecko]]
:appversion: [CODE[5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; HCTE; rv:11.0) like Gecko]]
:platform: [CODE[Win32]]
:compat: [[Gecko]] だが [CODE[navigator.productSub]],
[CODE[navigator.vendorSub]], [CODE[navigator.oscpu]] は未実装
:n: [[Edge]]
:ua: [CODE[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393]]
:appversion: [CODE[5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393]]
:platform: [CODE[Win32]]
:compat: [[Chrome]]/[[WebKit]] だが [CODE[navigator.vendor]] は[[空文字列]]
:n: [[Mobile Safari]]
:compat: [[WebKit]]
:appcodename:[CODE[Mozilla]]
:appname: [CODE[Netscape]]
:appversion:[CODE[5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0 Mobile/15C153 Safari/604.1]]
:platform:[CODE[iPhone]]
:product:[CODE[Gecko]]
:productsub:[CODE[20030107]]
:ua:[CODE[Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0 Mobile/15C153 Safari/604.1]]
:vendor:[CODE[Apple Computer, Inc.]]
:vendorsub:[CODE[]]
]FIG]
* プライバシー
[17] [[利用者エージェントの識別]]情報は、 [[fingerprinting vector]] です。
* セキュリティー
[91] [CODE(HTTP)@en[[[User-Agent:]]]] の値は [[fingerprinting]]
に使われることがあり [SRC[>>83]]、注意が必要です。
[15] Security や privacy を理由に、 UA: 欄や
[[Server]]が送られることに懸念を示す人がいます。
確かに個々の場合において問題が発生する可能性はあるでしょう。
(例えば UA: 欄に特定の文字列が入っていたら攻撃する人がいるとか。)
しかし一般論として、例えばこれらの情報を送らないことで安全性が向上するということはありません。
[16] >>15 わざわざソースから削って出力させなくするような人もいるらしいですが、安全性の向上を狙っているならはっきり言って無駄なことです。
[30] [[RFC 7231]] はソフトウェアの情報を示すことによって既知の[[セキュリティーホール]]を攻撃される危険性があるとしつつも、
実際にはソフトウェアの版に関わらず攻撃される虞があることをも指摘しています
[SRC[>>33]]。
* 歴史
[27] [CODE[User-Agent:]], [CODE[Navigator]] の歴史の項も参照。
[68] [CITE[Chrome 11 におけるユーザーエージェント文字列の変更 - Google Japan Developer Relations Blog]]
( ([TIME[2011-06-07 20:00:25 +09:00]] 版))
<http://googledevjp.blogspot.com/2011/06/chrome-11.html>
[69] [CITE[Bug 690287 – Tracking bug for UA sniffers failing to handle a two-digit version]]
( ([TIME[2011-10-04 08:13:27 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=690287>
[70] [CITE[Request Headers in the HTTP protocol]]
( ([TIME[2001-11-29 11:01:38 +09:00]] 版))
<http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#user-agent>
[71] [CITE@en[Gecko user agent string reference - MDN]]
( ([TIME[2012-07-06 00:45:55 +09:00]] 版))
<https://developer.mozilla.org/en/Gecko_user_agent_string_reference>
[72] [CITE@en[Chrome for Android User-Agent - Google Chrome Mobile — Google Developers]]
( ([TIME[2012-06-28 19:56:53 +09:00]] 版))
<https://developers.google.com/chrome/mobile/docs/user-agent>
[73] [CITE@en[IE10 のユーザー エージェント文字列が更新されました - IEBlog 日本語 - Site Home - MSDN Blogs]]
( ([TIME[2012-07-17 03:51:15 +09:00]] 版))
<http://blogs.msdn.com/b/ie_ja/archive/2012/07/16/ie10-user-agent-string-update.aspx>
[74] [CITE[OperaのUAは以後ずっとOpera/9.80になります - by edvakf in hatena]]
( ([TIME[2012-07-17 03:56:00 +09:00]] 版))
<http://d.hatena.ne.jp/edvakf/20090527/1243449333>
[75] [CITE@en[Changes in Opera’s user agent string format - Dev.Opera]]
( ([TIME[2012-07-17 03:56:23 +09:00]] 版))
<http://dev.opera.com/articles/view/opera-ua-string-changes/>
[76] [CITE@ja[Google ウェブマスター向け公式ブログ: スマートフォン版 Googlebot-Mobile の導入について]]
( ([TIME[2012-07-18 14:36:02 +09:00]] 版))
<http://googlewebmastercentral-ja.blogspot.jp/2011/12/googlebot-mobile.html>
[79] [CITE@en[Chrome for Android User-Agent - Google Chrome Mobile — Google Developers]]
( ([TIME[2012-06-28 19:56:53 +09:00]] 版))
<https://developers.google.com/chrome/mobile/docs/user-agent>
[81] [CITE@en-US[Gecko user agent string reference - HTTP | MDN]]
( ([TIME[2014-06-16 13:25:45 +09:00]] 版))
<https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference>
[FIG(quote)[
[FIGCAPTION[
[99] [CITE[HbbTV 2.0 Specification (2015-02-02)]]
([TIME[2015-02-10 01:01:20 +09:00]] 版)
<http://www.hbbtv.org/pages/about_hbbtv/HbbTV_specification_2_0.pdf#page=60>
]FIGCAPTION]
> The User-Agent header shall include:
> HbbTV/1.3.1 (<capabilities>; [<vendorName>]; [<modelName>]; [<softwareVersion>];
> [<hardwareVersion>]; <reserved>)
]FIG]
[FIG(quote)[
[FIGCAPTION[
[104] [CITE@en[Pipelight - ArchWiki]]
([TIME[2015-07-11 13:26:59 +09:00]] 版)
<https://wiki.archlinux.org/index.php/Pipelight>
]FIGCAPTION]
> If you are here because you want to watch BlinkBox (UK) you need to install google-chromeAUR (Requires: version 42+) and use the User-Agent Switcher for Chrome extension with a Mac UA string 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36'. Windows UA strings will result in WP209 playback errors due to HDCP.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[115] [CITE@en[HTTPS and Keep-Alive Connections - IEInternals - Site Home - MSDN Blogs]]
([TIME[2015-08-16 15:36:27 +09:00]] 版)
<http://blogs.msdn.com/b/ieinternals/archive/2011/03/26/https-and-connection-close-is-your-apache-modssl-server-configuration-set-to-slow.aspx>
]FIGCAPTION]
> In the expression above, any IE version that starts with “1” will be treated as outdated and served connection slowly without Keep-Alive. Internet Explorer 1.0 didn’t even support SSL at all (SSL was added in 2.0), but worse, this loosely-written regular expression will also match future MSIE 10.0, MSIE 11.0, MSIE 12.0 (etc) user-agent strings. Hence, Apache hosts will one day find that the newest browsers are forced into the “slow” lane!
]FIG]
[FIG(quote)[
[FIGCAPTION[
[116] [CITE[iPhoneのアプリ内WebViewのUAまとめ(2015/12/15時点)とjsでの判定方法 - Qiita]]
([TIME[2016-03-07 00:18:01 +09:00]] 版)
<https://qiita.com/nabettu/items/e481412c4ca0f50e7fb5>
]FIGCAPTION]
> FacebookアプリWebView
> Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13C75 '''['''FBAN/FBIOS;FBAV/45.0.0.45.96;FBBV/18289579;FBDV/iPhone7,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/9.2;FBSS/2; FBCR/ドコモ;FBID/phone;FBLC/ja_JP;FBOP/5''']'''
]FIG]
[117] [CITE@en[Introduce default `User-Agent` value for usage by HTML · whatwg/fetch@d9a8ac1]]
([TIME[2016-03-09 15:25:13 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/d9a8ac12a33ab6a35826179dc3e8d88d4e06c66d>
[118] [CITE@en[Let Fetch define the default User-Agent value · whatwg/html@026aa96]]
([TIME[2016-03-09 15:25:41 +09:00]] 版)
<https://github.com/whatwg/html/commit/026aa966c944ce0f1180bc906646c00a3f7ebcbb>
[FIG(quote)[
[FIGCAPTION[
[121] [CITE[Acceptヘッダで判別するサーバーサイドのSVGフォールバック - 聴く耳を持たない(片方しか)]]
([TIME[2016-02-24 18:25:24 +09:00]] 版)
<http://d.hatena.ne.jp/rikuo/20151017>
]FIGCAPTION]
> 古いAndroid向けのブラウザアプリ、フィーチャーフォン向けのjig browser、さらにはNew 3DSにもUserAgent文字列を変更できる機能がついています。
]FIG]
[FIG(quote)[
[FIGCAPTION[
[122] [CITE@en[Define that "TV" should appear as token for UA-string when presentation API is used to render on TV · Issue #303 · w3c/presentation-api]]
( ([TIME[2016-05-27 10:58:00 +09:00]]))
<https://github.com/w3c/presentation-api/issues/303>
]FIGCAPTION]
> Mozilla's experience is that the few websites that today target TVs require that a "TV" token is included in the UA string in order for the website to render an appropriate TV UI.
> I think this is something that's worth getting into a specification as quickly as we can, in order to prevent the mess that we currently have on mobile. The problem on mobile was that originally there was no token to indicate "mobile device", which lead to websites solving the problem with perpetually out-of-date databases, harder for new players to enter the space, etc.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[125] [CITE@en[Webmention]]
([TIME[2017-01-11 04:06:01 +09:00]])
<https://webmention.net/draft/#h-sender-discovers-receiver-webmention-endpoint>
]FIGCAPTION]
> Senders may customize the HTTP User Agent '''['''RFC7231''']''' used when fetching the target URL in order to indicate to the recipient that this request is made as part of Webmention discovery. In this case, it is recommended to include the string "Webmention" in the User Agent. This provides people with a pointer to find out why the discovery request was made.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[128] [CITE@en[GitHub API v3 | GitHub Developer Guide]]
([TIME[2017-06-10 05:53:45 +09:00]])
<https://developer.github.com/v3/#user-agent-required>
]FIGCAPTION]
> All API requests MUST include a valid User-Agent header. Requests with no User-Agent header will be rejected. We request that you use your GitHub username, or the name of your application, for the User-Agent header value.
]FIG]
[59] [CITE@en[is_bot property is not implemented well · Issue #35 · selwin/python-user-agents]]
([TIME[2017-09-26 17:49:22 +09:00]])
<https://github.com/selwin/python-user-agents/issues/35>
[61] [CITE@en-US[Microsoft Edge for iOS and Android: What developers need to know - Microsoft Edge Dev BlogMicrosoft Edge Dev Blog]]
([TIME[2017-10-08 22:17:27 +09:00]])
<https://blogs.windows.com/msedgedev/2017/10/05/microsoft-edge-ios-android-developer/>
[62] [CITE[ソフトウェアの互換性と僕らの"User-Agent"文字列問題|Rui Ueyama|note]]
([TIME[2017-11-16 12:53:54 +09:00]])
<https://note.mu/ruiu/n/n577ff5814b5c>
[65] [CITE@en[Document BlobPropertyBag "endings", or keep pushing to remove? · Issue #46 · w3c/FileAPI]]
([TIME[2017-12-02 00:04:44 +09:00]])
<https://github.com/w3c/FileAPI/issues/46>
[67] [CITE[Release Notes for Safari Technology Preview 46 | WebKit]]
([TIME[2017-12-21 10:51:56 +09:00]])
<https://webkit.org/blog/8042/release-notes-for-safari-technology-preview-46/>
[77] [CITE@en-US[Browser detection using the user agent - HTTP | MDN]]
([TIME[2017-12-15 03:30:09 +09:00]])
<https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent>
[78] [CITE[javascript - What is the list of possible values for navigator.platform as of today? - Stack Overflow]]
([TIME[2018-02-25 16:59:58 +09:00]])
<https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today>
[80] [CITE@en[801614 - navigator.platform returns '' on Gonk]]
([TIME[2018-02-25 17:02:53 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=801614>
[82] [CITE@en[777710 - Remove platform and OS identifiers from B2G UA]]
([TIME[2018-02-25 17:05:31 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=777710>
[84] [CITE@en[777633 - Cannot view a video on mobile youtube on Firefox OS - vnd.youtube is not a registered protocol]]
([TIME[2018-02-25 17:06:06 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=777633>
[89] [CITE@en-US[Navigator.oscpu - Web APIs | MDN]]
([TIME[2018-02-25 17:31:57 +09:00]])
<https://developer.mozilla.org/en-US/docs/Web/API/Navigator/oscpu>
[101] [CITE[User Agent Strings - Google Chrome]]
([TIME[2018-02-25 19:33:02 +09:00]])
<https://developer.chrome.com/multidevice/user-agent>
[102] [CITE@en[Android Developers Blog: Android Browser User-Agent Issues]]
([TIME[2018-02-23 21:23:55 +09:00]])
<https://android-developers.googleblog.com/2010/12/android-browser-user-agent-issues.html>
[123] [CITE@en[www.bestbuy.com - Firefox is an unsupported browser · Issue #115507 · webcompat/web-bugs · GitHub]], [TIME[2023-01-02T11:07:34.000Z]] <https://github.com/webcompat/web-bugs/issues/115507>
[124] [CITE@en[1805967 - Freeze `rv:` segment in the User Agent string to `rv:109.0` to avoid erroneous IE11 detection]], [TIME[2023-01-02T11:08:11.000Z]] <https://bugzilla.mozilla.org/show_bug.cgi?id=1805967>