[cors] Allow-Credentials vs Allow-Origin: * on image elements?

2010-07-05 Thread Charlie Reis
Hi all--
  I'm trying to understand one of the example use cases in the CORS
specification and how the various rules about credentials apply, and I'm
wondering whether there's an issue to resolve.

  In the "Not tainting the canvas element" example at
http://dev.w3.org/2006/waf/access-control/#use-cases, it looks like the
images will be requested from http://narwhalart.example using  tags.
 If so, it's possible the user agent will send cookies on the GET request
for the images.

  If I understand correctly, that implies that the HTTP response would have
to include "Access-Control-Allow-Credentials: true," because cookies are
considered credentials.  However, I also see that providing
"Access-Control-Allow-Credentials: true" means that * cannot be used for
Access-Control-Allow-Origin.  The use case mentions that the server could
make the images accessible to all origins, though.

  Is the server allowed to omit the Access-Control-Allow-Credentials header
and use * for Access-Control-Allow-Origin, despite the presence of cookies
on the image's GET request?

  Also, what is the reason that * is not allowed for responses that allow
credentials?  I've seen it documented in several places, but I'm not sure
why that's the case.  In cases like images or perhaps web fonts, it seems
impractical to prevent credentials from being sent (unlike XmlHttpRequests).

  On a similar note, are the image's GET requests required to carry Origin
HTTP headers?

Thanks in advance,
Charlie Reis


Re: [cors] Allow-Credentials vs Allow-Origin: * on image elements?

2010-07-07 Thread Charlie Reis
On Wed, Jul 7, 2010 at 1:28 AM, Anne van Kesteren  wrote:

> On Fri, 02 Jul 2010 23:05:41 +0200, Charlie Reis 
> wrote:
>
>> Hi all--
>>  I'm trying to understand one of the example use cases in the CORS
>> specification and how the various rules about credentials apply, and I'm
>> wondering whether there's an issue to resolve.
>>
>>  In the "Not tainting the canvas element" example at
>> http://dev.w3.org/2006/waf/access-control/#use-cases, it looks like the
>> images will be requested from http://narwhalart.example using  tags.
>>  If so, it's possible the user agent will send cookies on the GET request
>> for the images.
>>
>>  If I understand correctly, that implies that the HTTP response would have
>> to include "Access-Control-Allow-Credentials: true," because cookies are
>> considered credentials.  However, I also see that providing
>> "Access-Control-Allow-Credentials: true" means that * cannot be used for
>> Access-Control-Allow-Origin.  The use case mentions that the server could
>> make the images accessible to all origins, though.
>>
>
> Right. The server would have to know the origin of the request for that to
> work given the current constraints in the CORS specification. The current
> constraints are there as at least one implementor was afraid it would
> otherwise be to easy to configure the server in such a way as to reveal
> confidential information.
>
>
>
>   Is the server allowed to omit the Access-Control-Allow-Credentials header
>> and use * for Access-Control-Allow-Origin, despite the presence of cookies
>> on the image's GET request?
>>
>
> Not per CORS. In theory HTML5 could phrase the requirements around 
> fetching to be different, but that does not seem like a good idea.
>
>
>
>   Also, what is the reason that * is not allowed for responses that allow
>> credentials?  I've seen it documented in several places, but I'm not sure
>> why that's the case.  In cases like images or perhaps web fonts, it seems
>> impractical to prevent credentials from being sent (unlike
>> XmlHttpRequests).
>>
>
> See above.
>
>
>
>   On a similar note, are the image's GET requests required to carry Origin
>> HTTP headers?
>>
>
> They are required to carry an Origin header but the current requirements
> also indicate that the header will just give "null" rather than an origin.
>
>
That's unfortunate-- at least for now, that prevents servers from echoing
the origin in the Access-Control-Allow-Origin header, so servers cannot host
"public" images that don't taint canvases.  The same problem likely exists
for other types of requests that might adopt CORS, like fonts, etc.


> I believe the plan is to change HTML5 once CORS is somewhat more stable and
> use it for various pieces of infrastructure there. At that point we can
> change  to transmit an Origin header with an origin. We could also
> decide to change CORS and allow the combination of * and the credentials
> flag being true. I think * is not too different from echoing back the value
> of a header.
>
>
I would second the proposal to allow * with credentials.  It seems roughly
equivalent to echoing back the Origin header, and it would allow CORS to
work on images and other types of requests without changes to HTML5.

