El RFC2617 dice codificar el nombre de usuario y la contraseña en base64, pero no dice qué codificación de caracteres usar al crear los octetos para la entrada en el algoritmo base64.
¿Debería asumir US-ASCII o UTF8? ¿O alguien ya ha resuelto esta cuestión en algún lugar?
http
basic-authentication
Dobes Vandermeer
fuente
fuente
Respuestas:
Especificaciones originales - RFC 2617
RFC 2617 se puede leer como "ISO-8859-1" o "indefinido". Tu elección. Se sabe que muchos servidores usan ISO-8859-1 (te guste o no) y fallarán cuando envíes algo más. Así que probablemente la única opción segura sea ceñirse a ASCII.
Para obtener más información y una propuesta para solucionar la situación, consulte el borrador "Un parámetro de codificación para la autenticación básica HTTP" (que formó la base de RFC 7617).
Nuevo - RFC 7617
Desde 2015 existe el RFC 7617 , que deja obsoleto el RFC 2617. A diferencia del antiguo RFC, el nuevo RFC define explícitamente la codificación de caracteres que se utilizará para el nombre de usuario y la contraseña.
charset="UTF-8"
en su desafío, como este:WWW-Authenticate: Basic realm="myChosenRealm", charset="UTF-8"
Esto anuncia que el servidor aceptará caracteres no ASCII en el nombre de usuario / contraseña, y que espera que estén codificados en UTF-8 (específicamente Normalization Form C) . Tenga en cuenta que solo se permite UTF-8.
Versión completa:
Lea la especificación . Si contiene detalles adicionales, como el procedimiento de codificación exacto y la lista de puntos de código Unicode que deben admitirse.
Soporte de navegador
A partir de 2018, los navegadores modernos generalmente usarán UTF-8 de forma predeterminada si un usuario ingresa caracteres no ASCII para el nombre de usuario o la contraseña (incluso si el servidor no usa el
charset
parámetro).Reino
El parámetro de reino todavía solo admite caracteres ASCII incluso en RFC 7617.
fuente
Respuesta corta: iso-8859-1 a menos que se utilicen palabras codificadas de acuerdo con RFC2047 (MIME).
Explicación más larga:
RFC2617, sección 2 (Autenticación HTTP) define las credenciales básicas :
La especificación no debe leerse sin consultar RFC2616 (HTTP 1.1) para obtener definiciones en BNF (como la anterior):
RFC2616, sección 2.1 define TEXTO (énfasis mío):
Entonces, definitivamente es iso-8859-1 a menos que detecte alguna otra codificación de acuerdo con las reglas RFC2047 (MIME pt. 3):
En este caso, el signo del euro en la palabra se codificaría
0xA4
según iso-8859-15 . Tengo entendido que debe verificar estos delimitadores de palabras codificadas y luego decodificar las palabras internas según la codificación especificada. Si no lo hace, pensará que la contraseña es=?iso-8859-15?q?T¤ST?=
(observe que0xA4
se decodificará¤
cuando se interprete como iso-8859-1).Este es mi entendimiento, no puedo encontrar una confirmación más explícita que estas RFC. Y algo de eso parece contradictorio. Por ejemplo, uno de los 4 objetivos declarados de RFC2047 (MIME, punto 3) es redefinir:
Pero luego RFC2616 (HTTP 1.1) define un encabezado usando la regla TEXT que por defecto es iso-8859-1. ¿Significa eso que cada palabra en este encabezado debe ser una palabra codificada (es decir, la
=?...?=
forma)?También es relevante, ningún navegador actual hace esto. Usan utf-8 (Chrome, Opera), iso-8859-1 (Safari), la página de códigos del sistema (IE) o algo más (como solo el bit más significativo de utf-8 en el caso de Firefox).
Editar: Me acabo de dar cuenta de que esta respuesta analiza el problema más desde la perspectiva del lado del servidor.
fuente
Dejando a un lado las RFC, en Spring Framework , la
BasicAuthenticationFilter
clase, el valor predeterminado es UTF-8 .Creo que la razón de esta elección es que UTF-8 es capaz de codificar todos los caracteres posibles, mientras que ISO-8859-1 (o ASCII) no lo es. Intentar utilizar un nombre de usuario / contraseña con caracteres no admitidos en el sistema puede provocar un comportamiento defectuoso o (quizás peor) una seguridad degradada.
fuente
Si está interesado en lo que hacen los navegadores cuando ingresa caracteres no ascii en el indicador de inicio de sesión, acabo de probar con Firefox.
Parece convertir perezosamente todo a ISO-8859-1 tomando el byte menos significativo de cada valor Unicode, por ejemplo:
Están codificados de la misma manera que:
0x5a 0x3a 0x4e base64-> WjpO
fuente