افزایش امنیت وردپرس با مخفی کردن WP REST API

وردپرس در نسخه ۴٫۶ قابلیت REST API را معرفی کرد، امکانی که طیف گسترده ای از پلاگین ها، اپلیکیشن های موبایل و برنامه های دسکتاپ از آن استفاده می کنند، در واقع REST API مانند پلی است که سایرین می توانند از طریق آن با وردپرس تعامل داشته باشند، جدای از ویژگی های مثبت این قضیه بهتر است به خطرات آن هم توجه داشته باشید، در تصویر زیر فلش های قرمز رنگ گویای این واقعیت است.

خطرات wp rest api

اما چه چیزهایی از طریق REST API در دسترس و قابل مشاهده است؟ تقریبا همه چیز:

  1. نوشته ها(Posts)
  2. رونوشت ها(Post Revisions)
  3. صفحات(Pages)
  4. کاربران(Users)
  5. دسته ها(Categories)
  6. برچسب ها(Tags)
  7. رسانه(Media)
  8. تنظیمات(Settings)

برای بررسی این موضوع همین الان به انتهای آدرس وب سایت تان رشته “wp-json/wp/v2/users” را اضافه کنید، به صورت زیر:

your-domain.com/wp-json/wp/v2/users

 

همانطور که مشاهده می کنید لیست کاربران وردپرس نشان داده می شود، بسیاری از وب سایت ها از این موضوع غافل هستند و شما می توانید لیست کاربران آنها را مشاهده کنید.

لیست کاربران وردپرس از طریق rest api

 

خروجی بالا در قالب JSON ارائه شده است اما خوانا و قابل تفکیک نیست، برای حل مشکل فوق پس از نصب نرم افزار Post Man به صورت زیر عمل کنید.

نرم افزار post man

 

چرا دسترسی به لیست کاربران خطرناک است؟

اگر به تصویر بالا دقت کنید فیلدی به نام slug(نامک) وجود دارد که برای ایجاد پیوند یکتاِی کاربر استفاده می شود، متاسفانه در ۹۹ درصد مواقع مقدار این فیلد برابر با نام کاربری وردپرس است، مگر اینکه فکری به حال آن کرده باشید، در پست آموزشی امنیت وردپرس: مراقب فیلد user_nicename باشید! روش حل این نقص امنیتی آموزش داده شده است.

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

your-domain.com/wp-json/wp/v2/posts

 

و در مجموع به همه اطلاعات دسترسی دارید.

your-domain/wp-json/wp/v2/media
your-domain/wp-json/wp/v2/comments
your-domain/wp-json/wp/v2/pages
your-domain/wp-json/wp/v2/tags
your-domain/wp-json/wp/v2/categories
your-domain/wp-json/wp/v2/settings

 

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

راه حل چیست؟

۱- افزونه قدرتمند Wordfence

پس از نصب افزونه وردفنس امکان دسترسی به REST API های حساسی چون لیست کاربران و تنظیمات وردپرس به صورت خودکار مسدود خواهد شد.

بلاک کردن rest api با افزونه wordfence

۲- افزونه Disable REST API

اگر می خواهید بر روی تک تک API ها نظارت کامل داشته باشید از Disable REST API استفاده کنید، این افزونه به صورت پیش فرض کلیه آدرس ها را بلاک کرده و فقط برای کاربرانی که لاگین کرده اند قابل استفاده خواهد بود، در غیر این صورت پیغام زیر نشان داده می شود.

افزونه disable rest api

اما می توانید از قسمت تنظیمات افزونه مواردی را که می خواهید امکان دسترسی برای همه(عضو و غیر عضو) وجود داشته باشد را مشخص کنید، توجه داشته باشد افزونه هایی مثل Yoast نیز REST API های مختص به خود را دارند که آنها هم مسدود می شوند.

تنظیمات افزونه disable rest api

۳- استفاده از Functions.php

در این رویکرد به چهار روش و بدون نصب افزونه محدودیت های لازم را ایجاد می کنیم، فقط کافی است کدهای زیر را در فایل functions.php قرار دهید.

۱- دسترسی به REST API فقط برای افرادی که لاگین کردند.

function restrict_wp_rest_api( $access ){
    if ( ! empty( $access ) ) {
        return $access;
    }
    if ( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_not_logged_in',
                             'Only authenticated users can access the REST API.',
                             array( 'status' => 401 ) );
    }
    return $access;
}
add_filter( 'rest_authentication_errors', 'restrict_wp_rest_api' );

 

۲- دسترسی به REST API فقط برای کاربرانی که دارای نقش مدیریت هستند.

function restrict_wp_rest_api( $access ){
    if ( ! empty( $access ) ) {
        return $access;
    }
    if ( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_not_logged_in',
                             'Only authenticated users can access the REST API.',
                              array( 'status' => 401 ) );
    }

    if ( ! current_user_can( 'administrator' ) ) {
        return new WP_Error( 'rest_not_admin',
                             'Only administrator can access the REST API.',
                             array( 'status' => 401 ) );
    }

    return $access;
}
add_filter( 'rest_authentication_errors', 'restrict_wp_rest_api' );

 

۳- غیر فعال کردن کلی REST API

function restrict_wp_rest_api( $access ){
    return new WP_Error( 'rest_disabled',
                         'The REST API on this site has been disabled.',
                          array( 'status' => 401 ) );
}
add_filter( 'rest_authentication_errors', 'restrict_wp_rest_api' );

 

۴- محدودیت دسترسی به لیست کاربران

function restrict_wp_user_rest_api( $endpoints ){
    if ( isset( $endpoints['/wp/v2/users'] ) ) {
        unset( $endpoints['/wp/v2/users'] );
    }
    if ( isset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ) ) {
        unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
    }
    return $endpoints;
}
add_filter( 'rest_endpoints', 'restrict_wp_user_rest_api' );

 

جمع بندی

اینکه دسترسی به REST API را محدود کنید کاملا به نوع وب سایت تان بستگی دارد، اما هدف هر چه که باشد حداقل امکان دسترسی به لیست کاربران(اگر به آن احتیاج ندارید) را غیرفعال کنید، چرا که با پیدا کردن نام کاربری ۵۰ درصد مسیر نفوذ به وب سایت تان هموار خواهد شد، در این وضعیت اگر افزونه هایی مثل Limit Login Attempts یا Wordfence را نصب نکرده باشید هکر می تواند با خیال راحت و بدون هیچ محدودیتی انواع و اقسام کلمه عبورها را برای ورود به حساب کاربری شما امتحان کند.

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

    وب سایت بسیار مفیدی دارید.
    آرزوی موفقیت روز افزون برای شما دارم.

    1. ممنونم دوست عزیز، خوشحالم که این مطلب برای شما مفید بوده، خیلی خوبه که به مسائل امنیتی وب سایت تون توجه دارید، موفق باشید.

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

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