Proxy-Authorize HTTP 标头中的用户名:密码的编码

Proxy-Authorize HTTP 标头中的用户名:密码的编码

我们使用显式代理来访问互联网。

“407 Proxy-Authentication required” 的 HTTP 标头如下所示:

Proxy-Authenticate: BASIC realm="xxx"\r\n
Cache-Control: no-cache\r\n
Pragma: no-cache\r\n
Content-Type: text/html; charset=utf-8\r\n
Proxy-Connection: close\r\n
Connection: close\r\n
Content-Length: 813\r\n

现在,在传输 Proxy-Authorize 标头(浏览器传输凭据时的下一步)时,不同浏览器的行为似乎有所不同(此处 password=passwörd):

使用 FF 或 IE (此处为 IE):

Credentials: user:passw\366rd   <----------- ISO-8859
Accept: text/html, application/xhtml+xml, image/jxr, */*\r\n
Accept-Language: en-US,en;q=0.8,fr-LU;q=0.5,fr;q=0.3\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\r\n
Accept-Encoding: gzip, deflate\r\n

使用 Chrome

Credentials: user:passw\303\266rd   <----------- UTF-8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: en-US,en;q=0.9\r\n

使用 FF 或 IE 时,代理会抱怨编码不符合预期。这意味着它需要 UTF-8,因为使用 Chrome 的身份验证可以正常工作。


我在网上找到了这个:

以前,Firefox 在基本 HTTP 身份验证请求中使用 ISO-8859-1 字符编码作为用户名和密码。Firefox 59 及更高版本将改用 UTF-8 作为授权标头,以确保正确编码非 ASCII 字符(例如法语重音字母)。

然而,我们使用的是 FF 60.7.2ESR,它似乎仍然像上面显示的 IE11 一样发送 ISO-8859。


有几个相关的 RFC:7617、7235、7615。

https://www.rfc-editor.org/rfc/rfc7617#section-2指出

出于向后兼容的原因,只要与 US-ASCII 兼容(将任何 US-ASCII 字符映射到与 US-ASCII 字符代码匹配的单个八位字节),此规范将继续保留默认编码未定义。

然后,https://www.rfc-editor.org/rfc/rfc7617#section-2.1状态

在挑战中,服务器可以使用“charset”身份验证参数来指示它们期望用户代理在生成“用户密码”(八位字节序列)时使用的字符编码方案。此信息仅供参考。唯一允许的值是“UTF-8”...

它给出了一个例子:WWW-Authenticate: Basic realm="foo", charset="UTF-8"

并建议同样适用于“Proxy-Authenticate:”。

当密码为不是US-ASCII 和charset 认证参数是否发送?它一定不是未定义的,但它没有说明它应该是什么。

我们可以强制代理将所有内容解释为 ISO-8859,但这会破坏客户端发送 UTF-8 的所有内容。

相关内容