وردپرس در نسخه ۴٫۶ قابلیت REST API را معرفی کرد، امکانی که طیف گسترده ای از پلاگین ها، اپلیکیشن های موبایل و برنامه های دسکتاپ از آن استفاده می کنند، در واقع REST API مانند پلی است که سایرین از طریق آن می توانند با وردپرس تعامل داشته باشند، جدای از ویژگی های مثبت این قضیه بهتر است به خطرات آن هم توجه داشته باشید، در تصویر زیر فلش های قرمز رنگ گویای این واقعیت است.
اما چه چیزهایی از طریق REST API در دسترس و قابل مشاهده است؟ تقریبا همه چیز:
- نوشته ها(Posts)
- رونوشت ها(Post Revisions)
- صفحات(Pages)
- کاربران(Users)
- دسته ها(Categories)
- برچسب ها(Tags)
- رسانه(Media)
- تنظیمات(Settings)
برای بررسی این موضوع همین الان به انتهای آدرس وب سایت تان رشته “wp-json/wp/v2/users” را اضافه کنید، به صورت زیر:
your-domain.com/wp-json/wp/v2/users
همانطور که مشاهده می کنید لیست کاربران وردپرس نشان داده می شود، بسیاری از وب سایت ها از این موضوع غافل هستند و شما می توانید لیست کاربران آنها را مشاهده کنید.
خروجی بالا در قالب JSON ارائه شده است اما خوانا و قابل تفکیک نیست، برای حل مشکل فوق پس از نصب نرم افزار 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 های حساسی چون لیست کاربران و تنظیمات وردپرس به صورت خودکار مسدود خواهد شد.
۲- افزونه Disable REST API
اگر می خواهید بر روی تک تک API ها نظارت کامل داشته باشید از Disable REST API استفاده کنید، این افزونه به صورت پیش فرض کلیه آدرس ها را بلاک کرده و فقط برای کاربرانی که لاگین کرده اند قابل استفاده خواهد بود، در غیر این صورت پیغام زیر نشان داده خواهد شد.
اما می توانید از قسمت تنظیمات افزونه، مواردی که می خواهید امکان دسترسی برای همه(عضو و غیر عضو) وجود داشته باشد را مشخص کنید، توجه داشته باشد افزونه هایی مثل Yoast نیز 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 را نصب نکرده باشید هکر می تواند با خیال راحت و بدون هیچ محدودیتی انواع و اقسام کلمه عبورها را برای ورود به حساب کاربری شما امتحان کند.
با تشکر مهندس. مطلب بسیار مفیدی بود
مرسی دوست عزیز
مطلب خیلی مفید و مهم و کاربردی هست. برای این مورد یه قسمت هایی رو بسته بودم. اما با خوندن مطلب شما دیدم این بخش باز هست. الان بسته شد و خیلی راحت هم انجام شد.
وب سایت بسیار مفیدی دارید.
آرزوی موفقیت روز افزون برای شما دارم.
ممنونم دوست عزیز، خوشحالم که این مطلب برای شما مفید بوده، خیلی خوبه که به مسائل امنیتی وب سایت تون توجه دارید، موفق باشید.
سلام
چند تا سایت وردپرسی نگاه کردم باز بود، جالب بود برام …
ممنون
سلام…
با روش شما با موفقیت و بدون افزونه این ار رو انجام دادم…
ممنون