cookies - metadescription - cuantos caracteres debe tener una meta description
Caracteres permitidos en las cookies. (9)
este es un rapidito
¿Cuáles son los caracteres permitidos tanto en el nombre como en el valor de la cookie? ¿Son iguales a la URL o algún subconjunto común?
La razón por la que pregunto es que recientemente he detectado algún comportamiento extraño con las cookies en su nombre y me pregunto si es algo específico del navegador o si mi código es defectuoso.
este es un rapidito
Puedes pensar que debería ser, ¡pero en realidad no lo es!
¿Cuáles son los caracteres permitidos tanto en el nombre como en el valor de la cookie?
De acuerdo con el antiguo cookie_spec Netscape, toda la cadena NAME=VALUE
es:
una secuencia de caracteres que excluyen el punto y coma, la coma y el espacio en blanco.
Entonces -
debería funcionar, y parece que está bien en los navegadores que tengo aquí; donde estas teniendo 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=
en la cadena, por lo que en la práctica puede poner un símbolo=
en el VALOR pero no el NOMBRE.
Lo que no se menciona, porque Netscape fue terrible al 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 la tratan como la cookie con el nombre de cadena vacía, es decir,Set-Cookie: foo
es lo mismo queSet-Cookie: =foo
.cuando los navegadores emiten una cookie con un nombre vacío, omiten el signo igual. Entonces
Set-Cookie: =bar
engendraCookie: bar
.Las comas y los espacios en los nombres y valores parecen funcionar, aunque los espacios alrededor del signo igual se recortan
los caracteres de control (
/x00
a/x1F
plus/x7F
) no están permitidos
Lo que no se menciona y los navegadores son totalmente inconsistentes acerca de los caracteres no ASCII (Unicode):
- en Opera y Google Chrome, están codificados para encabezados de cookie con UTF-8;
- en IE, se utiliza la página de códigos predeterminada de la máquina (específica de la configuración regional y nunca UTF-8);
- Firefox (y otros navegadores basados en Mozilla) usan el byte bajo de cada punto de código UTF-16 por su cuenta (por lo que ISO-8859-1 está bien, pero cualquier otra cosa está dañada);
- Safari simplemente se niega a enviar cualquier cookie que contenga caracteres que no sean ASCII.
por lo tanto, en la práctica, no puede utilizar caracteres que no sean ASCII en las cookies. Si desea usar Unicode, códigos de control u otras secuencias de bytes arbitrarias, la cookie_spec exige que use un esquema de codificación ad-hoc de su propia elección y sugiera la codificación de URL (como la que produce el encodeURIComponent
de JavaScript) 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 refleja el mundo real.
RFC 2109 fue un intento de codificar y reparar la cookie_spec original de Netscape. En este estándar, se deshabilitan muchos más caracteres especiales, ya que utiliza tokens RFC 2616 (a
-
todavía se permite allí), y solo se puede especificar el valor en una cadena entrecomillada con otros caracteres. Ningún navegador implementó las limitaciones, el manejo especial de las cadenas citadas y el escape, o las nuevas características en esta especificación.El RFC 2965 fue otra opción, ordenando el 2109 y agregando más características bajo un esquema de ''versión 2 cookies''. Nadie nunca implementó nada de eso tampoco. Esta especificación tiene las mismas limitaciones de token 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 exactamente con la realidad, pero es mucho mejor que los intentos anteriores: es al menos un subconjunto adecuado de lo que admiten los navegadores, no introduciendo ninguna sintaxis que se supone que funciona pero que no (como la cadena de comillas anterior) .
En 6265, el nombre de la cookie aún se especifica como un token
RFC 2616, lo que significa que puede elegir entre los alfanumeros 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). Retiene la prohibición de cookie_spec sobre el espacio, la coma y el punto y coma, más la compatibilidad con los idiotas pobres que realmente implementaron los RFC anteriores. el valor, no un esquema de codificación). Así que eso te deja con los alfanumos más:
!#$%&''()*+-./:<=>?@[]^_`{|}~
En el mundo real, todavía estamos utilizando el 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 seguir con el subconjunto en RFC 6265.
Aquí está, en tan pocas palabras como sea posible . Centrarse en los personajes que no necesitan escapar:
Para galletas:
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!#$%&''()*+-./:<>?@[]^_`{|}~
Para urls
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789.-_~!$&''()*+,;=:@
Para cookies y urls (intersección)
abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!$&''()*+-.:@_~
Así es como respondes.
Tenga en cuenta que para las cookies, el = se ha eliminado porque generalmente se utiliza para establecer el valor de la cookie.
Para las urls se guardó el =. La intersección es, obviamente, sin.
var chars = "abdefghijklmnqrstuvxyz"; chars += chars.toUpperCase() + "0123456789" + "!$&''()*+-.:@_~";
Resulta que el escape sigue ocurriendo y ocurre un suceso inesperado, especialmente en un entorno de cookies de Java donde la cookie se envuelve con comillas dobles si encuentra los últimos caracteres.
Entonces, para estar seguro, solo use A-Za-z1-9. Eso es lo que voy a hacer.
Creo que generalmente es específico del navegador. Para estar en el lado seguro, base64 codifica un objeto JSON y almacena todo en eso. De esa manera solo tienes que decodificarlo y analizar el JSON. Todos los caracteres utilizados en base64 deberían jugar bien con la mayoría, si no con todos los navegadores.
En ASP.Net puede usar System.Web.HttpUtility
para codificar de forma segura el valor de la cookie antes de escribir en la cookie y volver a convertirla a su forma original al leerla.
// Encode
HttpUtility.UrlEncode(cookieData);
// Decode
HttpUtility.UrlDecode(encodedCookieData);
Esto detendrá los símbolos y signos de división que dividen un valor en un grupo de pares de nombre / valor a medida que se escribe en una cookie.
Existen 2 versiones de especificaciones de cookies.
1. Cookies de la versión 0 también conocidas como cookies de Netscape,
2. Versión 1 aka RFC 2965 cookies
En la versión 0, el nombre y la parte de valor de las cookies son secuencias de caracteres, excluyendo el punto y coma, la coma, el signo de igual y el espacio en blanco, si no se utilizan con comillas dobles
La versión 1 es mucho más complicada, puedes consultarla aquí.
En esta versión, las especificaciones para la parte del valor del nombre son casi iguales, excepto que el nombre no puede comenzar con el signo $
Hace años, MSIE 5 o 5.5 (y probablemente ambos) tuvieron algún problema grave con un "-" en el bloque HTML, si puedes creerlo. Aunque no está directamente relacionado, desde entonces hemos almacenado un hash MD5 (que solo contiene letras y números) en la cookie para buscar todo lo demás en la base de datos del lado del servidor.
Lo siento, no pude agregar a la respuesta aceptada, pero me encontré con otro problema interesante con IE y Edge.
Las cookies que tienen nombres con más de 1 período parecen ser eliminadas silenciosamente. Así que esto funciona:
cookie_name_a = valuea
mientras esto se caiga
cookie.name.a = valuea
Más reciente rfc6265 publicado en abril de 2011:
cookie-header = "Cookie:" OWS cookie-string OWS
cookie-string = cookie-pair *( ";" SP cookie-pair )
cookie-pair = cookie-name "=" cookie-value
cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
; US-ASCII characters excluding CTLs,
; whitespace DQUOTE, comma, semicolon,
; and backslash
Si busca en @bobince responder, verá que la restricción más nueva es más estricta.
no se puede poner ";" en el campo de valor de una cookie, el nombre que se establecerá es la cadena hasta que aparezca ";" en la mayoría de los navegadores ...