امنیت وردپرس: مراقب فیلد user_nicename باشید!

اگر با دیتابیس وردپرس آشنا باشید می دانید که اطلاعات کلیه کاربران در جدول wp_users ذخیره می شود، در جدول فوق نام کاربری(Username) در فیلد user_login و نامک یا Slug مربوط به نویسنده که برای تولید پیوند یکتا(Permalink) استفاده می شود در فیلد user_nicename قرار می گیرد.

قابل توضیح نیست که نام کاربری ممکن است توسط خود کاربر یا مدیر وب سایت ایجاد شود، اما مقدار فیلد user_nicename به صورت خودکار و یک کپی شسته و رفته(Sanitized) از فیلد user_login خواهد بود.

برای بررسی این موضوع کافی است یک نام کاربری فرضی ایجاد کرده و جدول wp_users را مشاهده کنید.

فیلد user_login و user_nicename در وردپرس

 

حالا اگر در لیست کاربران بر روی گزینه “نمایش” کاربر مربوطه کلیک کنید وردپرس به صورت پیش فرض پیوند یکتا کاربر را به صورت زیر و با استفاه از فیلد user_nicename نمایش می دهد.

لیست کاربران وردپرس

حتی افزونه ای مانند wpDiscuz از user_nicename برای ایجاد لینک ثبت کننده دیدگاه استفاده می کند.

چرا فیلد user_nicename خطرناک است؟

اگر این فیلد را به حال خود رها کنید عملا ۵۰ درصد مسیر نفوذ به وب سایت تان را هموار کرده اید، چرا که نام کاربری به راحتی قابل شناسایی خواهد بود و فرد مهاجم فقط بر روی بدست آوردن کلمه عبور متمرکز خواهد شد(کافی است رمز ساده ای داشته باشید).

تصویر زیر مربوط به افزونه Wordfence است که نشان می دهد از نام های کاربری مختلف برای نفوذ به بخش مدیریت وردپرس استفاده شده است، اگر افزونه فوق یا Limit Login Attempts را نصب کرده باشید به سرعت متوجه خواهید شد که آیا با نام کاربری واقعی تان اقدامی در جهت نفوذ صورت پذیرفته است یا خیر.

افزونه امنیتی wordfence

راه حل چیست؟

متاسفانه امکان تغییر فیلد user_nicename از طریق داشبورد مدیریتی وردپرس وجود ندارد و باید به صورت زیر عمل کنید:

نصب افزونه

راحترین روش استفاده از افزونه Edit Author Slug است، پس از نصب و فعال سازی پلاگین فوق کافی است از لیست کاربران گزینه “ویرایش” کاربر را انتخاب کرده و مطابق تصویر زیر عمل نمائید.

افزونه Edit Author Slug

اجرای اسکریپت از طریق phpMyadmin

در صورتی که دستی بر آتش دارید بهتر است از اسکریپت زیر استفاده نمائید و افزونه اضافی نصب نکنید، در کوئری های زیر فرض کردیم عنوان جداول وردپرس با پیشوند “_wp” َشروع شده است.

UPDATE wp_users SET user_nicename = 'f_farzinian' WHERE user_login = 'farzin_wp';

 

یا می توانید همه کاربران را به یکباره با مقدار فیلد display_name آپیدیت نمائید.

UPDATE wp_users
SET user_nicename = LOWER( REPLACE( display_name, ' ' , '-') )
WHERE user_login = user_nicename;

 

نکته مهم در رابطه با فیلد display_name

اگر در هنگام ایجاد یک کاربر جدید نام و نام خانوادگی او مشخص نشود مقدار فیلد display_name با مقدار نام کاربری پر خواهد شد، به عبارت ساده تر فیلدهای user_nicename و display_name هر دو با نام کاربری ست می شوند.

برای رفع این مشکل اسکریپت زیر را در فایل functions.php قرار دهید.

function sanitize_user_login_info( $user_id )
{

    global $wpdb;
    $user_info = get_userdata( $user_id );

    if ( $user_info->display_name === $user_info->user_login ) {

        $random_unique = substr( sha1(time()), 0, 8 );
        $wpdb->update( $wpdb->users,
            array( 'user_nicename' => $random_unique, 'display_name' => $random_unique ),
            array( 'ID' => $user_id )) ;

    } elseif ( $user_info->user_nicename === $user_info->user_login ) {

        $display_name = preg_replace( '/\s+/', '-', $user_info->display_name );

        $wpdb->update( $wpdb->users,
            array( 'user_nicename' => $display_name ),
            array( 'ID' => $user_id ) );
    }
}

add_action( 'user_register', 'sanitize_user_login_info', 10, 1 );

 

