este es un rapidito:
Podrías pensar que debería ser, ¡pero realmente no lo es en absoluto!
¿Cuáles son los caracteres permitidos tanto en el nombre como en el valor de la cookie?
Según el antiguo Netscape cookie_spec, la NAME=VALUE
cadena completa es:
Una secuencia de caracteres excluyendo punto y coma, coma y espacio en blanco.
Entonces -
debería funcionar, y parece estar bien en los navegadores que tengo aquí; ¿Dónde tienes problemas con eso?
Por implicación de lo anterior:
=
es legal incluir, pero potencialmente ambiguo. Los navegadores siempre dividen el nombre y el valor en el primer =
símbolo de la cadena, por lo que en la práctica puede poner un =
símbolo en el VALOR pero no en el NOMBRE.
Lo que no se menciona, porque Netscape era terrible para escribir especificaciones, pero parece ser compatible con los navegadores:
el NOMBRE o el VALOR pueden ser cadenas vacías
Si no hay ningún =
símbolo en la cadena, los navegadores lo tratan como la cookie con el nombre de la cadena vacía, Set-Cookie: foo
es decir, es el mismo que Set-Cookie: =foo
.
cuando los navegadores generan una cookie con un nombre vacío, omiten el signo igual. Así Set-Cookie: =bar
engendra Cookie: bar
.
las comas y espacios en nombres y valores realmente parecen funcionar, aunque los espacios alrededor del signo igual están recortados
los caracteres de control ( \x00
a \x1F
más \x7F
) no están permitidos
Lo que no se menciona y los navegadores son totalmente inconsistentes, son los caracteres no ASCII (Unicode):
- en Opera y Google Chrome, están codificados en encabezados de cookies con UTF-8;
- en IE, se usa la página de códigos predeterminada de la máquina (específica de la localidad y nunca UTF-8);
- Firefox (y otros navegadores basados en Mozilla) usan el byte bajo de cada punto de código UTF-16 por sí solo (por lo que ISO-8859-1 está bien, pero cualquier otra cosa está destrozada);
- Safari simplemente se niega a enviar cualquier cookie que contenga caracteres no ASCII.
por lo tanto, en la práctica no puede usar caracteres que no sean ASCII en las cookies. Si desea utilizar Unicode, códigos de control u otras secuencias de bytes arbitrarias, cookie_spec exige que utilice un esquema de codificación ad-hoc de su elección y sugiera la codificación de URL (como la producida por JavaScript encodeURIComponent
) como una opción razonable.
En términos de estándares reales , ha habido algunos intentos de codificar el comportamiento de las cookies, pero ninguno hasta el momento realmente refleja el mundo real.
RFC 2109 fue un intento de codificar y corregir la cookie_spec original de Netscape. En esta Norma muchos más caracteres especiales no están permitidas, ya que utiliza el RFC 2616 fichas (una -
está siendo permitidas allí), y sólo el valor puede ser especificado en una cita de cadena con otros personajes. Ningún navegador implementó las limitaciones, el manejo especial de cadenas y escapes entre comillas, o las nuevas características de esta especificación.
RFC 2965 fue otra oportunidad, ordenó 2109 y agregó más funciones bajo un esquema de 'cookies de la versión 2'. Nadie implementó nada de eso tampoco. Esta especificación tiene las mismas limitaciones de cadena de tokens y comillas que la versión anterior y es una carga de tonterías.
RFC 6265 es un intento de la era HTML5 para aclarar el desorden histórico. Todavía no coincide con la realidad exactamente, pero es mucho mejor que los intentos anteriores: es al menos un subconjunto adecuado de lo que admiten los navegadores, no presenta ninguna sintaxis que se supone que funciona pero no funciona (como la cadena citada anterior) .
En 6265, el nombre de la cookie todavía se especifica como RFC 2616 token
, lo que significa que puede elegir entre los alfanum más:
!#$%&'*+-.^_`|~
En el valor de la cookie, prohíbe formalmente los caracteres de control (filtrados por los navegadores) y los caracteres no ASCII (implementados de manera inconsistente). Conserva la prohibición de cookie_spec sobre el espacio, la coma y el punto y coma, además de la compatibilidad con cualquier idiota pobre que realmente implementó los RFC anteriores, también prohibió la barra invertida y las comillas, aparte de las comillas que envuelven todo el valor (pero en ese caso las comillas todavía se consideran parte de el valor, no un esquema de codificación). Entonces eso te deja con los alfanum más:
!#$%&'()*+-./:<=>?@[]^_`{|}~
En el mundo real, todavía usamos la cookie_spec original y peor de Netscape, por lo que el código que consume cookies debe estar preparado para encontrar casi cualquier cosa, pero para el código que produce cookies es recomendable quedarse con el subconjunto en RFC 6265.
;
carácter siempre que esté entre comillas dobles? Como tal:Set-Cookie: Name=Va";"lue; Max-Age=3600