web-dev-qa-db-fra.com

Supprimer le nom d'utilisateur du cookie 'wordpress_logged_in'

Je travaille avec un client avec des mesures de sécurité strictes. Après un examen de sécurité en cours, nous avons été informés que le nom d'utilisateur stocké dans le cookie de connexion, par exemple.

wordpress_logged_in[username]|[hash]

est quelque chose qui doit être enlevé. Étant donné que cela fait partie intégrante du système de connexion, je ne sais pas comment le supprimer tout en maintenant la session.

9
phatskat

Courte introduction

Après avoir jeté un coup d’œil rapide dans le code source de WP, je pense avoir trouvé la solution ...

WordPress utilise deux fonctions pour définir et analyser les cookies d'authentification:

  • wp_generate_auth_cookie
  • wp_parse_auth_cookie

Il existe un filtre dans wp_generate_auth_cookie appelé auth_cookie que vous pourriez probablement utiliser pour modifier le contenu du cookie, mais il n'y a pas de filtre dans wp_parse_auth_cookie, mais ...

Ces deux fonctions sont définies dans pluggable.php, ce qui signifie que vous pouvez écrire vos propres implémentations pour elles et écraser celles par défaut.

Solution

  1. Ecrivez votre propre plugin (appelons-le Better Auth Cookie)
  2. Implémentez vos propres fonctions wp_generate_auth_cookie et wp_parse_auth_cookie dans ce plugin.
  3. Activez votre plugin.

Vous pouvez trouver mon exemple d'implémentation (basé fortement sur les versions originales) de ces fonctions ci-dessous:

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;

Ma version de ces fonctions remplace user_login par user_id. Mais cela devrait être un bon début pour le changer en quelque chose d'encore plus complexe (c'est-à-dire un hachage spécifique à l'utilisateur, ou quelque chose comme ça).

10
Krzysiek Dróżdż