Ian Hickson wrote:

This e-mail is a response to all the recent ping="" feedback.

I carefully took into account all the feedback mentioned below, as well as past feedback and comments outside these mailing lists. In response to these comments, I've made Referer: be #PING for all pings, and added

A value that MUST NOT be used, according to RFC2616:

"The URI MUST NOT include a fragment." -- <http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.36.p.5>

Ping-From and Ping-To to all pings that use the same origin or that aren't encrypted. I know this doesn't fulfill everyone's desires, but unfortunately the requests from people here were in some cases mutually exclusive and so it was not possible to please everyone. If I disagreed with something you said, either explicitly below or implicitly in the way the specification was changed, please do not take that as meaning your feedback was not welcome or not considered.

That makes it sound a bit like a working group decision was made, which I think is not the case.

On Fri, 1 Feb 2008, Kornel Lesinski wrote:
Theoretically it does, but I haven't seen UA nor application that supports it. Anyway, it could be made an URI with useless scheme, like about:ping.

That could work, though really here we're trying to do something that's not a URI at all.

...in which case you shouldn't use the Referer header:

"The Referer[sic] request-header field allows the client to specify, for the server's benefit, the address (URI) of the resource from which the Request-URI was obtained..." -- <http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.36.p.1>

On Sat, 2 Feb 2008, Julian Reschke wrote:
How is that better compared not to send the Referer header at all?

As noted by others, no Referer header is treated as a local Referer header, which makes it susceptible to XSRF.

Not sure what a "local" referer header would be.

I'm not sure which mail you are referring to (pointer, please), is it <http://lists.w3.org/Archives/Public/public-html/2008Feb/0014.html>?

That states that a bogus (sic) Referer header could be used to filter ping requests. There are many other ways to do that, so I don't accept it as a valid argument.

The point of it all is to make abuse of ping for CSRF harder, so standard body formats like www-form-urlencoded or XML are undesirable, but non-standard formats will require acceess to raw post data and custom parsers, which isn't as easy as reading headers.
So define a custom format.

As noted by Kornel, this is a significantly higher barrier to entry than just using headers.

Yes, sometimes doing something properly is more work than just hacking around.

Another advantage of headers is that Apache could log pings without help of any scripts or non-standard modules - LogFormat directive allows logging of arbitrary headers.
I'm not sure how this is relevant...

It seems extremely relevant, as it enables cheap server-side use instead of requiring heavy lifting for the author.

For the author?

It seems the additional work would be for the implementor of the web server, implementing a module for ping tracking. I'm not sure why that's considered a major issue.

On Sat, 2 Feb 2008, Kornel Lesinski wrote:
Special Content-Type might work equally well -- it can be detected by tools scanning headers only, and should prevent applications from accepting unexpected POST.

Sadly I fear most sites don't check the Content-Type headers.

If you fear vulnerabilities because of servers misinterpreting POST, than this would be a good argument for not using POST, it seems.

It's not a matter of abuse. We need to do a POST request, since that is the most appropriate method for this case (we don't want to add a PING

There was no consensus for that.

method, just like we wouldn't want to add a LOGIN method, a SEARCH method, a POSTEMAIL method, a SAVEPREFERENCES method, etc). However, there is a

Ironically, there is a SEARCH method, although only used in WebDAV land.

As a matter of fact, PING *has* been suggested.

minor risk with doing a POST request in a new way, which is that XSS blacklisting code wouldn't stop the new feature. This is a problem whether the Referer header is absent, or whether it contains a valid value. Hence, we have an invalid value. This seems emminently pragmatic, and not at all something I would classify as abuse.

Ok, we'll continue to disagree on that. But please do not claim that there was some kind of consensus for it.

On Sat, 2 Feb 2008, Julian Reschke wrote:
I see two ways forward here. One would be to redefine Referer to remove the relative URI thing, since, to my knowledge at least, nobody uses it.
That's IMHO not sufficient reason to remove it. It's not broken.

Lack of use is a reason to remove a feature according to IETF process, actually. It's even been used as a reason for HTTP -- Link: headers were removed from HTTP a while back for this very reason. (I've since worked hard to get browsers to implement it, and we can probably get it back in at this point. But that's another story.)

(RFC 2026, section 4.1.2.)

The reason it was removed was because HTTP/1.1 was advancing on the standards track, which requires evidence of things being in use. Next time this happens with HTTP/1.1 (draft -> full), questions like these will be asked again.

And yes, I agree that Link is useful and needs to get revived in some way. People do not seem to understand that it's still part of HTTP.

The other is that we can define the magic value to be "#PING" instead, since that's a non-conforming Referer value right now.
It's not conforming, so are you suggesting to use a non-conforming value?

Right; by using a previously illegal value, we can ensure that nobody is relying on it already. (I presume your objection to using a relative value "ping" is that it could be misinterpreted by existing implementations due to its current definition.)

The value is illegal until you make it legal. To make that, you'll have to change the definition in HTTP/1.1.

The risk is that recipients that expect a compliant Referer header will break in some way.

Could you please state what problem you are trying to solve, and why it needs to involve the Referer header?

I believe the problem has been stated a number of times in this thread already. I refer you to dolphinling's original e-mail.

Pointer, please.

Not at all; the risks are easily mitigated.

Apparently we disagree on this.

On Sat, 2 Feb 2008, Adam Barth wrote:
Perhaps this has been suggested before, but another option is to use a new verb, such as PING, instead of GET when making the request. Servers unaware of the ping attribute will likely ignore this verb, mitigating the request-forgery attack vector.

Sadly this is more than likely to cause problems with transparent proxies.

Evidence, please.

It also seems silly to invent a new method, as noted earlier in this message. POST is the appropriate method here.

Disagreed.

I do not believe a new method is needed (as I still think that GET/HEAD would be fine); but it certainly would be better than POST because of all the issues we're discussing here.

On Sat, 2 Feb 2008, dolphinling wrote:
If (X-)Ping-From/Ping-To are present, why is a referer needed at all? I'd say just leave it out. If not, #PING works for me.

We can't remove it since then it would be treated as a local request.

Please explain "local request".

The absence of a Referer header means that no Referer information is available, not that it's a local request. So please clarify.

On Sun, 3 Feb 2008, Julian Reschke wrote:
I think it's a strange way to design a network protocol. When ping requests in access logs are a problem, there are many ways not to have it in the first place (not using HTTP, for instance) or by using a different HTTP verb. Forcing something into a header it's not designed for is even worse, in particular if the only reason given is to make it easier to parse logs.

It's not clear exactly what your concern is here.

My concern is that you're raking ease of implementation higher than consistency of specifications.

BR, Julian

Reply via email to