Thanks,
Charlie


Re: [cors] Allow-Credentials vs Allow-Origin: * on image elements?

2010-07-07 Thread Charlie Reis
On Wed, Jul 7, 2010 at 4:04 PM, Mark S. Miller  wrote:

> On Wed, Jul 7, 2010 at 1:09 PM, Charlie Reis  wrote:
> [...]
>
>> That's unfortunate-- at least for now, that prevents servers from echoing
>> the origin in the Access-Control-Allow-Origin header, so servers cannot host
>> "public" images that don't taint canvases.  The same problem likely exists
>> for other types of requests that might adopt CORS, like fonts, etc.
>>
>
> Why would public images or fonts need credentials?
>

Because it's undesirable to prevent the browser from sending cookies on an
 request, and the user might have cookies for the image's site.  It's
typical for the browser to send cookies on such requests, and those are
considered a type of credentials by CORS.

Charlie



>
>
>>
>>
>>> I believe the plan is to change HTML5 once CORS is somewhat more stable
>>> and use it for various pieces of infrastructure there. At that point we can
>>> change  to transmit an Origin header with an origin. We could also
>>> decide to change CORS and allow the combination of * and the credentials
>>> flag being true. I think * is not too different from echoing back the value
>>> of a header.
>>>
>>>
>> I would second the proposal to allow * with credentials.  It seems roughly
>> equivalent to echoing back the Origin header, and it would allow CORS to
>> work on images and other types of requests without changes to HTML5.
>>
>> Thanks,
>> Charlie
>>
>>
>
>
> --
> Cheers,
> --MarkM
>


Re: [cors] Allow-Credentials vs Allow-Origin: * on image elements?

2010-07-07 Thread Charlie Reis
On Wed, Jul 7, 2010 at 4:14 PM, Devdatta Akhawe wrote:

> > Because it's undesirable to prevent the browser from sending cookies on
> an
> >  request,
>
> Why ? I can understand why you can't do it today - but why is this
> undesirable even for new applications? Ad tracking ?
>
> ~devdatta
>
>
I meant "undesirable" in that it will require much deeper changes to
browsers.

I wouldn't mind making it possible to request an image or other subresource
without cookies, but I don't think there's currently a mechanism for that,
is there?  And if there's consensus that user agents shouldn't send cookies
at all on third party subresources, I'm ok with that, but I imagine there
would be pushback on that sort of proposal-- it would likely affect
compatibility with existing web sites.  I haven't gathered any data on it,
though.

The benefit to allowing * with credentials is that it lets CORS work with
the existing browser request logic for images and other subresources, where
cookies are currently sent with the request.

Charlie



> On 7 July 2010 16:11, Charlie Reis  wrote:
> >
> >
> > On Wed, Jul 7, 2010 at 4:04 PM, Mark S. Miller 
> wrote:
> >>
> >> On Wed, Jul 7, 2010 at 1:09 PM, Charlie Reis 
> wrote:
> >> [...]
> >>>
> >>> That's unfortunate-- at least for now, that prevents servers from
> echoing
> >>> the origin in the Access-Control-Allow-Origin header, so servers cannot
> host
> >>> "public" images that don't taint canvases.  The same problem likely
> exists
> >>> for other types of requests that might adopt CORS, like fonts, etc.
> >>
> >> Why would public images or fonts need credentials?
> >
> > Because it's undesirable to prevent the browser from sending cookies on
> an
> >  request, and the user might have cookies for the image's site.
>  It's
> > typical for the browser to send cookies on such requests, and those are
> > considered a type of credentials by CORS.
> > Charlie
> >
> >>
> >>
> >>>>
> >>>> I believe the plan is to change HTML5 once CORS is somewhat more
> stable
> >>>> and use it for various pieces of infrastructure there. At that point
> we can
> >>>> change  to transmit an Origin header with an origin. We could
> also
> >>>> decide to change CORS and allow the combination of * and the
> credentials
> >>>> flag being true. I think * is not too different from echoing back the
> value
> >>>> of a header.
> >>>>
> >>>
> >>> I would second the proposal to allow * with credentials.  It seems
> >>> roughly equivalent to echoing back the Origin header, and it would
> allow
> >>> CORS to work on images and other types of requests without changes to
> HTML5.
> >>> Thanks,
> >>> Charlie
> >>
> >>
> >>
> >> --
> >> Cheers,
> >> --MarkM
> >
> >
>


