Risposta breve: iso-8859-1 a meno che non vengano utilizzate parole codificate in conformità con RFC2047 (MIME).
Spiegazione più lunga:
RFC2617, sezione 2 (autenticazione HTTP) definisce le credenziali di base :
basic-credentials = base64-user-pass
base64-user-pass = <base64 encoding of user-pass,
except not limited to 76 char/line>
user-pass = userid ":" password
userid = *<TEXT excluding ":">
password = *TEXT
La specifica non deve essere letta senza fare riferimento a RFC2616 (HTTP 1.1) per le definizioni in BNF (come quella sopra):
Questa specifica è complementare alla specifica HTTP / 1.1 2 . Utilizza la sezione 2.1 BNF aumentata di quel documento e si basa su entrambi i non terminali definiti in quel documento e su altri aspetti della specifica HTTP / 1.1.
RFC2616, sezione 2.1 definisce TEXT (enfasi mia):
La regola TEXT viene utilizzata solo per i contenuti e i valori dei campi descrittivi che non devono essere interpretati dal parser del messaggio. Le parole di * TEXT POSSONO contenere caratteri di set di caratteri diversi da
ISO-8859-1 solo se codificati secondo le regole dell'RFC 2047.
TEXT = <any OCTET except CTLs, but including LWS>
Quindi è sicuramente iso-8859-1 a meno che non si rilevi qualche altra codifica secondo le regole RFC2047 (MIME pt.3 ):
// Username: Mike
// Password T€ST
Mike:=?iso-8859-15?q?T€ST?=
In questo caso il segno dell'euro nella parola sarebbe codificato come 0xA4
secondo iso-8859-15 . A quanto mi risulta, dovresti controllare questi delimitatori di parole codificati e quindi decodificare le parole all'interno in base alla codifica specificata. Se non lo fai, penserai che la password sia =?iso-8859-15?q?T¤ST?=
(nota che 0xA4
verrebbe decodificata ¤
se interpretata come iso-8859-1).
Questa è la mia comprensione, non riesco a trovare una conferma più esplicita di queste RFC. E alcuni sembrano contraddittori. Ad esempio, uno dei 4 obiettivi dichiarati di RFC2047 (MIME, pt.3) è ridefinire:
il formato dei messaggi per consentire ... informazioni di intestazione testuali in set di caratteri diversi da US-ASCII.
Ma poi RFC2616 (HTTP 1.1) definisce un'intestazione utilizzando la regola TEXT che per impostazione predefinita è iso-8859-1. Ciò significa che ogni parola in questa intestazione dovrebbe essere una parola codificata (cioè la =?...?=
forma)?
Anche rilevante, nessun browser corrente lo fa. Usano utf-8 (Chrome, Opera), iso-8859-1 (Safari), la code page di sistema (IE) o qualcos'altro (come solo il bit più significativo di utf-8 nel caso di Firefox).
Modifica: mi sono appena reso conto che questa risposta esamina il problema più dal punto di vista del lato server.