'ওয়ার্ডপ্রেস_লগড_ইন' কুকি থেকে ব্যবহারকারীর নাম মুছে ফেলা হচ্ছে


9

আমি কড়া ক্লায়েন্টের সাথে কিছু কঠোর সুরক্ষা ব্যবস্থা নিয়ে কাজ করছি। সুরক্ষা পর্যালোচনা করার পরে, আমাদের জানিয়ে দেওয়া হয়েছিল যে লগ ইন কুকিতে থাকা ব্যবহারকারীর নাম, যেমন

wordpress_logged_in[username]|[hash]

এমন কিছু যা অপসারণ করতে হবে। যেহেতু এটি লগইন সিস্টেমের একটি অবিচ্ছেদ্য অঙ্গ, তাই আমি কীভাবে এটি অপসারণ করব এবং এখনও সেশনটি বজায় রাখব তা নিশ্চিত নই।

উত্তর:


10

সংক্ষিপ্ত ভূমিকা

ডাব্লুপি উত্স কোডের অভ্যন্তরে তাত্ক্ষণিকভাবে দেখার পরে, আমি মনে করি যে আমি সমাধানটি পেয়েছি ...

ওয়ার্ডপ্রেস প্রমাণীকরণ কুকিজ সেট এবং পার্স করতে দুটি ফাংশন ব্যবহার করে:

  • wp_generate_auth_cookie
  • wp_parse_auth_cookie

wp_generate_auth_cookieনামে একটি ফিল্টার রয়েছে auth_cookieযা আপনি সম্ভবত কুকির সামগ্রী পরিবর্তন করতে ব্যবহার করতে পারেন তবে ভিতরে কোনও ফিল্টার নেই wp_parse_auth_cookie, তবে ...

এই উভয় ফাংশনটি প্লাগেবল.এফপিতে সংজ্ঞায়িত করা হয়েছে যার অর্থ আপনি তাদের জন্য নিজের প্রয়োগগুলি লিখতে এবং ডিফল্ট ডিফল্টগুলি ওভাররাইট করতে পারেন।

সমাধান

  1. আপনার নিজের প্লাগইন লিখুন (আসুন এটি আরও ভাল আথ কুকি)
  2. এই প্লাগইনটির ভিতরে আপনার নিজের wp_generate_auth_cookieএবং wp_parse_auth_cookieফাংশনগুলি প্রয়োগ করুন ।
  3. আপনার প্লাগইনটি সক্রিয় করুন।

আপনি নীচের এই ফাংশনগুলির আমার নমুনা বাস্তবায়ন (মূল সংস্করণগুলির উপর দৃ strongly় ভিত্তিতে) সন্ধান করতে পারেন:

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। তবে এটিকে আরও জটিল কিছুতে (যেমন ব্যবহারকারীর নির্দিষ্ট হ্যাশ, বা এই জাতীয় কিছু) এ পরিবর্তনের জন্য এটি একটি ভাল শুরু হওয়া উচিত।


চমৎকার উত্তর. যদিও আমি আমার অনুগ্রহকালীন সময়ের শেষ দিন পর্যন্ত অপেক্ষা করব। :)
বেনামে প্লাটিপাস

আমি এটি গ্রহণ করতে যাচ্ছি, যদিও আমি এটি পরীক্ষা করব না কারণ আমার আর এই সমাধানের প্রয়োজন নেই। আপনি সিস্টেমের মূলকে খনন করতে স্পষ্টভাবে প্রচুর প্রচেষ্টা করেছিলেন, আমি এই প্রচেষ্টাটির প্রশংসা করি :)
ফটসকাত

1
যদিও এই পদ্ধতির পক্ষে ভাল, আপনার সচেতন হওয়া উচিত যে এটি আর কোনও সুরক্ষা দেয় না। ব্যবহারকারীর নামটি ব্যবহারকারীর আইডি-র জন্য প্রতিস্থাপিত হয়েছে, তবে ব্যবহারকারীর নামটি ব্যবহারকারীর আইডি থেকে একটি অনুরোধের মাধ্যমে অর্জন করা যেতে পারে example.com?author=123, যা কোনও ইউআরএলটিতে নৈমিত্তিক পুনর্নির্দেশ সম্পাদন করে example.com/author/john
জন ব্ল্যাকবর্ন

1
@ জন মনোযোগ সহকারে পড়ুন। আমি উল্লেখ করেছি, আপনি সহজেই এটিকে ইউএসআইডি এর পরিবর্তে কুকিতে কিছু র্যান্ডম হ্যাশ সংরক্ষণ করে অনেক বেশি সুরক্ষিত করতে পারেন।
ক্রিজিসিক দ্রাদ্দে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.