'Wordpress_logged_in' कुकी से उपयोगकर्ता नाम हटाना


9

मैं एक ग्राहक के साथ कुछ सख्त सुरक्षा उपायों के साथ काम कर रहा हूं। सुरक्षा समीक्षा से गुजरने के बाद, हमें सूचित किया गया कि उपयोगकर्ता नाम कुकी में लॉग इन किया गया है, जैसे

wordpress_logged_in[username]|[hash]

कुछ ऐसा है जिसे हटाना होगा। चूंकि यह लॉगिन सिस्टम का एक अभिन्न हिस्सा है, मुझे यकीन नहीं है कि इसे कैसे हटाया जाए और अभी भी सत्र बनाए रखा जाए।

जवाबों:


10

संक्षिप्त परिचय

WP स्रोत कोड के अंदर त्वरित रूप से देखने के बाद, मुझे लगता है कि मुझे समाधान मिल गया है ...

वर्डप्रेस कुकीज़ को सेट और पार्स करने के लिए दो कार्यों का उपयोग करता है:

  • wp_generate_auth_cookie
  • wp_parse_auth_cookie

इसमें एक फिल्टर है wp_generate_auth_cookieजिसे auth_cookieआप कुकी की सामग्री को बदलने के लिए उपयोग कर सकते हैं, लेकिन अंदर कोई फिल्टर नहीं है wp_parse_auth_cookie, लेकिन ...

इन दोनों कार्यों को pluggable.php में परिभाषित किया गया है, जिसका अर्थ है, कि आप उनके लिए अपने स्वयं के कार्यान्वयन लिख सकते हैं और डिफ़ॉल्ट को अधिलेखित कर सकते हैं।

समाधान

  1. अपना खुद का प्लगइन लिखें (चलो इसे बेहतर प्रामाणिक कुकी कहते हैं)
  2. इस प्लगइन के अंदर अपने खुद के 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। लेकिन इसे और भी अधिक जटिल (यानी उपयोगकर्ता विशिष्ट हैश, या ऐसा कुछ) के लिए इसे बदलने के लिए एक अच्छी शुरुआत होनी चाहिए।


अच्छा उत्तर। हालांकि मैं अपने इनाम की अवधि के अंतिम दिन तक प्रतीक्षा करूंगा। :)
बेनामी प्लैटिपस

मैं इसे स्वीकार करने जा रहा हूं, हालांकि मैं इसका परीक्षण नहीं करूंगा क्योंकि मुझे अब इस समाधान की आवश्यकता नहीं है। आपने स्पष्ट रूप से सिस्टम की जड़ को खोदने में बहुत प्रयास किए, मैं प्रयास की सराहना करता हूं :)
phatskat

1
जबकि यह दृष्टिकोण एक अच्छा है, आपको पता होना चाहिए कि यह अधिक सुरक्षा प्रदान नहीं करता है। उपयोगकर्ता आईडी के लिए उपयोगकर्ता नाम को प्रतिस्थापित किया जाता है, लेकिन उपयोगकर्ता आईडी से अनुरोध के माध्यम से उपयोगकर्ता आईडी से प्राप्त किया जा सकता है example.com?author=123, जो URL जैसे कि एक कैनोनिकल रीडायरेक्ट करता है example.com/author/john
जॉन ब्लैकबोरन

1
@ जॉन ध्यान से पढ़ें। मैंने उल्लेख किया है, कि आप आसानी से इसे और अधिक सुरक्षित बना सकते हैं उपयोगकर्ता के बजाय कुकी में कुछ यादृच्छिक हैश भंडारण।
Krzysiek Dróżdż
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.