نفش REST API در امنیت وردپرس
در این مقاله قصد داریم در مورد امنیت وردپرس با مخفی کردن REST API صحبت کنیم
وردپرس در نسخه ۴٫۶ قابلیت 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 را نصب نکرده باشید هکر می تواند با خیال راحت و بدون هیچ محدودیتی انواع و اقسام کلمه عبورها را برای ورود به حساب کاربری شما امتحان کند.
بله!
بعضی از هاستینگ ها هم خودشون این کار رو انجام میدن 🙂
من که نت افراز دارم نمیزاره