هر سایت وردپرسی، حتی سایتی که هیچ بازدیدی ندارد، هدف حدس خودکار رمز است: ربات‌ها هزاران ترکیب را روی wp-login.php و xmlrpc.php امتحان می‌کنند. این حمله دو ضرر دارد: اگر رمز ضعیف باشد وارد می‌شوند، و حتی اگر نشوند، هر تلاش یک اجرای PHP است و منابع هاست را مصرف می‌کند. سه کار بیشترین اثر را دارد: رمز بلند و تصادفی، محدود کردن تعداد تلاش، و بستن xmlrpc اگر استفاده‌اش نمی‌کنید.

از کجا بفهمم زیر حمله‌ام؟

  • در لاگ دسترسی، صدها درخواست POST به /wp-login.php یا /xmlrpc.php. (خواندن لاگ دسترسی)
  • مصرف CPU و Entry Processes بالا، بدون افزایش بازدید. (Resource Usage)
  • ایمیل‌های «تلاش ورود ناموفق» از افزونه‌ی امنیتی.
  • خطای ۵۰۸ یا ۵۰۳ در ساعت‌های بی‌ربط. (خطای ۵۰۸)

شش لایه، به ترتیب اثر

لایه جلوی چه چیزی را می‌گیرد سختی
رمز بلند و نام کاربری غیرقابل‌حدس موفق شدن حمله ساده
محدودیت تلاش ورود ادامه‌ی حدس از یک آی‌پی ساده
ورود دومرحله‌ای ورود حتی با رمز لو رفته ساده
بستن xmlrpc راه دوم حدس رمز و بخشی از مصرف منابع ساده
کپچا در فرم ورود ربات‌های ساده ساده
رمز پوشه یا محدودیت آی‌پی روی wp-login رسیدن درخواست به PHP متوسط

۱. رمز و نام کاربری

  • رمز تصادفی، ۱۶ نویسه یا بیشتر، برای همه‌ی مدیران و ویرایشگرها. ضعیف‌ترین رمز بین کاربران، امنیت کل سایت است.
  • نام کاربری admin، نام دامنه و نام نویسنده‌ای که زیر مطالب دیده می‌شود، اولین حدس‌ها هستند. برای مدیر نام کاربری جدا بسازید و «نام نمایشی» را چیز دیگری بگذارید.
  • کاربرانی که دیگر لازم نیستند را حذف کنید.

۲. محدودیت تلاش

وردپرس به‌صورت پیش‌فرض هیچ سقفی برای ورود ناموفق ندارد. یک افزونه‌ی محدودکننده‌ی تلاش ورود نصب کنید و مثلاً بعد از پنج خطا، آی‌پی را برای مدتی قفل کنید. آی‌پی خودتان را در لیست سفید بگذارید تا با یک اشتباه بیرون نمانید. اگر قفل شدید: وارد پیشخوان نمی‌شوم.

۳. ورود دومرحله‌ای

با یک افزونه‌ی احراز هویت دومرحله‌ای و برنامه‌ای مثل Google Authenticator روی گوشی. کدهای پشتیبان را جایی نگه دارید. روش پیامکی به سرویس پیامک وابسته است و اگر آن سرویس قطع شود، بیرون می‌مانید.

۴. xmlrpc.php

این فایل راه قدیمی اتصال برنامه‌های بیرونی به وردپرس است. دو مشکل دارد: مهاجم می‌تواند در یک درخواست صدها رمز را امتحان کند، و برای حمله به سایت‌های دیگر (pingback) قابل سوءاستفاده است. اگر از اپلیکیشن موبایل وردپرس، Jetpack یا ابزار انتشار از راه دور استفاده نمی‌کنید، ببندیدش. در htaccess پوشه‌ی سایت:

<Files "xmlrpc.php">
    Require all denied
</Files>

چون این قانون در سطح وب‌سرور اجرا می‌شود، درخواست اصلاً به PHP نمی‌رسد و منابعی مصرف نمی‌کند. (دستورهای htaccess)

۵. کپچا

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

۶. قفل در سطح وب‌سرور

قوی‌ترین لایه: درخواست قبل از رسیدن به وردپرس متوقف می‌شود.

روش مناسب برای نکته
محدود کردن wp-login.php به آی‌پی آی‌پی ثابت دفتر با آی‌پی متغیر خودتان را قفل می‌کنید
رمز دوم روی wp-login.php سایت‌هایی که فقط چند نفر وارد می‌شوند اگر کل پوشه‌ی wp-admin را رمز بگذارید، admin-ajax.php را استثنا کنید؛ وگرنه بخش‌هایی از سایت از کار می‌افتد
تغییر آدرس ورود با افزونه کم کردن نویز امنیت واقعی نیست؛ فقط ربات‌های کور را دور می‌کند

برای فروشگاه و سایت عضویتی که مشتری‌ها هم وارد می‌شوند، رمز دوم و محدودیت آی‌پی عملی نیست؛ همان پنج لایه‌ی اول را کامل کنید. (رمز روی پوشه)

کارهای کوچک دیگر

  • پیام خطای ورود را عمومی کنید تا نگوید نام کاربری درست بود یا رمز.
  • فهرست‌گیری نویسنده‌ها را ببندید: آدرس /?author=1 نام کاربری را لو می‌دهد.
  • ویرایشگر فایل پیشخوان را خاموش کنید، با این خط در wp-config.php:
    define('DISALLOW_FILE_EDIT', true);
  • وردپرس و افزونه‌ها را به‌روز نگه دارید. (آپدیت امن)

هاست چه می‌کند؟

فایروال سرور الگوهای حمله‌ی شناخته‌شده را می‌بندد و آی‌پی‌هایی را که پشت‌سرهم خطا می‌دهند مسدود می‌کند. این لایه جایگزین تنظیمات خود سایت نیست: حمله‌های کند و پخش‌شده از هزاران آی‌پی از آن رد می‌شوند. (Imunify360، چک‌لیست امنیت وردپرس)

سوال‌های رایج

بستن xmlrpc چیزی را خراب می‌کند؟

اگر از اپ موبایل وردپرس، Jetpack یا انتشار از ابزار بیرونی استفاده نمی‌کنید، نه. ویرایشگر، افزونه‌ها و REST API به آن وابسته نیستند.

تغییر آدرس ورود کافی نیست؟

نه. xmlrpc هنوز باز است و آدرس تازه هم قابل پیدا شدن است. آن را کنار لایه‌های دیگر بگذارید، نه به‌جایشان.

حمله تمام نمی‌شود؛ چه کنم؟

تمام نمی‌شود؛ این نویز دائمی اینترنت است. هدف این است که موفق نشود و منابع مصرف نکند. اگر مصرف منابع هنوز بالاست، با نمونه‌ای از لاگ تیکت بزنید.