/
251.txt
276 lines (218 loc) · 12.7 KB
/
251.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
[5] [[ドメイン名]]における[DFN[[RUBYB[ラベル]@en[label]]]]とは、 [CODE(char)[[[.]]]]
で区切られたそれぞれの部分のことです。
* DNS における定義
[11] [[ラベル]]は、 [CODE(ABNF)@en[[[ALPHA]]]], [CODE(ABNF)@en[[[DIGIT]]]],
[CODE(char)[[[-]]]] の1文字以上の連続です。ただし、先頭1文字と末尾1文字は [CODE(char)[[[-]]]]
であってはなりません。
[FIG(railroad)[
= |
== [CODE[[[ALPHA]]]]
== [CODE[[[DIGIT]]]]
= ?
== *
=== |
==== [CODE[[[ALPHA]]]]
==== [CODE[[[DIGIT]]]]
==== [CODE[[[-]]]]
== |
=== [CODE[[[ALPHA]]]]
=== [CODE[[[DIGIT]]]]
]FIG]
;; [12] 以前は先頭1文字が [CODE(ABNF)@en[[[DIGIT]]]] であることも認められていませんでしたが、
[[RFC 1123]] で緩和されています [SRC[>>66]]。
[[差分仕様書]]の悪習で改訂されていることが分かりにくいため、
緩和されていることを知らず [[RFC]] 違反だなどと誤解されることが21世紀に入ってもなお後を絶ちません。
[1] [[IDN2008]] ではこれを「[[LDHラベル]]」と呼んでいます。
この意味での「[[ラベル]]」の詳細は [[LDHラベル]]の項を参照してください。
** 仕様書
[REFS[
- [67] [CITE@en[RFC 1034 - Domain names - concepts and facilities]] ([TIME[2013-11-15 02:48:06 +09:00]] 版) <http://tools.ietf.org/html/rfc1034#section-3.5>
- [66] [CITE@en[RFC 1123 - Requirements for Internet Hosts - Application and Support]] ([TIME[2013-11-15 03:02:57 +09:00]] 版) <http://tools.ietf.org/html/rfc1123#section-2>
]REFS]
* IDNA における定義
** IDNA2003、IDNA2008 での定義
[1]
> [DFN[[RUBY[ラベル][なふだ]@en[label]]]]は、
[[ドメイン名]]の個々の部分です。
[[ラベル]]は通常[RUBYB[[[点]]]@en[dot]]で区切って示されます。
例えば、[[ドメイン名]] [CODE(example)@en[[[www.example.com]]]]
は、 [CODE(example)@en[[[www]]]]、
[CODE(example)@en[[[example]]]]、
[CODE(example)@en[[[com]]]] の3つの[[ラベル]]で構成されます。
([DEL[[[STD 13]] で[[長さ]][[零]]の[[根ラベル]]が説明されています。]] [INS[[[RFC 1123]] で末尾[RUBYB[[[点]]]@en[dot]]を使った完全な名前の表記法が説明されています。]]
これは明示的に [CODE(example)@en[[[www.example.com.]]]]
のように記述したり、暗示的に
[CODE(example)@en[[[www.example.com]]]]
としたりします。しかし、この[[文書]]では[DEL[[[ラベル]]とは]]考えません。)
[[IDNA]] は [INS[([[RFC 1035]] や [[RFC 2181]] の[[バイナリ列ラベル]]や [[RFC 2673]] の[[ビット列ラベル]]ではなく)]]
[[テキスト]]である[[ラベル]]で使用可能な[[文字]]の[[集合]]を[INS[特定の文脈において]]拡張します。[INS[利用可能な[[文字]]の[[集合]]は文脈によって異なり、次の節で説明します。]]
この[[文書]]では、以後、[Q[[[ラベル]]]]という[[用語]]を[Q[[RUBYB[[[テキスト・ラベル]]]@en[text label]]]]の略、
[Q[[RUBYB[[[各ラベル]]]@en[every label]]]]を[Q[[RUBYB[[[各テキスト・ラベル]]]@en[every text label]]]]の略として使います。
;; [15] 追加と削除は [[IDNA2003]] と [[IDNA2008]] での違いです。
** UTS #46 での定義
[33] [SRC[>>34]]
> a [DFN(en)[label]] is a substring of a domain name. That substring is bounded on both sides by either the start or the end of the string, or any of the following characters, called [DFN[[[label-separators]]]]
** 仕様書
[REFS[
- [13] [[IDNA2003]] [[RFC 3490]] 2.
- [14] [[IDNA2008]] [CITE@en[RFC 5890 - Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework]]
<http://tools.ietf.org/html/rfc5890#page-7>
- [36] [CITE@en-us[UTS #46: Unicode IDNA Compatibility Processing]]
-- [34] '''<http://unicode.org/reports/tr46/#Notation>'''
-- [56] <http://unicode.org/reports/tr46/#Conformance>
-- [37] <http://unicode.org/reports/tr46/#Validity_Criteria>
]REFS]
* HSTS での定義
>
[69]
:domain name label:
is that portion of a domain name appearing "between the dots",
i.e., consider "foo.example.com": "foo", "example", and "com" are
all domain name labels.
[REFS[
- [68] [CITE@en[RFC 6797 - HTTP Strict Transport Security (HSTS)]] ([TIME[2014-06-02 05:16:10 +09:00]] 版) <http://tools.ietf.org/html/rfc6797#section-4>
]REFS]
* 分類
[FIG(list)[
- [29] [[テキスト・ラベル]]
-- [17] [[ASCIIラベル]]
--- [16] [[LDHラベル]]
---- [26] [[NR-LDHラベル]]
---- [23] [[R-LDHラベル]]
----- [22] [[XNラベル]]
------ [24] [[Aラベル]]
------ [25] [[偽Aラベル]]
------ [25] [[未検証Aラベル]]
---- [27] [[ACEラベル]]
--- [18] [[非LDHラベル]]
-- [19] [[Uラベル]]
-- [32] [[未検証Uラベル]]
-- [31] [[IDNAラベル]]
-- [28] [[国際化ラベル]]
- [20] [[バイナリー列ラベル]]
- [21] [[ビット列ラベル]]
- [30] [[非ASCIIラベル]]
]FIG]
* UTS #46 における制約
[35] [[UTS #46]] は[[ラベル]]に対していくつかの制約を課しています。
;; [40] この対象は[[テキスト・ラベル]]に相当するものであり、[[バイナリー列ラベル]]や[[ビット列ラベル]]は考慮されていません。
** 共通の制約
[73] [[ラベル]][VAR[ラベル]]が満たさなければならない[DFN[[RUBYB[[[妥当性基準]]]@en[validity criteria]]]]とは、
[VAR[処理オプション]]と [VAR[[[UseSTD3ASCIIRules]]]]、
[VAR[[[CheckHyphens]]]]、
[VAR[[[CheckBidi]]]]、
[VAR[[[CheckJoiners]]]] に依存した次のようなものです [SRC[>>37]]。
[FIG(list)[
- [38] [VAR[ラベル]]が [[NFC]] である
- [74] [VAR[ラベル]]の第1[[符号位置]]について、
-- [83] [VAR[[[CheckHyphens]]]] が[[真]]の場合、
--- [75] [CODE(char)[U+002D]] [CODE(charname)@en[HYPHEN-MINUS]] ではない
-- [76] [[結合マーク]]ではない
- [39] [VAR[ラベル]]の第3、第4[[符号位置]]について、
-- [82] [VAR[[[CheckHyphens]]]] が[[真]]の場合、
--- [77] [CODE(char)[U+002D]] [CODE(charname)@en[HYPHEN-MINUS]] ではない
- [41] [VAR[ラベル]]の最後の[[符号位置]]について、
-- [78] [VAR[[[CheckHyphens]]]] が[[真]]の場合、
--- [81] [CODE(char)[U+002D]] [CODE(charname)@en[HYPHEN-MINUS]] ではない
- [42] [VAR[ラベル]]の任意の[[符号位置]]について、
-- [43] [CODE(char)[U+002E]] [CODE(charname)@en[FULL STOP]] ではない
-- [79] [[IDNA写像表]] ([VAR[[[UseSTD3ASCIIRules]]]]) の[[状態値]]が[[妥当]]または[[偏差]]で''ある''
-- [44] [VAR[処理オプション]]が[[移行的処理]]の場合、
--- [80] [[IDNA写像表]] ([VAR[[[UseSTD3ASCIIRules]]]]) の[[状態値]]が[[偏差]]ではない
- [84] [VAR[[[CheckJoiners]]]] が[[真]]の場合、
-- [85] [[IDNA2008]] [[ContextJ rules]] を満たす
- [86] [VAR[[[CheckBidi]]]] が[[真]]の場合、
-- [87] [[IDNA2008]] [[bidi規則]]を満たす
]FIG]
[47] ここで、[[状態値]]は [VAR[[[UseSTD3ASCIIRules]]]] によって変化します。
[53] [CODE[-]] に関する検査は、 [[Web互換]]でない疑いがあります。
[[Unicode IDNA互換性処理]]を参照。
[72] この[[妥当性基準]]は、[[Unicode IDNA互換性処理]]から参照されています。
** UseSTD3ASCIIRules
[48] [[UseSTD3ASCIIRules]] が[[偽]]であれば [[ASCII文字]]の[[妥当性]]の検証方法は[[実装依存]]となります。例えば [[LDH]] の他に [CODE(char)[[[_]]]] を認めることができます。 [SRC[>>37]]
[49] これは単に[[ASCII文字]]を認めるだけにとどまらず、[[写像]]や[[正規化]]の結果そのような
[[ASCII文字]]に変換される[[非ASCII文字]]を認めることにつながります。
[50] 例えば [CODE(charname)@en[[[LOW LINE]]]] の使用を認めると、
[CODE(charname)@en[[[FULLWIDTH LOW LINE]]]] も認めることとなります。
[51] またいくつかの[[非ASCII文字]]は[[正準分解]]が [[UseSTD3ASCIIRules]]
が[[真]]だと認められない[[ASCII文字]]となるため、 [[UseSTD3ASCIIRules]]
が[[真]]の時は使用禁止となりますが、[[偽]]の時は使用禁止になりません。
そのような[[文字]]は [[disallowed_STD3_valid]] に分類されています。
[[disallowed_STD3_valid]] の[[文字]]は、 [[UseSTD3ASCIIRules]] が[[偽]]であっても、
対応する[[ASCII文字]]が認められないときにはやはり禁止しなければなりません。 [SRC[>>37]]
** 追加の制約
[52] [[IDNA2008]] の[[bidi規則]]・[[ContextJ規則]]にも従うべきです [SRC[>>37]]。
[57] 実装は更に追加で制約を加えたり、警告を出したりしても構いません。
例えば、次のような制約が考えられます [SRC[>>56]]。
[FIG(list)[
- [58] 特定の[[用字系]]の組み合わせの[[ラベル]]を認めない ([[Safari]]) [SRC[>>56]]
- [59] [[利用者]]が指定した[[言語]]以外の[[文字]]の[[ラベル]]を認めない ([[IE]]) [SRC[>>56]]
- [60] 特定の[[混乱可能文字]]の[[ラベル]]を認めない ([[Firefox]]) [SRC[>>56]]
- [61] [[Google Safe Browsing API]] で検出された[[ラベル]]を認めない [SRC[>>56]]
- [62] [[IDNA2008]] の妥当性の要件 ([[Uラベル]]参照) を満たさない[[ラベル]]を認めない [SRC[>>56]]
- [63] [[ToASCII]] すると[[ラベル]]の妥当性の要件を満たさない [[ToUnicode]] によって作られた[[ラベル]]を認めない [SRC[>>56]]
- [54] [[混乱可能文字]]の処理については [[UTR #36]] を参照することを強く推奨します。 [SRC[>>37]]
-- [CSECTION@en[[[Restriction Level 3, Moderately Restrictive]]]] [SRC[>>56]]
- [55] [[識別子]]に使うべきではない[[文字]]の処理については [[UTS #39]] を参照することを強く推奨します。 [SRC[>>37]]
-- [64] [CSECTION@en[[[Table 4, Candidate Characters for Exclusion]]]] [SRC[>>56]]
-- [65] [CSECTION@en[[[Table 5, Recommended Scripts: Limited Use]]] [SRC[>>56]]
]FIG]
* メモ
[3]
[PRE(ABNF)[
domain = subdomain / " "
subdomain = label *("." label)
label = letter [ [ldh-str] let-dig ]
ldh-str = 1*let-gid-hyp
let-dig-hyp = let-dig / "-"
let-dig = letter / digit
letter = <"A" / ... / "Z">
digit = <"0" / ... / "9">
]PRE]
[4]
[PRE(ABNF)[
domain = subdomain / " "
subdomain = label *("." label)
label = ALPHA [*(ALPHA / DIGIT / "-") (ALPHA / DIGIT)]
ldh-str = 1*(ALPHA / DIGIT / "-")
]PRE]
[REFS[
- [2] [CITE@en[RFC 2818 - HTTP Over TLS]] ([TIME[2014-12-15 14:10:09 +09:00]] 版) <http://tools.ietf.org/html/rfc2818#section-3>
]REFS]
[6] >>2 は[DFN[[RUBYB[ドメイン名部品]@en[domain name component]]]]と呼んでいます。
[7] [CITE@en[RFC 2181 - Clarifications to the DNS Specification]]
([TIME[2015-04-27 15:13:44 +09:00]] 版)
<https://tools.ietf.org/html/rfc2181#section-11>
[8] [CITE@en[1136616 – mozilla::pkix name matching disallows some characters in reference IDs that are valid in DNS labels]]
( ([TIME[2016-05-08 22:58:44 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=1136616>
[9] [CITE@en[Issue 463410 - chromium - Inconsistent hostname handling in Chrome - Monorail]]
( ([TIME[2016-05-08 22:59:19 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=463410>
[10] [CITE@en[Issue 496472 - chromium - Cleanup & move IsCanonicalizedHostCompliant from net_util into QUIC - Monorail]]
( ([TIME[2016-05-08 23:06:06 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=496472>
[FIG(quote)[
[FIGCAPTION[
[70] [CITE[SpringのCORS機能がRFC 3986なホスト名に対応してなかった・・・ - Qiita]]
( ([TIME[2016-05-26 21:52:26 +09:00]]))
<http://qiita.com/kazuki43zoo/items/43abfb72ddf0f1096fa7>
]FIGCAPTION]
> リクエストにOriginヘッダーがあるとCORS(Cross-Origin Resource Sharing)関連の処理が動き、その処理の中でリクエストURLをjava.net.URIに変換するロジックがあります。URIクラスはRFC 3986に対応していないため、例えばリクエストURLが「 http://spring_app/」だとホスト名がnullになり、Spring側の処理の中でNPEが発生しています。
]FIG]
[FIG(quote)[
[FIGCAPTION[
[71] [CITE@en[RFC 7719 - DNS Terminology]]
( ([TIME[2016-06-05 17:09:11 +09:00]]))
<https://tools.ietf.org/html/rfc7719#section-2>
]FIGCAPTION]
>
> Label: The identifier of an individual node in the sequence of nodes
> identified by a fully qualified domain name.
]FIG]
[45] [CITE@en[Consider ignoring UTS46 validity criteria V2 · Issue #160 · servo/rust-url]]
([TIME[2016-08-28 00:04:23 +09:00]])
<https://github.com/servo/rust-url/issues/160>
[46] [CITE@en[IDNA · Issue #53 · whatwg/url]]
([TIME[2016-08-28 00:04:55 +09:00]])
<https://github.com/whatwg/url/issues/53>