Мы используем явный прокси для доступа в Интернет.
Вот как выглядит HTTP-заголовок «407 Proxy-Authentication required»:
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 (следующий шаг, когда браузер передает учетные данные) поведение браузеров, похоже, различается (здесь пароль = 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 использовал кодировку символов ISO-8859-1 для имени пользователя и пароля в запросах базовой HTTP-аутентификации. Firefox 59 и более поздние версии будут использовать UTF-8 вместо заголовка авторизации, чтобы гарантировать правильное кодирование не-ASCII-символов, таких как буквы с французским акцентом.
Однако мы используем FF 60.7.2ESR, и он по-прежнему отправляет ISO-8859 так же, как IE11, показанный выше.
Есть несколько соответствующих RFC: 7617, 7235, 7615.
https://tools.ietf.org/html/rfc7617#section-2 утверждает, что
По причинам обратной совместимости эта спецификация продолжает оставлять кодировку по умолчанию неопределенной, пока она совместима с US-ASCII (отображение любого символа US-ASCII на один октет, соответствующий коду символа US-ASCII).
Затем, https://tools.ietf.org/html/rfc7617#section-2.1 состояния
В задачах серверы могут использовать параметр аутентификации 'charset', чтобы указать схему кодирования символов, которую, как они ожидают, пользовательский агент будет использовать при генерации "user-pass" (последовательность октетов). Эта информация носит чисто рекомендательный характер. Единственное допустимое значение - "UTF-8" ...
Это дает пример: WWW-Authenticate: Basic realm="foo", charset="UTF-8"
И предполагает, что то же самое относится и к «Proxy-Authenticate:».
Что это означает для проблем, когда пароль не US-ASCII и нет параметр аутентификации charset отправлен? Оно не должно быть неопределенным, но в нем не указано, каким оно должно быть.
Мы могли бы заставить прокси интерпретировать все как ISO-8859, но это сломало бы все, куда клиент отправляет UTF-8.