- From: Ian Hickson <ian@hixie.ch>
- Date: Thu, 24 Jul 2014 19:26:12 +0000 (UTC)
- To: Mike West <mkwst@google.com>, Jochen Eisinger <eisinger@google.com>
- cc: "public-webappsec@w3.org" <public-webappsec@w3.org>, Anne van Kesteren <annevk@annevk.nl>
- Message-ID: <alpine.DEB.2.00.1407241832400.8748@ps20323.dreamhostps.com>
On Thu, 24 Jul 2014, Mike West wrote:
> On Wed, Jul 23, 2014 at 10:14 PM, Ian Hickson <ian@hixie.ch> wrote:
> >
> > In "6.2 Determine request¢s Referrer.", the algorithm carefully
> > navigates itself to a JavaScript global environment record, and then
> > says:
> >
> > let referrerURL be the URL of environment
> >
> > What is that URL? The JavaScript spec doesn't mention anything about
> > global environment records having URLs.
>
> Yes, this was sloppy. I've pushed
> https://github.com/w3c/webappsec/commit/765321dbf1bcc5adfc5d3e517fa64628719faa6c
> in the hopes of cleaning it up. Does the new
> https://w3c.github.io/webappsec/specs/referrer-policy/#determine-requests-referrer
> make more sense?
I think fundamentally we shouldn't be using a JS global environment as
input to this algorithm.
Other than that, this seems much closer. One remaining nit is that the API
referrer source isn't always a Document, sometimes it's a URL.
Another small nit I just noticed is that the Referrer Policy spec returns
"none" (with quotes) while Fetch expects /none/ (the term "none", no
quotes, not a string). I think we should make sure we clearly distinguish
the cases where the return value is a URL from the cases where the return
value is the internal conceptual "none" state. (In particular, naive
implementations could easily end up confusing "none", with quotes, with
the non-absolute URL consisting of just the string "none".)
> > In fact I'm rather confused about why we're doing anything with
> > JavaScript global environment records here.
>
> The goal was to cover requests both from documents and workers (Service
> Workers in particular). I was looking around for a better term, and this
> seemed like the right concept to grab. See the top of
> http://lists.w3.org/Archives/Public/public-webappsec/2014Jun/0006.html
> for a bit of the discussion.
We don't need JS global environments to do this. (What about non-JS
workers in the future?) IMHO in environments that are script-based, we
should start from the script settings object. In fact, in the HTML spec,
anywhere that invokes "fetch" from a script environment always sets the
override referrer source to the API referrer source specified by the
incumbent settings object or the entry settings object, depending on the
case. For example, document.load():
# Fetch url from the origin of document, using the API referrer source
# specified by the entry settings object, with the synchronous flag set
# and the force same-origin flag set.
If we consistently specify the referrer anytime we call fetch, we don't
need fetch itself to ever worry about this case. If we want to define some
default, then we could do it by having the referrer defaulted as follows:
- If there is a specific override referrer source
The override referrer source.
- When navigating
The active document of the source browsing context.
- When fetching resources for an element
The element's Document.
- When there is an incumbent script settings object:
The API referrer source
> > There's also other logic from those steps that seem to be missing
> > entirely now. For example, where are about:blank and data:* URLs
> > dropped?
>
> 'about:', 'data:', and other non-relative schemes are dropped in step 1
> of "6.3 Strip url for use as a referrer", which steps 5 and 6 of the
> "determine" algorithm invoke.
Ah, cool, I missed that.
> > Where is the logic that drops Referers entirely when the origin is a
> > unique tuple?
>
> Hrm. I didn't realize this was a requirement. Chrome doesn't adhere to
> this rule, but Firefox does. Filed https://crbug.com/397011 and added
> https://github.com/w3c/webappsec/commit/51bc0fb4213621ece844c9f7d67eb87b24d44786
> to bring the spec into line.
I don't really know if it's a requirement per se (I don't know if
there's a compat need for it). To be honest, the current spec text is
mostly arbitrary, I'm not sure if it's the best. If we're going to change
it, though, we should make sure we do it deliberately, not just because
of transcriptions errors. ;-)
The HTML spec right now, IIRC, has these notable behaviours:
- documents with a unique origin, e.g. <iframe src="" sandbox>, but that
are not srcdoc documents, get no Referer, even if they have a URL. This
seems relatively important, since
- notwithstanding that, srcdoc documents always defer to their
parent, even if they're in an isolated origin, for the purposes of
Referer. This could be a security issue maybe. Might be worth only
making this happen if they're not explicitly sandboxed without
allow-same-origin. That's easily done: just check for srcdoc after
you've checked for a non-tuple origin.
--
Ian Hickson U+1047E )\._.,--....,'``. fL
http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,.
Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
Received on Thursday, 24 July 2014 19:26:36 UTC