WP_Http_Cookie destruye el valor de las cookies a través de urldecode ()

4

Fondo : trabajando en un Widget que usa una API remota que usa wp_remote_post para iniciar sesión en el servicio, una vez que haya iniciado sesión, almacene las cookies recibidas para la segunda solicitud para consultar datos con wp_remote_get .

Problema : las cookies de la primera solicitud se almacenan en la respuesta como objetos WP_Http_Cookie y sus valores se ejecutan en urldecode como se ve en class-http.php . Una de las cookies tiene un valor original de l0xl4+7abTT2St+1UVA gracias al urldecode este valor se convierte en l0xl4 7abTT2St 1UVA en el objeto WP_Http_Cookie y, por lo tanto, no es el mismo. Esto hace que el objeto de cookie quede inutilizable como está para la segunda solicitud.

Solución : se me ocurrió una pequeña solución para este problema:

// Replace space with + from cookie value
// because WP_Http_Cookie does urldecode( value )
$response['cookies'][0]->value = str_replace(' ', '+', $response['cookies'][0]->value);

// Set cookies for the second request
$this->cookies = $response['cookies'];

Pregunta : ¿Alguien sabe por qué hay un urldecode en lugar de un filtro en WP_Http_Cookie? ¿Debo presentar un problema de traciado?

    
pregunta Silvan Hagen 18.10.2012 - 04:07

2 respuestas

1

La URL de AFAIK que codifica el valor de la cookie sigue siendo una especie de estándar de facto, es una reliquia antigua basada en el antiguo y feo Netscape especificaciones de cookies , que básicamente dice que los puntos y coma, comas y espacios en blanco no están permitidos, y deben estar codificados, por ejemplo, mediante la codificación de URL. Tampoco requiere enocding, ni fuerza el uso o la codificación de URL, pero así es como se implementó.

Entonces, al pasar una cadena al constructor, WP_Http_Cookie asume que los datos provienen de una cookie y, por lo tanto, el valor de la cookie está codificado y debe decodificarse. Personalmente, creo que no debería hacer eso, y dejar que el desarrollador maneje los valores según sea necesario, como se menciona en Ticket 19922 .

Sin embargo, al enviar una solicitud, se invoca WP_Http_Cookie::getHeaderValue , y aquí es donde hay un filtro disponible , wp_http_cookie_value . Suponiendo que el valor de la cookie que está recibiendo está codificado en la URL, podría volver a codificarlo utilizando este filtro.

function wp_http_cookie_value_filter($value, $name)
{
    return urlencode($value);
}
add_filter('wp_http_cookie_value', 'wp_http_cookie_value_filter', 10, 2);

Sin embargo, esto, por supuesto, se aplicaría a todas las solicitudes, por lo que siempre que no pueda estar seguro de que usted es el único que usa este filtro y / o realiza solicitudes que contienen cookies, es probable que sea una mala idea.

Tal vez si su cookie tiene un nombre único, podría usarlo para filtrar solo sus valores de cookie específicos:

function wp_http_cookie_value_filter($value, $name)
{
    if($name === 'my_very_special_cookie')
    {
        return urlencode($value);
    }
    return $value;
}
add_filter('wp_http_cookie_value', 'wp_http_cookie_value_filter', 10, 2);

Aparte de eso, probablemente esté mejor usando su solución alternativa, es decir, manipule el valor de la cookie solo para sus solicitudes específicas.

    
respondido por el ndm 18.10.2012 - 12:50
0

Prácticamente todas las implementaciones de cookies están codificadas en URL. Si está enviando una cookie cruda, sin codificación, entonces necesita controlar ambos extremos de la tubería. Ya que no lo hace, urlencierre sus cookies.

    
respondido por el Otto 18.10.2012 - 16:08

Lea otras preguntas en las etiquetas