sesiones manejo etiquetas ejemplos php cookies setcookie

manejo - ¿Por qué PHP reemplaza las ventajas con espacios en $_COOKIE?



manejo de sesiones php (3)

En primer lugar, PHP siempre se ejecutará antes de JavaScript: es el lado del servidor en lugar del lado del cliente, por lo que la cookie que configuró con JavaScript no estará realmente disponible para PHP hasta que actualice la página (de ahí ese problema).

Siguiente JavaScript tiene diferentes formas de codificar las cadenas; Solo uno trabajará con PHP automáticamente.

Asi que:

document.cookie = "testuser=" + "Joe|123|[email protected]"; // Joe|123|my [email protected] (when decoded by PHP) document.cookie = "testuser=" + escape("Joe|123|[email protected]"); // Joe|123|my [email protected] (when decoded by PHP) document.cookie = "testuser=" + encodeURI("Joe|123|[email protected]"); // Joe|123|my [email protected] (when decoded by PHP) document.cookie = "testuser=" + encodeURIComponent("Joe|123|[email protected]"); // Joe|123|[email protected]

Por lo tanto, intente esto por el bien de una prueba (recuerde que deberá actualizar la página para ver el valor de la cookie):

<html> <head> <title>Cookie Juggling</title> <script type="text/javascript"> document.cookie = "testuser=" + encodeURIComponent("Joe|123|[email protected]"); </script> </head> <body> <div><?php echo !empty($_COOKIE[''testuser'']) ? $_COOKIE[''testuser''] : "Cookie not set yet"; ?></div> </body> </html>

Por lo tanto, desde mi entendimiento de PHP y las cookies, si uso la función setcookie() , obtengo una cookie que se codifica automáticamente como URL. Y cuando vaya a la matriz $_COOKIE , debería recuperar la cookie, automáticamente se descifra url. El problema es que parece estar decodificando la cookie dos veces cuando miro en $_COOKIE .

Digamos que tengo una cookie cuyo valor es "Nombre | ID | Correo electrónico", por ejemplo:

Joe|123|[email protected]

Esto sería codificado como:

Joe% 7C123% 7Cmy% 2Bemail% 40somewhere.com

Observe que el signo más está codificado, por lo que, en teoría, debería recuperarlo si lo decodifico. Como esto se hace automáticamente en $_COOKIE , debo recuperar lo que comencé. Pero en cambio, estoy volviendo:

Joe | 123 | mi [email protected]

Fíjate en el espacio donde solía estar el plus. Esto es lo que esperaría si ejecutara un urldecode() adicional en la cookie. Pero no lo soy, así que no tengo idea de por qué obtendría un espacio en lugar de un plus.

Otro giro interesante. Una actualización en la página parece producir el resultado correcto. ¿Alguna idea de por qué se está comportando así?

Para su información, para establecer la cookie inicial, uso javascript y escape() la secuencia de comandos para producir la cadena codificada. ¿Podría ser este un problema de hand-off entre javascript y PHP?

Los pensamientos serían apreciados.


Si no desea codificar automáticamente su cookie, puede usar la función setrawcookie () igual que setcookie ()
pero con esta función no puede usar estos caracteres dentro del valor: (,; / t / r / n / 013 / 014):

setrawcookie("NAME","Joe|123|[email protected]");

Salida en recurso - Cookies en Chrome:

Joe|123|[email protected]

cuando haces eco en $ _COOKIE [''NAME'']

Joe|123|my [email protected]

Pero: lo pruebo en php 5.3.13

setcookie("NAME","Joe|123|[email protected]");

Salida en recurso - Cookies en Chrome:

Joe%7C123%7Cmy%2Bemail%40somewhere.com

cuando echo $ _COOKIE [''NAME'']:

Joe|123|[email protected]

ahora: si todavía tienes problemas con esto, puedes usar la función setcookie() y luego usar el rawurldecode () para decodificarla:

echo rawurldecode($_COOKIE[''NAME''])


Vale la pena señalar que tanto "% 20" como "+" son codificaciones válidas de un carácter de espacio. Por el artículo de Wikipedia sobre codificación de URL (énfasis agregado):

Cuando se envían los datos que se han ingresado en formularios HTML, los nombres y valores de los campos de formulario se codifican y envían al servidor en un mensaje de solicitud HTTP utilizando el método GET o POST, o, históricamente, por correo electrónico. La codificación utilizada de forma predeterminada se basa en una versión muy temprana de las reglas generales de codificación de porcentaje de URI, con una serie de modificaciones, como la normalización de nueva línea y la sustitución de espacios con "+" en lugar de "% 20" . El tipo MIME de datos codificados de esta manera es application / x-www-form-urlencoded, y actualmente está definido (aún de manera muy obsoleta) en las especificaciones de HTML y XForms.

Más específicamente relacionado con PHP y JavaScript, vea la respuesta principal sobre esta pregunta:

¿Cuándo codificar el espacio a más (+) o% 20?