Hi Amos,
On 2011-10-03 06:50, Amos Jeffries wrote:
> On 27/09/11 06:19, Jan Sievers wrote:
>> I noticed that trying to access a resource using URLs with backslash
>> character ('\') using Firefox 6.0.2 breaks the HTTP-Digest
>> authentication in Squid 3.1.15.
>>
>> Accessing the same resource using explicitly URL-escapes in the address
>> bar (%5C) works.
>>
>> Accessing the same resource with Opera works, since it escapes every
>> ('\') character itself.
>>
>> I guess it's more a Firefox bug, if it's not a content provider bug :-)
>> ignoring RFCs. But I am wondering if I can do something about it in
>> Squid?
>>
>> Or if Squid could respect different URL handling of different clients
>> and build the digest hash the same way the browser does, meaning not to
>> manipulate the uri provided in the Proxy-Authorization header again;
>> here not to remove the backslash character?
>
> This sounds a lot like http://bugs.squid-cache.org/show_bug.cgi?id=3077
Well, actually it's not exactly the same bug.
In #3077 it was reported, that Squid ate more from a HTTP header because
a quoted-string ended (legally) with a backslash character ('\'), like
uri = "/?\"
This is not really possible to parse, if you want to allow escaped
quoted-pairs, like
realm = "\"myserver\""
But here I have the situation, that a backslash character is within a
quoted-string and not at the end, like
uri = "/Default.aspx?path=foo\bar"
With Squid 3.1.15 and "debug_options 29,9" this will result in
authDigestDecodeAuth: Found uri '/Default.aspx?path=foobar'
And therefor it will calculate a different digest hash than the client.
Mentioned commit #r10998 does not fix it for me.
I did not manage to build Squid 3.2.0.12 here, but I don't see why it
should not do the same, since HttpHeaderTools.cc:370 in function
httpHeaderParseQuotedString says
bool quoted = (*pos == '\\');
if (quoted) {
pos++;
and later it never ever decreases "pos", so it jumps over every
backslash character and never re-includes it in the string.
Or am I missing something?
Maybe something like that should do the job:
In line 380 instead of
while (end < (start+len) && *end != '\\' && *end != '\"' && *end > 0x1F
&& *end != 0x7F)
end++;
use
while (end < (start+len) && *end > 0x1F && *end != 0x7F) {
if (quoted) {
quoted = false;
if (*end != '\\' && *end != '\"')
pos--;
} else {
if (*end == '\\' || *end == '\"')
break;
}
end++;
}
Beside that I am still unsure, if I could blame the content provider and
probably also the client for using unescaped backslash characters in
URIs (links in case of the content provider) and in a HTTP-Digest
authentication header which both should respect RFC 2396 "URI Generic
Syntax" which in my view does not allow such characters (e.g. in the
query part)
query = *uric
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
"$" | ","
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" |
"(" | ")"
escaped = "%" hex hex
Nevertheless it should be fixed it in "httpHeaderParseQuotedString"
function, since the (unescaped) backslash character is unfortunately
allowed in HTTP-Headers in general, see RFC 2616 "HTTP/1.1".
Comments appreciated.
Jan
-- Jan Sievers | Freie Universität Berlin | sievers_at_zedat.fu-berlin.de Zentraleinrichtung für Datenverarbeitung | http://www.zedat.fu-berlin.deReceived on Thu Oct 06 2011 - 17:35:29 MDT
This archive was generated by hypermail 2.2.0 : Fri Oct 07 2011 - 12:00:03 MDT