diff --git a/source b/source index ae3cd2248f3..b21bfbcd6d8 100644 --- a/source +++ b/source @@ -783,94 +783,6 @@ interface Example { -

Privacy concerns

- - - -

Some features of HTML trade user convenience for a measure of user privacy.

- -

In general, due to the Internet's architecture, a user can be distinguished from another by the - user's IP address. IP addresses do not perfectly match to a user; as a user moves from device to - device, or from network to network, their IP address will change; similarly, NAT routing, proxy - servers, and shared computers enable packets that appear to all come from a single IP address to - actually map to multiple users. Technologies such as onion routing can be used to further - anonymize requests so that requests from a single user at one node on the Internet appear to come - from many disparate parts of the network.

- -

However, the IP address used for a user's requests is not the only mechanism by which a user's - requests could be related to each other. Cookies, for example, are designed specifically to enable - this, and are the basis of most of the Web's session features that enable you to log into a site - with which you have an account.

- -

There are other mechanisms that are more subtle. Certain characteristics of a user's system can - be used to distinguish groups of users from each other; by collecting enough such information, an - individual user's browser's "digital fingerprint" can be computed, which can be as good as, if not - better than, an IP address in ascertaining which requests are from the same user.

- -

Grouping requests in this manner, especially across multiple sites, can be used for both benign - (and even arguably positive) purposes, as well as for malevolent purposes. An example of a - reasonably benign purpose would be determining whether a particular person seems to prefer sites - with dog illustrations as opposed to sites with cat illustrations (based on how often they visit - the sites in question) and then automatically using the preferred illustrations on subsequent - visits to participating sites. Malevolent purposes, however, could include governments combining - information such as the person's home address (determined from the addresses they use when getting - driving directions on one site) with their apparent political affiliations (determined by - examining the forum sites that they participate in) to determine whether the person should be - prevented from voting in an election.

- -

Since the malevolent purposes can be remarkably evil, user agent implementers are encouraged to - consider how to provide their users with tools to minimize leaking information that could be used - to fingerprint a user.

- -

Unfortunately, as the first paragraph in this section implies, sometimes there is great benefit - to be derived from exposing the very information that can also be used for fingerprinting - purposes, so it's not as easy as simply blocking all possible leaks. For instance, the ability to - log into a site to post under a specific identity requires that the user's requests be - identifiable as all being from the same user, more or less by definition. More subtly, though, - information such as how wide text is, which is necessary for many effects that involve drawing - text onto a canvas (e.g. any effect that involves drawing a border around the text) also leaks - information that can be used to group a user's requests. (In this case, by potentially exposing, - via a brute force search, which fonts a user has installed, information which can vary - considerably from user to user.)

- -

Features in this specification which can be used to - fingerprint the user are marked as this paragraph is. - -

- -

Other features in the platform can be used for the same purpose, though, including, though not - limited to:

- - - - -

Cross-site communication

- -

The postMessage() API provides a mechanism by - which two sites can communicate directly. At first glance, this might appear to open a new way by - which the problems described above can occur. However, in practice, multiple mechanisms exist by - which two sites can communicate that predate this API: a site embedding another can send data via - an iframe element's dimensions; a site can use a cross-site image request with a - unique identifier known to the server to initiate a server-side data exchange; or indeed the - fingerprinting techniques described above can be used by two sites to uniquely identify a visitor - such that information can then be exchanged on the server side.

- -

Fundamentally, users that do not trust a site to treat their information with respect have to - avoid visiting that site at all.

- - -

A quick introduction to HTML

@@ -2172,7 +2084,7 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute fingerprinting vector that increases the chances of users being uniquely identified, user agents are encouraged to support the exact same set of plugins for each user. - +

@@ -2434,7 +2346,7 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute

User agents may impose implementation-specific limits on otherwise unconstrained inputs, e.g. to prevent denial of service attacks, to guard against running out of memory, or to work around platform-specific limitations. - +

For compatibility with existing content and prior specifications, this specification describes @@ -2472,6 +2384,10 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute

  • The general iteration terms while, continue, and break.
  • +
  • tracking vector + +
  • code point and its synonym character
  • surrogate
  • @@ -9471,7 +9387,9 @@ partial interface Document { origin, the user agent must throw a "SecurityError" DOMException. Otherwise, the user agent must return the cookie-string for the document's URL for a "non-HTTP" API, decoded - using UTF-8 decode without BOM.

    + using UTF-8 decode without BOM. + +

    On setting, if the document is a cookie-averse Document object, then the user agent must do nothing. Otherwise, if the Document's origin is @@ -34415,7 +34333,7 @@ interface MediaError { media resource. In the even rarer case of a media resource with no explicit timings of any kind, not even frame durations, the user agent must itself determine the time for each frame in a user-agent-defined manner. - +

    An example of a file format with no explicit timeline but with explicit frame @@ -48164,7 +48082,7 @@ ldh-str = < as defined in The element is a button, specifically a submit button. - +

    Since the default label is implementation-defined, and the width of the button @@ -48537,7 +48455,7 @@ ldh-str = < as defined in The element is a button. - +

    Since the default label is implementation-defined, and the width of the button @@ -63768,7 +63686,7 @@ try { the CanvasText interface, and then using the returned inline box must return a new TextMetrics object with members behaving as described in the following list: - +

    @@ -75138,7 +75056,7 @@ addShortcutKeyLabel(document.getElementById('c')); key that corresponds to the value given in the attribute, can be used as the access key, then the user agent may assign that combination of keys as the element's assigned access key and return. - +

    @@ -88047,7 +87965,7 @@ interface ApplicationCache : EventTarget {
  • The user has not disabled scripting for this browsing context at this time. (User agents may provide users with the option to disable scripting globally, or in a finer-grained manner, e.g. on a per-origin basis.) - +
  • The browsing context's active document's @@ -90969,7 +90887,7 @@ import "https://example.com/foo/../module2.mjs";
  • Let message be a user-agent-defined string describing the error in a helpful manner. - +

  • Let errorValue be the value that represents the error: in the case of an @@ -94863,7 +94781,7 @@ interface Navigator { profile the user. In fact, if enough such information is available, a user can actually be uniquely identified. For this reason, user agent implementers are strongly urged to include as little information in this API as possible. - +

    @@ -94944,7 +94862,7 @@ interface Navigator {
  • Any information in this API that varies from user to user can be used to profile or identify the user. - +
  • If the user is not using a service that obfuscates the user's point of origin (e.g. the Tor @@ -94961,7 +94879,7 @@ interface Navigator {

    To avoid introducing any more fingerprinting vectors, user agents should use the same list for the APIs defined in this function as for the HTTP `Accept-Language` header. - +

    @@ -95508,13 +95426,13 @@ interface MimeType {

    The supported property indices of a PluginArray object are the numbers from zero to the number of non-hidden plugins represented by the object, if any. - +

    The length attribute must return the number of non-hidden plugins represented by the object. - +

    The item() method of a @@ -95535,14 +95453,14 @@ interface MimeType { -

    It is important for - privacy that the order of plugins not leak additional information, e.g. the order in which +

    It is important for + privacy that the order of plugins not leak additional information, e.g., the order in which plugins were installed.

    The supported property names of a PluginArray object are the values of the name attributes of all the Plugin objects represented by the PluginArray object. - +

    The namedItem() method of a @@ -95587,14 +95505,14 @@ interface MimeType { supported by non-hidden plugins represented by the corresponding PluginArray object, if any. - +

    The length attribute must return the number of MIME types explicitly supported by non-hidden plugins represented by the corresponding PluginArray object, if any. - +

    The item() method of a @@ -95616,14 +95534,14 @@ interface MimeType { -

    It is important for - privacy that the order of MIME types not leak additional information, e.g. the order in +

    It is important for + privacy that the order of MIME types not leak additional information, e.g., the order in which plugins were installed.

    The supported property names of a MimeTypeArray object are the values of the type attributes of all the MimeType objects represented by the MimeTypeArray object. - +

    The namedItem() method of a @@ -95652,12 +95570,12 @@ interface MimeType {

    The supported property indices of a Plugin object are the numbers from zero to the number of reported MIME types. - +

    The length attribute must return the number of reported MIME types. - +

    The item() method of a MimeType { -

    It is important for - privacy that the order of MIME types not leak additional information, e.g. the order in +

    It is important for + privacy that the order of MIME types not leak additional information, e.g., the order in which plugins were installed.

    The supported property names of a Plugin object are the values of the type attributes of the MimeType objects representing the reported MIME types. - +

    The namedItem() method of a MimeType { data-x="dom-Plugin-description">description attribute just return the same value as the name attribute, and that the filename attribute return the empty string. - +


    @@ -95740,7 +95658,7 @@ interface MimeType { data-x="dom-MimeType-description">description
    attribute just return the same value as the type attribute, and that the suffixes attribute return the empty string. - +

    Commas in the suffixes attribute are @@ -95759,7 +95677,7 @@ interface MimeType {

    The navigator.javaEnabled() method must return true if the user agent supports a plugin that supports the MIME type "application/x-java-vm"; otherwise it must return false. - +

    @@ -98433,8 +98351,11 @@ dictionary CloseEventInit : EventInit { that allows documents to communicate with each other regardless of their source domain, in a way designed to not enable cross-site scripting attacks.

    -

    This API has some privacy implications that - might not be immediately obvious.

    +

    The postMessage() API can be used as a tracking + vector. + +

    @@ -101220,7 +101141,8 @@ interface SharedWorker : EventTarget { data-x="dom-navigator-hardwareConcurrency">navigator.hardwareConcurrency attribute's getter must return a number between 1 and the number of logical processors potentially available to the user agent. If this cannot be determined, the getter must return 1. -

    + +

    User agents should err toward exposing the number of logical processors available, using lower values only in cases where there are user-agent specific limits in place (such as a limitation @@ -101782,7 +101704,7 @@ interface Storage {

    The localStorage object provides a Storage object for an origin. - +