Удаление имени пользователя из файла cookie 'wordpress_logged_in'

Я работаю с клиентом с некоторыми строгими мерами безопасности. После проверки безопасности мы получили уведомление о том, что имя пользователя, хранящееся в зарегистрированном cookie, например,

wordpress_logged_in[username]|[hash]

это то, что нужно удалить. Поскольку это неотъемлемая часть системы входа в систему, я не уверен, как ее удалить и все еще поддерживать сеанс.

Краткое введение

После быстрого просмотра исходного кода WP, я думаю, что нашел решение …

WordPress использует две функции для установки и анализа файлов cookie:

  • wp_generate_auth_cookie
  • wp_parse_auth_cookie

Существует фильтр в wp_generate_auth_cookie называемый auth_cookie который вы, вероятно, можете использовать для изменения содержимого cookie, но внутри wp_parse_auth_cookie нет фильтра, но …

Обе эти функции определены в pluggable.php, что означает, что вы можете написать свои собственные реализации для них и перезаписать по умолчанию.

Решение

  1. Напишите свой собственный плагин (давайте назовем его Лучше Auth Cookie)
  2. wp_generate_auth_cookie свои собственные функции wp_generate_auth_cookie и wp_parse_auth_cookie внутри этого плагина.
  3. Активируйте свой плагин.

Вы можете найти мою примерную реализацию (основанную на оригинальных версиях) следующих функций ниже:

 if ( !function_exists('wp_generate_auth_cookie') ) : /** * Generate authentication cookie contents. * * @since 2.5.0 * * @param int $user_id User ID * @param int $expiration Cookie expiration in seconds * @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in * @param string $token User's session token to use for this cookie * @return string Authentication cookie contents. Empty string if user does not exist. */ function wp_generate_auth_cookie( $user_id, $expiration, $scheme = 'auth', $token = '' ) { $user = get_userdata($user_id); if ( ! $user ) { return ''; } if ( ! $token ) { $manager = WP_Session_Tokens::get_instance( $user_id ); $token = $manager->create( $expiration ); } $pass_frag = substr($user->user_pass, 8, 4); $key = wp_hash( $user->user_login . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme ); // If ext/hash is not present, compat.php's hash_hmac() does not support sha256. $algo = function_exists( 'hash' ) ? 'sha256' : 'sha1'; $hash = hash_hmac( $algo, $user->user_login . '|' . $expiration . '|' . $token, $key ); $cookie = $user_id . '|' . $expiration . '|' . $token . '|' . $hash; /** * Filter the authentication cookie. * * @since 2.5.0 * * @param string $cookie Authentication cookie. * @param int $user_id User ID. * @param int $expiration Authentication cookie expiration in seconds. * @param string $scheme Cookie scheme used. Accepts 'auth', 'secure_auth', or 'logged_in'. * @param string $token User's session token used. */ return apply_filters( 'auth_cookie', $cookie, $user_id, $expiration, $scheme, $token ); } endif; if ( !function_exists('wp_parse_auth_cookie') ) : /** * Parse a cookie into its components * * @since 2.7.0 * * @param string $cookie * @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in * @return array Authentication cookie components */ function wp_parse_auth_cookie($cookie = '', $scheme = '') { if ( empty($cookie) ) { switch ($scheme){ case 'auth': $cookie_name = AUTH_COOKIE; break; case 'secure_auth': $cookie_name = SECURE_AUTH_COOKIE; break; case "logged_in": $cookie_name = LOGGED_IN_COOKIE; break; default: if ( is_ssl() ) { $cookie_name = SECURE_AUTH_COOKIE; $scheme = 'secure_auth'; } else { $cookie_name = AUTH_COOKIE; $scheme = 'auth'; } } if ( empty($_COOKIE[$cookie_name]) ) return false; $cookie = $_COOKIE[$cookie_name]; } $cookie_elements = explode('|', $cookie); if ( count( $cookie_elements ) !== 4 ) { return false; } list( $user_id, $expiration, $token, $hmac ) = $cookie_elements; $user = get_userdata($user_id); $username = ( ! $user ) ? '' : $user->user_login; return compact( 'username', 'expiration', 'token', 'hmac', 'scheme' ); } endif; 

Моя версия этих функций заменяет user_login на user_id . Но это должно быть хорошим началом для изменения его на нечто более сложное (например, пользовательский хэш или что-то вроде этого).