Guía definitiva de valores de cookie válidos.

Sé que hay otras preguntas pero parecen tener respuestas que son suposiciones en lugar de ser definitivas.

Mi entendimiento limitado es que los valores de las cookies son:

  • los puntos y coma ya se utilizan para separar los atributos de las cookies dentro de una sola cookie.
  • Los signos iguales se utilizan para separar los nombres y valores de las cookies.
  • Los dos puntos se utilizan para separar varias cookies dentro de un encabezado.

¿Hay otros personajes “especiales”?

Algunos otros q / a sugieren que una base64 codifica el valor, pero esto, por supuesto, puede incluir signos de igual que, por supuesto, no son válidos.

También he visto algunas sugerencias de que los valores pueden ser citados; sin embargo, esto conduce a otras preguntas.

  • ¿Los caracteres especiales necesitan ser citados?
  • Los valores citados son compatibles con los mecanismos habituales de escape de barra invertida.

RFC He leído algunos RFC, incluidos algunos de los muchos RFCS de cookies, pero todavía no estoy seguro, ya que hay una referencia cruzada a otro RFC, etc., sin una explicación o muestra simple y definitiva que “responde” a mi consulta.

Esperemos que nadie diga que lea el RFC porque la pregunta es ¿qué RFC …?

Creo que también he leído que los diferentes navegadores tienen reglas ligeramente diferentes, así que espero que tenga en cuenta esto en sus respuestas si esto es importante.

El último RFC es 6265 , y establece que los RFC de cookies anteriores están obsoletos.

Esto es lo que dicen las reglas de syntax en el RFC:

  cookie-pair = cookie-name "=" cookie-value cookie-name = token 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 

Así:

  • Los caracteres especiales son caracteres de espacio en blanco, comillas dobles, coma, punto y coma y barra diagonal inversa. Igual no es un personaje especial.

  • Los caracteres especiales no se pueden utilizar en absoluto, con la excepción de que las comillas dobles pueden rodear el valor.

  • Los caracteres especiales no pueden ser citados.

  • La barra invertida no actúa como un escape.

De ello se deduce que se puede usar la encoding base-64, porque igual no es especial.

Finalmente, por lo que puedo decir, los valores de las cookies de RFC 6265 se definen para que funcionen con cualquier navegador que implemente cualquiera de las RFC de cookies. Sin embargo, si intentó usar valores de cookies que no cumplen con el RFC 6265 (pero se puede decir que sí cumplen con los RFC anteriores), es posible que el comportamiento de las cookies varíe según los distintos navegadores.

En resumen, cumpla con la letra RFC 6265 y debería estar bien.

Se mencionó la base64, por lo que aquí hay una solución de cookies cocinadas que utiliza cookies. Las funciones son sobre una versión modificada de base64, solo usan [0-9a-zA-Z_-]

Puede usarlo tanto para el nombre como para el valor de las cookies, es seguro binario, como dicen.

El gzdeflate / gzinflate recupera el 30% o más del espacio creado por base64, no pudo resistir su uso. Tenga en cuenta que php gzdeflate / gzinflate solo está disponible en la mayoría de las empresas de alojamiento, no en todas.

 //write setcookie ( 'mycookie' ,code_base64_FROM_bytes_cookiesafe(gzdeflate($mystring)) ,time()+365*24*3600 ); //read $mystring=gzinflate(code_bytes_FROM_base64_cookiesafe($_COOKIE['mycookie'])); function code_base64_FROM_bytes_cookiesafe($bytes) { //safe for name and value part [0-9a-zA-Z_-] return strtr(base64_encode($bytes),Array ( '/'=>'_', '+'=>'-', '='=>'', ' '=>'', "\n"=>'', "\r"=>'', )); } function code_bytes_FROM_base64_cookiesafe($enc) { $enc=str_pad($enc,strlen($enc)%4,'=',STR_PAD_RIGHT);//add back = $enc=chunk_split($enc);//inserts \r\n every 76 chars return base64_decode(strtr($enc,Array ( '_'=>'/', '-'=>'+', ))); }