در کدهای بالا این موارد بررسی شده است:

  1. اگر مقدار فیلد display_name مشابه user_login باشد برای امنیت بیشتر مقدار فیلد display_name و user_nicename با یک مقدار تصادفی و منحصربفرد پر خواهد شد.(مثلا ۴۴ac2472)
  2. اگر مقدار فیلد user_nicename مشابه user_login باشد مقدار فیلد display_name در فیلد user_nicename قرار می گیرد،(مثلا مجید-حسینی)
  3. اسکریپت فوق فقط در هنگام ایجاد یک کاربر جدید اجرا می شود.

خروجی نهایی در تصویر زیر نشان داده شده است.

فیلد display_name در وردپرس

فیلد user_nicename و سئو

ممکن است پیوند یکتا مربوط به نویسندگان در موتورهای جستجو ایندکس شده باشد، پس از آپدیت فیلد user_nicename حتما آدرس های قدیمی را به جدید ریدایرکت کنید یا آنها را با ابزار Google Search Console حذف نمائید، در غیر اینصورت بازدیدکنندگان تان با خطای ۴۰۴ مواجه خواهند شد.

جمع بندی

مجموع همین نکات و ترفندهای ریز و درشت است که امنیت یک وب سایت وردپرسی را تامین می کند، از کنار آنها به سادگی عبور نکنید، همچنین اگر به امنیت وب سایت تان اهمیت می دهید از نام کاربری admin و کلمه عبورهای ساده و قابل حدس زدن استفاده نکنید.

نظرات و سوالات کاربران
  1. سلام. بنده امروز مطالب خوبی رو از سایت شما یاد گرفتم. این مورد رو خودم قبلا دیده بودم و با روش دستی تغییر میدادم تا امنیت سایت به خطر نیفته. اما کم دیدم جایی به این مورد به این خوبی اشاره کنند.

    موفق باشید

    1. ممنونم دوست عزیز، خوشحالم که زمان ارزشمندتو در استارتاپ تاتس گذروندی. متاسفانه این مطلب توسط برخی از وب سایت ها کپی شده!!!

  2. یه سوال دارم ازتون. از چه افزونه ای یا روشی برای نمایش کدها در پست هاتون استفاده می کنید؟ خیلی زیبا و راحت کدها رو نشون میده و میشه کپی کرد.

  3. سلام عرض ادب

    اطلاع دارید که ایا افزونه ای هست که به طور پیش فرض نیک نیم کاربران (نه ادمین ها) رو به جای نام کاربری به صورت مجموع نام و نام خانوادگی نمایش بده . یعنی مثلا کاربر ک ثبت نام میکنه به جای این که حالت پیشفرضش نام کاربری باشه و بعد بره تغییرش بده . مستقیما به شکل فیلد نام و نام خانوادگی باشه . ممنون میشم اگر اطلاع دارید پاسخ رو به ایمیلم ارسال کنید .

    1. سلام دوست عزیز
      نمیدونم چنین افزونه ای هست یا خیر، اما پاسختون رو با عنوان “نکته مهم در رابطه با فیلد display_name” به انتهای مقاله اضافه کردم، امیدوارم مشکلتون رو حل کنه.

  4. مجددا درود . من این کد رو تست کردم متاسفانه عمل نکرد . از طرفی چطور میشه به جای یک عدد تصادفی هم نیک نیم و هم نام نمایش به صورت فرست نیم (user_Firstname) و لست نیم (user_lastname) پشت سر هم نشون داده بشن ؟ یعنی وقتی کاربری ثبت نام میکنه و دو تا فیلد نام و نام خانوادگی رو میگیریم ازش اتوماتیک نیک نیم و نام نمایش به صورت نام و نام خانوادگی نشون داده بشن …

    مجددا سپاس از زحماتتون

    1. سلام دوست عزیز، من این کد رو تست کردم نباید مشکلی داشته باشه، عدد تصادفی وقتی تولید میشه که کاربر اصلا نام و نام خانوادگی خودش رو وارد نکنه(بیشتر واسه محکم کاری)، در غیر این صورت نام + نام خانوادگی در فیلدهای nice_name و display_name ذخیره میشه(تصویر مطلب آموزشی این موضوع رو نشون میده) شیوه ثبت نام در وب سایتتون چطوریه؟ از پلاگین خاصی استفاده کردید؟

  5. ممنون . بله برای ثبت نام از پلاگین مدیریت کاربران (ultimate member) استفاده میکنم یعنی ممکنه دلیل کار نکردنش همین مورد باشه ؟

    و مورد بعدی این هست که یعنی با روشی که شما فرمودید اگر کاربر موقع ثبت نام فیلدهای (user_firstname) و (user_lastname) رو پر کنه به طور اتوماتیک نیک نیم و دیسپلی نیم با همین مقادیر پر میشه ؟

    1. دقیقا، اگر کاربر نام و نام خانوادگی را وارد کنه در فیلدهای user_nicename و display_name نام و نام خانوادگی قرار می گیره.
      برای اینکه این کدها با افزونه ultimate member کار کنه خط زیر رو جایگزین قبلی کنید.

      ;add_action( 'um_registration_complete', 'sanitize_user_login_info', 10, 1 )

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *