@@ -785,94 +785,6 @@ interface <dfn data-x="">Example</dfn> {
785
785
786
786
787
787
788
- <h3 id="fingerprint">Privacy concerns</h3>
789
-
790
- <!-- NON-NORMATIVE SECTION -->
791
-
792
- <p>Some features of HTML trade user convenience for a measure of user privacy.</p>
793
-
794
- <p>In general, due to the Internet's architecture, a user can be distinguished from another by the
795
- user's IP address. IP addresses do not perfectly match to a user; as a user moves from device to
796
- device, or from network to network, their IP address will change; similarly, NAT routing, proxy
797
- servers, and shared computers enable packets that appear to all come from a single IP address to
798
- actually map to multiple users. Technologies such as onion routing can be used to further
799
- anonymize requests so that requests from a single user at one node on the Internet appear to come
800
- from many disparate parts of the network.</p>
801
-
802
- <p>However, the IP address used for a user's requests is not the only mechanism by which a user's
803
- requests could be related to each other. Cookies, for example, are designed specifically to enable
804
- this, and are the basis of most of the Web's session features that enable you to log into a site
805
- with which you have an account.</p>
806
-
807
- <p>There are other mechanisms that are more subtle. Certain characteristics of a user's system can
808
- be used to distinguish groups of users from each other; by collecting enough such information, an
809
- individual user's browser's "digital fingerprint" can be computed, which can be as good as, if not
810
- better than, an IP address in ascertaining which requests are from the same user.</p>
811
-
812
- <p>Grouping requests in this manner, especially across multiple sites, can be used for both benign
813
- (and even arguably positive) purposes, as well as for malevolent purposes. An example of a
814
- reasonably benign purpose would be determining whether a particular person seems to prefer sites
815
- with dog illustrations as opposed to sites with cat illustrations (based on how often they visit
816
- the sites in question) and then automatically using the preferred illustrations on subsequent
817
- visits to participating sites. Malevolent purposes, however, could include governments combining
818
- information such as the person's home address (determined from the addresses they use when getting
819
- driving directions on one site) with their apparent political affiliations (determined by
820
- examining the forum sites that they participate in) to determine whether the person should be
821
- prevented from voting in an election.</p>
822
-
823
- <p>Since the malevolent purposes can be remarkably evil, user agent implementers are encouraged to
824
- consider how to provide their users with tools to minimize leaking information that could be used
825
- to fingerprint a user.</p>
826
-
827
- <p>Unfortunately, as the first paragraph in this section implies, sometimes there is great benefit
828
- to be derived from exposing the very information that can also be used for fingerprinting
829
- purposes, so it's not as easy as simply blocking all possible leaks. For instance, the ability to
830
- log into a site to post under a specific identity requires that the user's requests be
831
- identifiable as all being from the same user, more or less by definition. More subtly, though,
832
- information such as how wide text is, which is necessary for many effects that involve drawing
833
- text onto a canvas (e.g. any effect that involves drawing a border around the text) also leaks
834
- information that can be used to group a user's requests. (In this case, by potentially exposing,
835
- via a brute force search, which fonts a user has installed, information which can vary
836
- considerably from user to user.)</p>
837
-
838
- <p w-nodev>Features in this specification which can be <dfn data-x="fingerprinting vector">used to
839
- fingerprint the user</dfn> are marked as this paragraph is.
840
- <!--INSERT FINGERPRINT-->
841
- </p>
842
-
843
- <p>Other features in the platform can be used for the same purpose, though, including, though not
844
- limited to:</p>
845
-
846
- <ul>
847
-
848
- <li>The exact list of which features a user agents supports.</li>
849
-
850
- <li>The maximum allowed stack depth for recursion in script.</li>
851
-
852
- <li>Features that describe the user's environment, like Media Queries and the <code>Screen</code>
853
- object. <ref spec=MQ> <ref spec=CSSOMVIEW></li>
854
-
855
- <li>The user's time zone.</li>
856
-
857
- </ul>
858
-
859
-
860
- <h4 id="fingerprint-postMessage">Cross-site communication</h4>
861
-
862
- <p>The <code data-x="dom-window-postMessage">postMessage()</code> API provides a mechanism by
863
- which two sites can communicate directly. At first glance, this might appear to open a new way by
864
- which the problems described above can occur. However, in practice, multiple mechanisms exist by
865
- which two sites can communicate that predate this API: a site embedding another can send data via
866
- an <code>iframe</code> element's dimensions; a site can use a cross-site image request with a
867
- unique identifier known to the server to initiate a server-side data exchange; or indeed the
868
- fingerprinting techniques described above can be used by two sites to uniquely identify a visitor
869
- such that information can then be exchanged on the server side.</p>
870
-
871
- <p>Fundamentally, users that do not trust a site to treat their information with respect have to
872
- avoid visiting that site at all.</p>
873
-
874
-
875
-
876
788
877
789
<h3>A quick introduction to HTML</h3>
878
790
@@ -2174,7 +2086,7 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
2174
2086
fingerprinting vector that increases the chances of users being uniquely identified, user agents
2175
2087
are encouraged to support the exact same set of <span data-x="plugin">plugins</span> for each
2176
2088
user.
2177
- <!--INSERT FINGERPRINT -->
2089
+ <!--INSERT TRACKING -->
2178
2090
</p>
2179
2091
2180
2092
</div>
@@ -2436,7 +2348,7 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
2436
2348
<p id="hardwareLimitations">User agents may impose implementation-specific limits on otherwise
2437
2349
unconstrained inputs, e.g. to prevent denial of service attacks, to guard against running out of
2438
2350
memory, or to work around platform-specific limitations.
2439
- <!--INSERT FINGERPRINT -->
2351
+ <!--INSERT TRACKING -->
2440
2352
</p>
2441
2353
2442
2354
<p>For compatibility with existing content and prior specifications, this specification describes
@@ -2474,6 +2386,10 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
2474
2386
<li>The general iteration terms <dfn data-x-href="https://infra.spec.whatwg.org/#iteration-while">while</dfn>,
2475
2387
<dfn data-x-href="https://infra.spec.whatwg.org/#iteration-continue">continue</dfn>, and
2476
2388
<dfn data-x-href="https://infra.spec.whatwg.org/#iteration-break">break</dfn>.</li>
2389
+ <li id="fingerprint"><span id="fingerprinting-vector"></span><dfn
2390
+ data-x-href="https://infra.spec.whatwg.org/#tracking-vector">tracking vector</dfn>
2391
+ <!-- INSERT TRACKING -->
2392
+ </li>
2477
2393
<li><dfn data-x-href="https://infra.spec.whatwg.org/#code-point">code point</dfn> and its synonym
2478
2394
<dfn data-x-href="https://infra.spec.whatwg.org/#code-point">character</dfn></li>
2479
2395
<li><dfn data-x-href="https://infra.spec.whatwg.org/#surrogate">surrogate</dfn></li>
@@ -9469,7 +9385,9 @@ partial interface <dfn id="document" data-lt="">Document</dfn> {
9469
9385
origin</span>, the user agent must throw a <span>"<code>SecurityError</code>"</span>
9470
9386
<code>DOMException</code>. Otherwise, the user agent must return the <span>cookie-string</span>
9471
9387
for the document's <span data-x="concept-document-url">URL</span> for a "non-HTTP" API, decoded
9472
- using <span>UTF-8 decode without BOM</span>. <ref spec=COOKIES><!--INSERT FINGERPRINT--></p>
9388
+ using <span>UTF-8 decode without BOM</span>. <ref spec=COOKIES>
9389
+ <!--INSERT TRACKING-->
9390
+ </p>
9473
9391
9474
9392
<p>On setting, if the document is a <span>cookie-averse <code>Document</code> object</span>, then
9475
9393
the user agent must do nothing. Otherwise, if the <code>Document</code>'s <span>origin</span> is
@@ -34757,7 +34675,7 @@ interface <dfn>MediaError</dfn> {
34757
34675
<span>media resource</span>. In the even rarer case of a <span>media resource</span> with no
34758
34676
explicit timings of any kind, not even frame durations, the user agent must itself determine the
34759
34677
time for each frame in a user-agent-defined manner.
34760
- <!--INSERT FINGERPRINT -->
34678
+ <!--INSERT TRACKING -->
34761
34679
</p>
34762
34680
34763
34681
<p class="note">An example of a file format with no explicit timeline but with explicit frame
@@ -48669,7 +48587,7 @@ ldh-str = < as defined in <a href="https://tools.ietf.org/html/rfc1034#
48669
48587
implementation-defined string that means "Submit" or some such.</span> The element is a <span
48670
48588
data-x="concept-button">button</span>, specifically a <span data-x="concept-submit-button">submit
48671
48589
button</span>.
48672
- <!--INSERT FINGERPRINT -->
48590
+ <!--INSERT TRACKING -->
48673
48591
</p>
48674
48592
48675
48593
<p class="note">Since the default label is implementation-defined, and the width of the button
@@ -49042,7 +48960,7 @@ ldh-str = < as defined in <a href="https://tools.ietf.org/html/rfc1034#
49042
48960
attribute, the button's label must be the value of that attribute; otherwise, it must be an
49043
48961
implementation-defined string that means "Reset" or some such.</span> The element is a <span
49044
48962
data-x="concept-button">button</span>.
49045
- <!--INSERT FINGERPRINT -->
48963
+ <!--INSERT TRACKING -->
49046
48964
</p>
49047
48965
49048
48966
<p class="note">Since the default label is implementation-defined, and the width of the button
@@ -64345,7 +64263,7 @@ try {
64345
64263
the <code>CanvasText</code> interface, and then using the returned <span>inline box</span> must
64346
64264
return a new <code>TextMetrics</code> object with members behaving as described in the following
64347
64265
list: <ref spec=CSS>
64348
- <!--INSERT FINGERPRINT -->
64266
+ <!--INSERT TRACKING -->
64349
64267
</p>
64350
64268
64351
64269
</div>
@@ -75869,7 +75787,7 @@ addShortcutKeyLabel(document.getElementById('c'));</code></pre>
75869
75787
key that corresponds to the value given in the attribute, can be used as the access key, then
75870
75788
the user agent may assign that combination of keys as the element's <span>assigned access
75871
75789
key</span> and return.
75872
- <!--INSERT FINGERPRINT -->
75790
+ <!--INSERT TRACKING -->
75873
75791
</p></li>
75874
75792
75875
75793
</ol>
@@ -88884,7 +88802,7 @@ interface <dfn>ApplicationCache</dfn> : <span>EventTarget</span> {
88884
88802
<li>The user has not disabled scripting for this <span>browsing context</span> at this time.
88885
88803
(User agents may provide users with the option to disable scripting globally, or in a
88886
88804
finer-grained manner, e.g. on a per-origin basis.)
88887
- <!--INSERT FINGERPRINT -->
88805
+ <!--INSERT TRACKING -->
88888
88806
</li>
88889
88807
88890
88808
<li id="sandboxScriptBlocked">The <span>browsing context</span>'s <span>active document</span>'s
@@ -91671,7 +91589,7 @@ import "https://example.com/foo/../module2.mjs";</code></pre>
91671
91589
91672
91590
<li><p>Let <var>message</var> be a user-agent-defined string describing the error in a
91673
91591
helpful manner.
91674
- <!--INSERT FINGERPRINT -->
91592
+ <!--INSERT TRACKING -->
91675
91593
</p></li>
91676
91594
91677
91595
<li><p>Let <var>errorValue</var> be the value that represents the error: in the case of an
@@ -95585,7 +95503,7 @@ interface <dfn>Navigator</dfn> {
95585
95503
profile the user. In fact, if enough such information is available, a user can actually be
95586
95504
uniquely identified. For this reason, user agent implementers are strongly urged to include as
95587
95505
little information in this API as possible.
95588
- <!--INSERT FINGERPRINT -->
95506
+ <!--INSERT TRACKING -->
95589
95507
</p>
95590
95508
95591
95509
</div>
@@ -95666,7 +95584,7 @@ interface <dfn>Navigator</dfn> {
95666
95584
95667
95585
<li>Any information in this API that varies from user to user can be used to profile or identify
95668
95586
the user.
95669
- <!--INSERT FINGERPRINT -->
95587
+ <!--INSERT TRACKING -->
95670
95588
</li>
95671
95589
95672
95590
<li>If the user is not using a service that obfuscates the user's point of origin (e.g. the Tor
@@ -95683,7 +95601,7 @@ interface <dfn>Navigator</dfn> {
95683
95601
<p>To avoid introducing any more fingerprinting vectors, user agents should use the same list for
95684
95602
the APIs defined in this function as for the HTTP `<code
95685
95603
data-x="http-accept-language">Accept-Language</code>` header.
95686
- <!--INSERT FINGERPRINT -->
95604
+ <!--INSERT TRACKING -->
95687
95605
</p>
95688
95606
95689
95607
</div>
@@ -96216,13 +96134,13 @@ interface <dfn>MimeType</dfn> {
96216
96134
<p>The <span>supported property indices</span> of a <code>PluginArray</code> object are the
96217
96135
numbers from zero to the number of non-<span data-x="hidden plugin">hidden</span> <span
96218
96136
data-x="plugin">plugins</span> represented by the object, if any.
96219
- <!--INSERT FINGERPRINT -->
96137
+ <!--INSERT TRACKING -->
96220
96138
</p>
96221
96139
96222
96140
<p>The <dfn><code data-x="dom-PluginArray-length">length</code></dfn> attribute must return the
96223
96141
number of non-<span data-x="hidden plugin">hidden</span> <span data-x="plugin">plugins</span>
96224
96142
represented by the object.
96225
- <!--INSERT FINGERPRINT -->
96143
+ <!--INSERT TRACKING -->
96226
96144
</p>
96227
96145
96228
96146
<p>The <dfn><code data-x="dom-PluginArray-item">item()</code></dfn> method of a
@@ -96243,14 +96161,14 @@ interface <dfn>MimeType</dfn> {
96243
96161
96244
96162
</ol>
96245
96163
96246
- <p class="note">It is important <span class="no-backref" data-x="fingerprinting vector">for
96247
- privacy</span> that the order of plugins not leak additional information, e.g. the order in which
96164
+ <p class="note">It is important <span class="no-backref" data-x="tracking vector">for
96165
+ privacy</span> that the order of plugins not leak additional information, e.g., the order in which
96248
96166
plugins were installed.</p>
96249
96167
96250
96168
<p>The <span>supported property names</span> of a <code>PluginArray</code> object are the values
96251
96169
of the <code data-x="dom-Plugin-name">name</code> attributes of all the <code
96252
96170
data-x="dom-Plugin">Plugin</code> objects represented by the <code>PluginArray</code> object.
96253
- <!--INSERT FINGERPRINT -->
96171
+ <!--INSERT TRACKING -->
96254
96172
</p>
96255
96173
96256
96174
<p>The <dfn><code data-x="dom-PluginArray-namedItem">namedItem()</code></dfn> method of a
@@ -96295,14 +96213,14 @@ interface <dfn>MimeType</dfn> {
96295
96213
supported</span> by non-<span data-x="hidden plugin">hidden</span> <span
96296
96214
data-x="plugin">plugins</span> represented by the corresponding <code>PluginArray</code> object, if
96297
96215
any.
96298
- <!--INSERT FINGERPRINT -->
96216
+ <!--INSERT TRACKING -->
96299
96217
</p>
96300
96218
96301
96219
<p>The <dfn><code data-x="dom-MimeTypeArray-length">length</code></dfn> attribute must return the
96302
96220
number of <span data-x="MIME type">MIME types</span> <span>explicitly supported</span> by non-<span
96303
96221
data-x="hidden plugin">hidden</span> <span data-x="plugin">plugins</span> represented by the
96304
96222
corresponding <code>PluginArray</code> object, if any.
96305
- <!--INSERT FINGERPRINT -->
96223
+ <!--INSERT TRACKING -->
96306
96224
</p>
96307
96225
96308
96226
<p>The <dfn><code data-x="dom-MimeTypeArray-item">item()</code></dfn> method of a
@@ -96324,14 +96242,14 @@ interface <dfn>MimeType</dfn> {
96324
96242
96325
96243
</ol>
96326
96244
96327
- <p class="note">It is important <span class="no-backref" data-x="fingerprinting vector">for
96328
- privacy</span> that the order of MIME types not leak additional information, e.g. the order in
96245
+ <p class="note">It is important <span class="no-backref" data-x="tracking vector">for
96246
+ privacy</span> that the order of MIME types not leak additional information, e.g., the order in
96329
96247
which plugins were installed.</p>
96330
96248
96331
96249
<p>The <span>supported property names</span> of a <code>MimeTypeArray</code> object are the values
96332
96250
of the <code data-x="dom-MimeType-type">type</code> attributes of all the <code>MimeType</code>
96333
96251
objects represented by the <code>MimeTypeArray</code> object.
96334
- <!--INSERT FINGERPRINT -->
96252
+ <!--INSERT TRACKING -->
96335
96253
</p>
96336
96254
96337
96255
<p>The <dfn><code data-x="dom-MimeTypeArray-namedItem">namedItem()</code></dfn> method of a
@@ -96360,12 +96278,12 @@ interface <dfn>MimeType</dfn> {
96360
96278
96361
96279
<p>The <span>supported property indices</span> of a <code data-x="dom-Plugin">Plugin</code> object
96362
96280
are the numbers from zero to the number of <span>reported MIME types</span>.
96363
- <!--INSERT FINGERPRINT -->
96281
+ <!--INSERT TRACKING -->
96364
96282
</p>
96365
96283
96366
96284
<p>The <dfn><code data-x="dom-Plugin-length">length</code></dfn> attribute must return the number
96367
96285
of <span>reported MIME types</span>.
96368
- <!--INSERT FINGERPRINT -->
96286
+ <!--INSERT TRACKING -->
96369
96287
</p>
96370
96288
96371
96289
<p>The <dfn><code data-x="dom-Plugin-item">item()</code></dfn> method of a <code
@@ -96385,14 +96303,14 @@ interface <dfn>MimeType</dfn> {
96385
96303
96386
96304
</ol>
96387
96305
96388
- <p class="note">It is important <span class="no-backref" data-x="fingerprinting vector">for
96389
- privacy</span> that the order of MIME types not leak additional information, e.g. the order in
96306
+ <p class="note">It is important <span class="no-backref" data-x="tracking vector">for
96307
+ privacy</span> that the order of MIME types not leak additional information, e.g., the order in
96390
96308
which plugins were installed.</p>
96391
96309
96392
96310
<p>The <span>supported property names</span> of a <code data-x="dom-Plugin">Plugin</code> object
96393
96311
are the values of the <code data-x="dom-MimeType-type">type</code> attributes of the
96394
96312
<code>MimeType</code> objects representing the <span>reported MIME types</span>.
96395
- <!--INSERT FINGERPRINT -->
96313
+ <!--INSERT TRACKING -->
96396
96314
</p>
96397
96315
96398
96316
<p>The <dfn><code data-x="dom-Plugin-namedItem">namedItem()</code></dfn> method of a <code
@@ -96418,7 +96336,7 @@ interface <dfn>MimeType</dfn> {
96418
96336
data-x="dom-Plugin-description">description</code> attribute just return the same value as the
96419
96337
<code data-x="dom-Plugin-name">name</code> attribute, and that the <code
96420
96338
data-x="dom-Plugin-filename">filename</code> attribute return the empty string.
96421
- <!--INSERT FINGERPRINT -->
96339
+ <!--INSERT TRACKING -->
96422
96340
</p>
96423
96341
96424
96342
<hr>
@@ -96448,7 +96366,7 @@ interface <dfn>MimeType</dfn> {
96448
96366
data-x="dom-MimeType-description">description</code> attribute just return the same value as the
96449
96367
<code data-x="dom-MimeType-type">type</code> attribute, and that the <code
96450
96368
data-x="dom-MimeType-suffixes">suffixes</code> attribute return the empty string.
96451
- <!--INSERT FINGERPRINT -->
96369
+ <!--INSERT TRACKING -->
96452
96370
</p>
96453
96371
96454
96372
<p class="note">Commas in the <code data-x="dom-MimeType-suffixes">suffixes</code> attribute are
@@ -96467,7 +96385,7 @@ interface <dfn>MimeType</dfn> {
96467
96385
<p>The <dfn><code data-x="dom-navigator-javaEnabled">navigator.javaEnabled()</code></dfn> method
96468
96386
must return true if the user agent supports a <span>plugin</span> that supports the <span>MIME
96469
96387
type</span> "<code data-x="">application/x-java-vm</code>"; otherwise it must return false.
96470
- <!--INSERT FINGERPRINT -->
96388
+ <!--INSERT TRACKING -->
96471
96389
</p>
96472
96390
96473
96391
</div>
@@ -99134,8 +99052,11 @@ dictionary <dfn>CloseEventInit</dfn> : <span>EventInit</span> {
99134
99052
that allows documents to communicate with each other regardless of their source domain, in a way
99135
99053
designed to not enable cross-site scripting attacks.</p>
99136
99054
99137
- <p class="note">This API <a href="#fingerprint-postMessage">has some privacy implications</a> that
99138
- might not be immediately obvious.</p>
99055
+ <p class="note" id="fingerprint-postMessage">The <code
99056
+ data-x="dom-window-postMessage">postMessage()</code> API can be used as a <span>tracking
99057
+ vector</span>.
99058
+ <!-- INSERT TRACKING -->
99059
+ </p>
99139
99060
99140
99061
99141
99062
<h4>Introduction</h4>
@@ -101911,7 +101832,8 @@ interface <dfn>SharedWorker</dfn> : <span>EventTarget</span> {
101911
101832
data-x="dom-navigator-hardwareConcurrency">navigator.hardwareConcurrency</code></dfn> attribute's
101912
101833
getter must return a number between 1 and the number of logical processors potentially available
101913
101834
to the user agent. If this cannot be determined, the getter must return 1.
101914
- <!--INSERT FINGERPRINT--></p>
101835
+ <!--INSERT TRACKING-->
101836
+ </p>
101915
101837
101916
101838
<p>User agents should err toward exposing the number of logical processors available, using lower
101917
101839
values only in cases where there are user-agent specific limits in place (such as a limitation
@@ -102473,7 +102395,7 @@ interface <dfn>Storage</dfn> {
102473
102395
102474
102396
<p>The <dfn><code data-x="dom-localStorage">localStorage</code></dfn> object provides a
102475
102397
<code>Storage</code> object for an <span>origin</span>.
102476
- <!--INSERT FINGERPRINT -->
102398
+ <!--INSERT TRACKING -->
102477
102399
</p>
102478
102400
102479
102401
<dl class="domintro">
0 commit comments