/
502.txt
221 lines (167 loc) · 9.06 KB
/
502.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
* スクリプト・マクロ (HTML)
[1] [[HTML]]の[DFN[[RUBYB@en[スクリプト・マクロ][script macro]]]]は、
[[属性値]]の中に[[JavaScript]]の[[式]]を埋め込むことができる機能です。
[4] この機能を導入した[[Netscape]]は、
[DFN[JavaScript[RUBY[実体][じったい]@en[entity]]]]あるいは[DFN[[RUBY[動的実体][どうてきじったい]@en[dynamic entity]]]]と呼んでいました。
[Q[予約]]機能として附属書 (参考) にこれを取り込んだ[[HTML 4]]では、
[DFN[[RUBYB@en[スクリプト・マクロ][script macro]]]]としています。
[2] 仕様書:
- [CITE[Welcome to Netscape Navigator Beta Release 5]]
<http://wp.netscape.com/eng/mozilla/3.0/relnotes/windows-3.0b5.html#Layout>
- [[HTML 4]]
-- [CSECTION@en[B.7.1 Reserved syntax for future script macros]]
<IW:HTML4:"appendix/notes.html#idx-script-1">
- [[XSLT 1]]
-- [CSECTION@en[16.2 HTML Output Method]]
<IW:XSLT1:"#section-HTML-Output-Method">
[[#comment]]
** 構文
[5]
[PRE[
attribute = "... &{ [VAR[macro body]] }; ... "
]PRE]
のように、[[属性]]の[[値]]の中で[CODE(HTML)[&{]]からはじまり、
[CODE(HTML)[};]]で終わる部分が[[スクリプト・マクロ]]として解釈されます。
囲まれた部分を[[HTML 4]]は[DFN[[RUBYB[マクロ本体]@en[macro body]]]]と呼んでいます。
[6]
[[Netscape]]は、[[文字実体参照]]が[[文字]]に展開されるように、
[[JavaScript実体]]は[[JavaScript]][[式]]の[[評価]]結果に展開されるとしています。
1文字目の[CODE(HTML)@en[&]]を[CODE(HTML)@en[&[[amp]];]]に置き返ると、
[[JavaScript実体]]では''なく''、[[文字列]]とみなされます。
@@ [[SGML]]のような[[属性値]]と[[属性値指定]]の区別
([[引用符]]の有無による差異) はない?
[7]
一方で[[HTML 4]]は[Q@en[Current Practice]]をこう説明しています。
= まず、[[SGML]][[構文解析器]]が[[SGML]][[実体参照]]を[[展開]]します。
= 次に、[[スクリプト・マクロ]]の[[マクロ本体]]を[[スクリプト機関]]が1つ以上の[[文]]として[[評価]]します。
[[スクリプト言語]]は[[内在事象属性]]と同じです。
= 得られた[[文字列]]を以後の処理に使います。
[8]
無理に[[SGML]]として処理しようとしている点、
[[マクロ本体]]を[[式]]ではなく[[文]]としている点、
[[マクロ本体]]の言語を[CODE(HTTP)@en[[[Content-Script-Type]]]]によって変更可能にしている点が[[Netscape]]の説明と食い違っており、
いったいどこの[Q@en[Current Practice]]なのかが気になるところです。
特に[[SGML]]としての処理の部分は、[[文字実体参照]]の扱いが[[Netscape]]の実装と大きく異なっており、
[[HTML 4]]の通りに処理されるなら[[スクリプト・マクロ]]と同じように見える文字列を[[HTML]]として記述することができなくなってしまいます。
;; [CODE(example JS)@en[&{'&{}'+';'};]]という方法がありますが、
[[スクリプト]]が無効だと機能しません。
[10] [[HTML 4]]は、[[スクリプト・マクロ]]が有効なのを[CODE(SGML)@en[[[CDATA]]]][[属性]]のみとしています。
一方[[Netscape]]の説明と実装にはそのような制限は見当たりません。
[11]
この[[スクリプト・マクロ]]が[[評価]]される時機について、
[[Netscape]]は[Q[[[属性値]]が計算される時]]としています。
[[HTML 4]]は更に明確に、[Q[[[文書]]が読込まれる時で、[[再描画]]の時には''しない'']]としています。
[[#comment]]
** XSLTとの関係
[18] [[XSLT 1.0]]および[[XSLT 1.1]]の[[HTML出力方式]]では、
[[属性]]の[[値]]において[CODE(HTML)[&{]]は[[逃避]]するべきではないとされています。
;; [[HTML 4]]を見よとは書かれていますが、
閉じ[CODE(HTML)[};]]との対応や[CODE(SGML)@en[[[CDATA]]]][[属性]]か否かのチェックをせよという規定は''ありません''。
;; [[べき]] ([[should]]) の定義はありません。
[20]
@@XPath 2.0/XQuery 1.0/XSLT 2.0: 現在の案では、
[[XSLT 1]]と同じ、ただし[[MUST NOT]]
* 保安性
[28] 現在の[[Webアプリケーション]]などでは、現存する
[[Webブラウザ]]で依然[[スクリプト・マクロ]]を実装しているものは無いので、
[[ユーザー入力]]などに[[スクリプト・マクロ]]として解釈し得る文字列が含まれていてもそのまま出力することが多々あります。
古い[[利用者エージェント]]でそのような [[Webアプリケーション]]を利用すると
[[XSS]] の類の攻撃が成功することもあります。
* 関連
[21] '''SGMLとの関係''':
[[HTML 4]]では[[SGML]][[応用]]であるために[[SGML]]としての[[属性]]の[[値]]を更に処理するとしています。
[[Netscape]]が説明・実装している[[動的実体]]は[[SGML]]に相当するものがなく苦肉の策なのでしょうが、
実装と乖離したものを標準化しようとしても意味がありません。
[24] '''DOMとの関係''':
[[DOM]]との関係は明らかではありません。
[[Netscape]]の[[DOM水準0]]では、評価後の値が使われているものと思われます。
(ただし、[[Classic Mozilla]]には[[文書木]]そのものの[[DOM]]表現が存在していません。)
@@ 要確認
[25]
[[W3C]]の[[DOM]]仕様には言及がありませんが、
[[文書]]の読込み時に[[評価]]される (>>11) ことから、
[[DOM]]内には[[評価]]結果の[[文字列]]が[[属性]]の[[値]]として残ると思われます。
[27] '''XHTMLとの関係''':
[[HTML 4]]と[[XHTML 1]]の関係は全体的に不明瞭ですが、
[[スクリプト・マクロ]]が[[XHTML 1]]では使えないとする積極的な根拠はありません。
[[#comment]]
** 歴史
[22] この機能は[[Netscape Navigator]] 3.0β5 で実装されたようです。
[23] [[HTML 4]]では標準の機能としては取り込まれませんでしたが、
附属書B (参考) で[Q[[[予約]]]]の機能として紹介されています。
[[HTML 4]]の[[DTD]]では[[WinIE]]の拡張の[CODE(HTMLa)@en[[[data[VAR[*]]]]]][[属性]]群が[Q[[[予約]]]]として取り込まれているので、
[[Microsoft]]と[[Netscape]]の政治的取引の結果かもしれません。
[26]
[[Classic Mozilla]]に代わる[[Gecko]]では[[スクリプト・マクロ]]は実装されていません。
他の[[Webブラウザ]]で実装したものも存在しないようです。
[[HTML 5]]にも[[スクリプト・マクロ]]が入ることはないでしょう。
ゾンビが1匹生まれようとしている (>>20) のを除いては、
このまま忘れ去られていくのでしょう。
[[#comment]]
** 例
[9] ([[JavaScript]]) [SRC@en[Netscape]]
[PRE(HTML obsoleted example code)[
"&{10 * 10};%"
]PRE]
[[評価]]されて[CODE(HTML)[100%]]になります。
[12] '''背景色を無作為に選ぶ''' ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
<BODY bgcolor='&{randomrgb};'>
]PRE]
既に[[変数]][VAR(JS)[randomrgb]]に値が入れられているものと思われます。
[13] '''背景色を時刻で変化''' ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
<BODY bgcolor='&{if(Date.getHours > 18)...};'>
]PRE]
[14] '''クライアント側画像写像の範囲とリンク先''' ([[JavaScript]])
[SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
<MAP NAME=foo>
<AREA shape="rect" coords="&{myrect(imageuri)};" href="&{myuri};" alt="">
</MAP>
]PRE]
[15] '''環境依存の画像幅''' ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
<IMG src="bar.gif" width='&{document.banner.width/2};' height='50%' alt="banner">
]PRE]
[16] ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
<SCRIPT type="text/javascript">
function manufacturer(widget) {
...
}
function location(manufacturer) {
...
}
function logo(manufacturer) {
...
}
</SCRIPT>
<A href='&{location(manufacturer("widget"))};'>widget</A>
<IMG src='&{logo(manufacturer("widget"))};' alt="logo">
]PRE]
[17] '''文字実体参照を含む例''' ([[JavaScript]]) [SRC@en[HTML 4]]
[PRE(HTML deprecated obsoleted example code)[
<IMG src="&{logo(manufacturer("widget"))};" alt="logo">
]PRE]
[19] '''XSLTの変換例''' [SRC@en[XSLT 1.0, 1.1]]
[[XSLT]][[スタイル・シート]]で
[PRE(XSLT example code)[
<BODY bgcolor='&{{randomrbg}};'>
]PRE]
とあるものを[[HTML出力方式]]で[[直列化]]すると、
[PRE(HTML example code)[
<BODY bgcolor='&{randomrbg};'>
]PRE]
になります。
[[#comment]]
** メモ
@@ テストが必要:
- 引用符 ", ', なし
- &{ };
- マクロ本体中の文字参照
- Content-Script-Type
- 文; 文;
- 非 CDATA 属性
[[#comment]]
* メモ