Re: [cors] Allow-Credentials vs Allow-Origin: * on image elements?

2010-07-07 Thread Charlie Reis
It's not just implementation effort-- as I mentioned, it's potentially a
compatibility question.  If you are proposing not sending cookies on any
cross-origin images (or other potential candidates for CORS), do you have
any data about which sites that might affect?

Personally, I would love to see cross-origin subresource requests change to
not using cookies, but that could break existing web sites that include
subresources from partner sites, etc.  Is there a proposal or discussion
about this somewhere?

In the mean time, the canvas tainting example in the spec seems difficult to
achieve.

Charlie



On Wed, Jul 7, 2010 at 5:05 PM, Devdatta Akhawe wrote:

> hmm, I think I quoted the wrong part of your email. I wanted to ask
> why would it be undesirable to make CORS GET requests cookie-less. It
> seems the argument here is reduction of implementation work. Is this
> the only one? Note that even AnonXmlHttpRequest intends to make GET
> requests cookie-less.
>
> Regards
> devdatta
>
>
> >
> > I meant "undesirable" in that it will require much deeper changes to
> > browsers.
> > I wouldn't mind making it possible to request an image or other
> subresource
> > without cookies, but I don't think there's currently a mechanism for
> that,
> > is there?  And if there's consensus that user agents shouldn't send
> cookies
> > at all on third party subresources, I'm ok with that, but I imagine there
> > would be pushback on that sort of proposal-- it would likely affect
> > compatibility with existing web sites.  I haven't gathered any data on
> it,
> > though.
> > The benefit to allowing * with credentials is that it lets CORS work with
> > the existing browser request logic for images and other subresources,
> where
> > cookies are currently sent with the request.
> > Charlie
> >
> >>
> >> On 7 July 2010 16:11, Charlie Reis  wrote:
> >> >
> >> >
> >> > On Wed, Jul 7, 2010 at 4:04 PM, Mark S. Miller 
> >> > wrote:
> >> >>
> >> >> On Wed, Jul 7, 2010 at 1:09 PM, Charlie Reis 
> >> >> wrote:
> >> >> [...]
> >> >>>
> >> >>> That's unfortunate-- at least for now, that prevents servers from
> >> >>> echoing
> >> >>> the origin in the Access-Control-Allow-Origin header, so servers
> >> >>> cannot host
> >> >>> "public" images that don't taint canvases.  The same problem likely
> >> >>> exists
> >> >>> for other types of requests that might adopt CORS, like fonts, etc.
> >> >>
> >> >> Why would public images or fonts need credentials?
> >> >
> >> > Because it's undesirable to prevent the browser from sending cookies
> on
> >> > an
> >> >  request, and the user might have cookies for the image's site.
> >> >  It's
> >> > typical for the browser to send cookies on such requests, and those
> are
> >> > considered a type of credentials by CORS.
> >> > Charlie
> >> >
> >> >>
> >> >>
> >> >>>>
> >> >>>> I believe the plan is to change HTML5 once CORS is somewhat more
> >> >>>> stable
> >> >>>> and use it for various pieces of infrastructure there. At that
> point
> >> >>>> we can
> >> >>>> change  to transmit an Origin header with an origin. We could
> >> >>>> also
> >> >>>> decide to change CORS and allow the combination of * and the
> >> >>>> credentials
> >> >>>> flag being true. I think * is not too different from echoing back
> the
> >> >>>> value
> >> >>>> of a header.
> >> >>>>
> >> >>>
> >> >>> I would second the proposal to allow * with credentials.  It seems
> >> >>> roughly equivalent to echoing back the Origin header, and it would
> >> >>> allow
> >> >>> CORS to work on images and other types of requests without changes
> to
> >> >>> HTML5.
> >> >>> Thanks,
> >> >>> Charlie
> >> >>
> >> >>
> >> >>
> >> >> --
> >> >> Cheers,
> >> >> --MarkM
> >> >
> >> >
> >
> >
>