'Wordpress_ebox_in' çerezinden kullanıcı adını kaldırma


9

Bazı sıkı güvenlik önlemleri olan bir müşteriyle çalışıyorum. Güvenlik incelemesinden geçtikten sonra, giriş yapmış çerezde saklanan kullanıcı adının, ör.

wordpress_logged_in[username]|[hash]

kaldırılması gereken bir şeydir. Bu, giriş sisteminin ayrılmaz bir parçası olduğundan, nasıl kaldırılacağından ve oturumu nasıl sürdürdüğünden emin değilim.

Yanıtlar:


10

Kısa tanıtım

WP kaynak koduna hızlı bir şekilde baktıktan sonra, çözüm bulduğumu düşünüyorum ...

WordPress, kimlik doğrulama çerezlerini ayarlamak ve ayrıştırmak için iki işlev kullanır:

  • wp_generate_auth_cookie
  • wp_parse_auth_cookie

Bir filtre vardır wp_generate_auth_cookiedenir auth_cookiemuhtemelen çerez içeriğini değiştirmek için kullanabilirsiniz hangi, ancak hiçbir filtre içeride yoktur wp_parse_auth_cookie, ama ...

Bu işlevlerin her ikisi de pluggable.php dosyasında tanımlanır, yani bunlar için kendi uygulamalarınızı yazabilir ve varsayılan işlevlerin üzerine yazabilirsiniz.

Çözüm

  1. Kendi eklentinizi yazın (hadi buna Better Auth Cookie diyelim)
  2. Bu eklentinin içine kendiniz wp_generate_auth_cookieve wp_parse_auth_cookieişlevlerinizi uygulayın .
  3. Eklentinizi etkinleştirin.

Bu işlevlerin örnek uygulamasını (orijinal sürümlere dayanarak) aşağıda bulabilirsiniz:

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;

Bu işlevlerin My sürümü değiştirir user_loginile user_id. Ancak, daha da karmaşık bir şeye (yani kullanıcıya özgü karma veya bunun gibi bir şeye) değiştirmek için iyi bir başlangıç ​​olmalıdır.


Güzel cevap. Gerçi dönemimin son gününe kadar bekleyeceğim. :)
Anonim Platypus

Bunu kabul edeceğim, ancak artık bu çözüme ihtiyaç duymadığım için test etmeyeceğim. Sistemin kökünü kazmak için çok çaba sarf
ettiniz

1
Bu yaklaşım iyi bir yaklaşım olsa da, artık koruma sağlamadığının farkında olmalısınız. Kullanıcı adı, kullanıcı kimliği için değiştirilir, ancak kullanıcı adı, example.com?author=123gibi bir URL'ye kurallı bir yönlendirme gerçekleştiren bir istekle kullanıcı kimliğinden alınabilir example.com/author/john.
John Blackbourn

1
@john dikkatlice okuyunuz lütfen. Bahsettiğim, userID yerine çerezlerde rastgele bir karma depolamak çok daha güvenli.
Krzysiek Dróżdż
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.