Http-файл cookie WP уничтожает значение файла cookie с помощью urldecode()


Предыстория: Работа над виджетом, который использует удаленный API, используя wp_remote_post для входа в службу, после входа в систему сохраняет файлы cookie, полученные для второго запроса, для запроса данных с помощью wp_remote_get.

Проблема: Файлы cookie из первого запроса сохраняются в ответе как объекты WP_Http_Cookie, и их значения передаются через urldecode, как показано в class-http.php . Один из файлов cookie имеет исходное значение l0xl4+7abTT2St+1UVA благодаря urldecode это значение становится l0xl4 7abTT2St 1UVA в объекте WP_Http_Cookie и, следовательно, не совпадает. Это делает объект cookie непригодным для использования, как и для второго запроса.

Обходной путь: Я придумал неприятный маленький обходной путь для этой проблемы:

// 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'];

Вопрос: Кто-нибудь знает, почему в WP_Http_Cookie вместо фильтра есть urldecode? Должен ли я подать заявление о проблеме с трафиком?

Author: Silvan Hagen, 2012-10-18

2 answers

Кодировка URL AFAIK значение файла cookie по-прежнему является своего рода стандартом де-факто, это древний реликт, основанный на старых, уродливых спецификациях файлов cookie Netscape, в которых в основном говорится, что точки с запятой, запятые и пробелы запрещены и должны быть закодированы, например, с использованием кодировки URL. Это не требует ни кодирования, ни принудительного использования или кодирования URL, но именно так это было реализовано.

Поэтому при передаче строки конструктору WP_Http_Cookie предполагается, что данные это из файла cookie, и поэтому значение файла cookie закодировано и должно быть декодировано. Лично я думаю, что этого не следует делать, и предоставьте разработчику обрабатывать значения по мере необходимости, как указано в Тикете 19922.

Однако при отправке запроса вызывается WP_Http_Cookie::getHeaderValue, и именно здесь доступен фильтр, wp_http_cookie_value. Предполагая, что значение файла cookie, которое вы получаете , является закодированным URL-адресом , вы можете перекодировать его с помощью этого фильтра.

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

Однако это, конечно, относится ко всем запросам, поэтому, пока вы не можете с уверенностью сказать, что вы единственный, кто использует этот фильтр и/или делает запросы, содержащие файлы cookie, это, вероятно, довольно плохая идея.

Возможно, если у вашего файла cookie очень уникальное имя, вы могли бы использовать его для фильтрации только ваших конкретных значений файлов cookie:

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);

Кроме этого, вам, вероятно, лучше использовать обходной путь, т.Е. Изменять значение файла cookie только для ваших конкретных запросов.

 1
Author: ndm, 2012-10-19 05:57:18

Практически все реализации файлов cookie имеют URL-кодировку. Если вы отправляете необработанный файл cookie без кодирования, вам нужно контролировать оба конца конвейера. Поскольку вы этого не делаете, URL-кодируйте свои файлы cookie.

 0
Author: Otto, 2012-10-18 14:08:50