امنیت و نگهداری وردپرس

آموزش امنیت ورود وردپرس؛ فعال‌سازی 2FA، Passkey و محدودسازی تلاش ورود

آموزش امنیت ورود وردپرس و فعال‌سازی 2FA

🗓 آخرین به‌روزرسانی:

📚 این آموزش بخشی از آموزش جامع وردپرس از صفر تا حرفه‌ای است؛ مسیر کامل یادگیری را آنجا ببینید.

امنیت ورود وردپرس فقط به انتخاب یک رمز پیچیده محدود نمی‌شود. مهاجم ممکن است رمز را از یک نشت قدیمی پیدا کند، کاربر را با صفحه جعلی فریب دهد، نشست مرورگر را بدزدد، صندوق ایمیل بازیابی را تصاحب کند یا با هزاران تلاش خودکار به صفحه ورود فشار وارد سازد. دفاع مؤثر باید چند لایه باشد: رمز منحصربه‌فرد، احراز هویت دومرحله‌ای، Passkey یا کلید امنیتی، محدودسازی هوشمند درخواست‌ها، مدیریت Session، حفاظت از ایمیل و کنترل دسترسی‌های API.

اگر می‌خواهید حمله‌ها پیش از رسیدن به صفحه ورود متوقف شوند، آموزش WAF و فایروال وردپرس با Cloudflare را هم ببینید.

هسته وردپرس ابزارهایی مانند رمز قوی، Application Password و مدیریت نشست‌ها را در اختیار مدیر قرار می‌دهد، اما در مستندات فعلی، 2FA و Passkey به‌صورت پیش‌فرض داخل Core ارائه نمی‌شوند و باید از افزونه معتبر یا سرویس هویت سازمانی استفاده شود. انتخاب نادرست افزونه ورود نیز می‌تواند مدیر را پشت در سایت قفل کند یا فرم ورود مشتریان ووکامرس را مختل نماید.

در این راهنما، تهدیدهای ورود، رمز و Password Manager، فعال‌سازی TOTP، Passkey و WebAuthn، Recovery Code، محدودسازی Brute Force، Rate Limit در WAF، CAPTCHA، XML-RPC، Application Passwords، مدیریت نشست‌ها، بازیابی حساب، ورود مشتریان WooCommerce و واکنش به Login مشکوک را مرحله‌به‌مرحله بررسی می‌کنیم.

وضعیت سایت فعلی: dev-source.ir روی WordPress 7.0.2 اجرا می‌شود و فقط یک حساب Administrator دارد. افزونه اختصاصی 2FA، Passkey یا محدودسازی تلاش ورود در فهرست افزونه‌های فعال مشاهده نشد. یک اتصال برنامه‌ای امن نیز روی سایت فعال است؛ بنابراین Application Passwordها باید بدون قطع اتصال، نام‌گذاری، بازبینی و دوره‌ای چرخانده شوند. در این مقاله هیچ تنظیم ورود سایت زنده بدون بکاپ و Staging تغییر داده نمی‌شود.

تهدیدهای اصلی صفحه ورود وردپرس

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

Brute Force

ربات تعداد زیادی رمز احتمالی را برای یک نام کاربری امتحان می‌کند. این حمله حتی در صورت ناموفق‌بودن می‌تواند CPU و PHP Workerها را مصرف کند.

Password Spraying

مهاجم یک یا چند رمز رایج را روی تعداد زیادی حساب آزمایش می‌کند تا بدون ایجاد Lockout شدید، یک حساب ضعیف پیدا شود.

Credential Stuffing

ایمیل و رمزهای افشاشده از سایت‌های دیگر روی وردپرس امتحان می‌شوند. به همین دلیل رمز منحصربه‌فرد از پیچیدگی ظاهری مهم‌تر است.

Phishing

کاربر وارد صفحه‌ای شبیه wp-login می‌شود و رمز یا کد یک‌بارمصرف را در اختیار مهاجم قرار می‌دهد. TOTP معمولی ریسک را کاهش می‌دهد، اما Passkey و کلید امنیتی در برابر Phishing مقاوم‌ترند.

Session Theft

مهاجم Cookie ورود فعال را از مرورگر، افزونه مخرب، دستگاه آلوده یا اتصال ناامن سرقت می‌کند. در این حالت حتی دانستن رمز لازم نیست تا نشست موجود سوءاستفاده شود.

تصاحب ایمیل بازیابی

اگر ایمیل حساب مدیر هک شود، مهاجم می‌تواند لینک Reset Password را دریافت کند. امنیت ایمیل مدیر به‌اندازه امنیت خود وردپرس اهمیت دارد.

سوءاستفاده از API و Application Password

ابزارهای خودکار، اپلیکیشن‌ها و اتصال‌های هوش مصنوعی می‌توانند از REST API استفاده کنند. نشت Application Password به مهاجم اجازه می‌دهد با سطح دسترسی همان User درخواست برنامه‌ای ارسال کند.

لایه اول: حساب مدیر اختصاصی و حداقل دسترسی

هر فرد باید حساب مستقل داشته باشد. اشتراک یک حساب Administrator میان چند نفر مشکلات زیر را ایجاد می‌کند:

  • مشخص نیست چه کسی تغییر را انجام داده است.
  • لغو دسترسی یک نفر نیازمند تغییر رمز برای همه است.
  • 2FA و Recovery Code قابل انتساب نیستند.
  • نشست‌های مشکوک به‌سختی تشخیص داده می‌شوند.

برای نویسنده، پشتیبان فروش، مدیر محصول و حسابدار از نقش متناسب استفاده کنید. دسترسی Administrator فقط برای افرادی باشد که واقعاً باید افزونه، قالب، کاربر و تنظیمات کل سایت را مدیریت کنند.

جزئیات نقش‌ها در مقاله آموزش مدیریت کاربران و نقش‌های وردپرس توضیح داده شده است.

آیا نام کاربری admin خطرناک است؟

نام کاربری قابل حدس بخشی از اطلاعات ورود را برای مهاجم روشن می‌کند، اما تغییر آن به‌تنهایی امنیت ایجاد نمی‌کند. نام کاربری ممکن است از Author Archive، REST API، داده‌های عمومی یا خطاهای دیگر قابل شناسایی باشد.

اولویت درست:

  1. رمز منحصربه‌فرد و قوی
  2. 2FA یا Passkey
  3. Rate Limit و WAF
  4. حداقل دسترسی
  5. سپس کاهش افشای غیرضروری Username

Display Name عمومی را می‌توان متفاوت از نام ورود انتخاب کرد؛ اما این کار را جایگزین دفاع واقعی ندانید.

لایه دوم: رمز قوی و Password Manager

رمز مدیر باید طولانی، تصادفی و فقط مخصوص همان سایت باشد. یک رمز پیچیده که روی چند سایت تکرار شده، در Credential Stuffing همچنان خطرناک است.

ویژگی‌های رمز مناسب

  • حداقل طول زیاد و ترجیحاً تولیدشده با Password Manager
  • عدم استفاده از نام، دامنه، شماره تلفن و تاریخ تولد
  • عدم تکرار در ایمیل، هاست، درگاه یا شبکه اجتماعی
  • عدم ارسال در پیام‌رسان یا فایل متنی عمومی
  • قابل ذخیره در Vault رمزگذاری‌شده

Passphrase طولانی نیز می‌تواند مناسب باشد، به‌شرط آنکه شخصی و قابل حدس نباشد.

آیا باید رمز را هر ماه تغییر دهیم؟

تغییر اجباری و بسیار مکرر ممکن است کاربر را به انتخاب رمز ضعیف یا الگوی قابل پیش‌بینی سوق دهد. رمز را در این شرایط فوراً تغییر دهید:

  • هشدار نشت یا ورود مشکوک
  • آلودگی دستگاه مدیر
  • ارسال اشتباهی رمز
  • پایان همکاری فرد دارای دسترسی
  • مشاهده Session ناشناس
  • نفوذ به ایمیل یا هاست

رمز منحصربه‌فرد، 2FA و مانیتورینگ از تغییر تقویمی بدون دلیل مؤثرترند.

لایه سوم: 2FA چیست؟

احراز هویت دومرحله‌ای پس از رمز، عامل دیگری برای اثبات هویت درخواست می‌کند. سه گروه عامل رایج:

  • چیزی که می‌دانید: رمز یا PIN
  • چیزی که دارید: موبایل، کلید امنیتی یا Token
  • چیزی که هستید: اثر انگشت یا تشخیص چهره روی دستگاه

اگر رمز مدیر افشا شود، 2FA می‌تواند مانع ورود مستقیم مهاجم شود. بااین‌حال کد یک‌بارمصرف نیز ممکن است با Phishing بلادرنگ سرقت شود؛ برای حساب‌های بسیار حساس، Passkey یا کلید سخت‌افزاری انتخاب قوی‌تری است.

آیا وردپرس 2FA داخلی دارد؟

در مستندات فعلی WordPress، هسته به‌صورت پیش‌فرض 2FA ارائه نمی‌کند. برای فعال‌سازی باید یکی از این مسیرها استفاده شود:

  • افزونه نگهداری‌شده و معتبر
  • SSO یا Identity Provider سازمانی
  • سرویس امنیتی هاست یا پنل مدیریت مرکزی

افزونه رسمی جامعه WordPress با نام Two Factor از TOTP، کد ایمیلی و Backup Code پشتیبانی می‌کند. برای WebAuthn نیز Provider سازگار جدا وجود دارد. قبل از نصب، سازگاری نسخه فعلی وردپرس و فرایند Recovery را بررسی کنید.

انتخاب روش دومرحله‌ای

Passkey یا کلید امنیتی WebAuthn

در برابر Phishing مقاوم‌تر است، زیرا Credential به دامنه صحیح وابسته است. کلید فیزیکی، Windows Hello، Touch ID یا قابلیت امن دستگاه می‌تواند عامل احراز باشد.

TOTP با Authenticator App

کد شش‌رقمی دوره‌ای از Secret مشترک ساخته می‌شود. به اینترنت یا پیامک وابسته نیست و برای بسیاری از مدیران تعادل مناسبی میان امنیت و سهولت دارد.

Push Notification

کاربر درخواست ورود را در اپلیکیشن تأیید می‌کند. باید در برابر MFA Fatigue محافظت شود؛ نمایش عدد تطبیقی یا جزئیات دستگاه مفید است.

Email Code

از رمز تنها بهتر است، اما اگر ایمیل همان حساب هک شود، هر دو مرحله در اختیار مهاجم قرار می‌گیرند.

SMS

برای بعضی کاربران قابل دسترس است، اما در برابر SIM Swap، انتقال شماره و ضعف اپراتور ریسک بیشتری دارد. بهتر است روش اصلی مدیر نباشد و فقط در صورت ضرورت استفاده شود.

فعال‌سازی 2FA در وردپرس با TOTP؛ قدم‌به‌قدم و امن

رابط دقیق هر افزونه متفاوت است، اما روند عمومی چنین است:

  1. از سایت و دیتابیس بکاپ بگیرید.
  2. افزونه 2FA را ابتدا روی Staging نصب کنید.
  3. روی حساب مدیر دومرحله‌ای را فعال نمایید.
  4. QR Code را با Authenticator اسکن کنید.
  5. Secret دستی را فقط در Vault امن نگهداری کنید.
  6. کد فعلی را برای تأیید وارد نمایید.
  7. Recovery Codeها را تولید و خارج از سایت ذخیره کنید.
  8. پنجره ناشناس باز و ورود کامل را آزمایش نمایید.
  9. فقط پس از تست، 2FA را برای نقش‌های حساس اجباری کنید.

قبل از خروج از نشست فعلی، ورود در مرورگر دوم را تأیید کنید. این کار احتمال قفل‌شدن مدیر را کاهش می‌دهد.

Recovery Code را کجا نگه داریم؟

کدهای بازیابی یک‌بارمصرف‌اند و در صورت گم‌شدن موبایل اجازه ورود می‌دهند. آن‌ها را:

  • داخل همان سایت یا Media Library ذخیره نکنید.
  • در پیام‌رسان عمومی ارسال نکنید.
  • در Password Manager یا محل فیزیکی امن نگهداری کنید.
  • بعد از استفاده دوباره تولید کنید.
  • برای هر مدیر جدا نگه دارید.

حداقل دو مسیر بازیابی مستقل داشته باشید؛ مثلاً Passkey روی لپ‌تاپ و کلید امنیتی پشتیبان، یا TOTP و Recovery Code.

Passkey چیست و چرا مهم است؟

Passkey براساس WebAuthn کار می‌کند و به‌جای ارسال یک Secret مشترک، از جفت کلید رمزنگاری استفاده می‌کند. کلید خصوصی روی دستگاه یا کلید امنیتی می‌ماند و سایت فقط کلید عمومی را ذخیره می‌کند.

مزایا

  • مقاومت بالا در برابر صفحه ورود جعلی
  • عدم نیاز به تایپ رمز در بعضی پیاده‌سازی‌ها
  • استفاده از اثر انگشت، چهره یا PIN محلی دستگاه
  • کاهش خطر نشت Credential از سرور

محدودیت‌ها

  • نیاز به افزونه یا Identity Provider سازگار
  • ضرورت برنامه بازیابی در صورت گم‌شدن دستگاه
  • تفاوت پشتیبانی مرورگر و دستگاه
  • نیاز به ثبت حداقل دو Authenticator برای مدیر

برای حساب Administrator بهتر است یک Passkey روی دستگاه اصلی و یک کلید امنیتی یا دستگاه دوم ثبت شود.

2FA را برای چه نقش‌هایی اجباری کنیم؟

اولویت اجباری‌سازی:

  1. Administrator
  2. Shop Manager
  3. Editor و کاربر دارای انتشار
  4. کاربران دارای دسترسی به اطلاعات مشتری یا سفارش

برای Customer ووکامرس، اجباری‌کردن عمومی 2FA می‌تواند اصطکاک خرید و پشتیبانی را افزایش دهد. امکان اختیاری یا Risk-Based را بررسی کنید. برای محصول اشتراکی، کیف پول یا داده حساس ممکن است سیاست سخت‌گیرانه‌تری لازم باشد.

Grace Period برای استقرار 2FA

اگر 2FA را برای تیم اجباری می‌کنید، یک دوره ثبت‌نام کوتاه و مشخص تعیین کنید. پیش از پایان مهلت:

  • راهنمای فارسی ارسال شود.
  • Recovery Code توضیح داده شود.
  • روش پشتیبان ثبت گردد.
  • مسئول بازیابی حساب مشخص باشد.
  • کاربر غیرفعال یا قدیمی حذف شود.

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

لایه چهارم: محدودسازی تلاش ورود

Lockout ساده پس از چند رمز اشتباه همیشه بهترین دفاع نیست؛ مهاجم می‌تواند نام کاربری مدیر را عمداً قفل کند. راهکار بهتر ترکیبی از Throttling، Rate Limit، بررسی IP و رفتار است.

ویژگی‌های Rate Limit مناسب

  • محدودیت براساس IP و Account
  • افزایش تدریجی تأخیر
  • پنجره زمانی کوتاه و قابل بازیابی
  • پاسخ HTTP 429 برای درخواست بیش‌ازحد
  • عدم افشای اینکه Username معتبر است
  • Whitelist محدود برای Integrationهای ضروری
  • Log و هشدار برای حمله شدید

حملات توزیع‌شده از هزاران IP انجام می‌شوند؛ بنابراین محدودیت صرفاً براساس یک IP کافی نیست.

Rate Limit در CDN و WAF بهتر است یا افزونه؟

مسدودکردن در CDN یا WAF قبل از رسیدن درخواست به PHP منابع کمتری مصرف می‌کند. افزونه وردپرس می‌تواند Context کاربر و نقش را بهتر بشناسد، اما درخواست ابتدا وارد سرور شده است.

ترتیب پیشنهادی:

  1. Rate Limit لبه شبکه برای wp-login.php و درخواست‌های مشکوک
  2. قواعد وب‌سرور یا هاست
  3. کنترل افزونه در سطح برنامه
  4. 2FA برای حساب‌های حساس

Ruleها را روی Staging تست کنید تا REST API، AJAX، Checkout و اتصال مدیریتی قطع نشوند.

CAPTCHA و Turnstile را چگونه استفاده کنیم؟

CAPTCHA می‌تواند Botهای ساده را کاهش دهد، اما مشکلات دسترسی‌پذیری و اصطکاک ایجاد می‌کند. بهتر است فقط پس از رفتار مشکوک یا چند تلاش ناموفق نمایش داده شود.

  • روی فرم Login مدیر آزمایش شود.
  • Lost Password و Register فراموش نشوند.
  • فرم My Account ووکامرس تست شود.
  • مرورگرهای دارای Ad Blocker بررسی شوند.
  • خطای سرویس CAPTCHA نباید همه کاربران را قفل کند.

CAPTCHA جایگزین رمز قوی و 2FA نیست.

تغییر URL ورود چه فایده‌ای دارد؟

تغییر wp-login.php می‌تواند نویز Botهای ساده و حجم Log را کم کند، اما مهاجم همچنان ممکن است مسیر را از Redirect، Source، Cookie، Endpoint یا خطای سایت پیدا کند.

این اقدام را فقط یک لایه کمکی بدانید. پس از تغییر، مسیرهای زیر را تست کنید:

  • ورود مدیر
  • Lost Password
  • Logout
  • My Account ووکامرس
  • Checkout Login
  • Application Password و API
  • ابزار مانیتورینگ

Basic Authentication روی wp-admin

قرار دادن رمز وب‌سرور روی wp-admin یک لایه اضافه ایجاد می‌کند، اما پیکربندی اشتباه می‌تواند admin-ajax.php، Cron، Frontend AJAX، WooCommerce و ابزارهای خارجی را خراب کند.

این روش برای سایت عمومی فروشگاهی فقط با دانش وب‌سرور و Exclude دقیق مسیرهای ضروری اجرا شود. WAF، 2FA و Rate Limit معمولاً انعطاف بیشتری دارند.

XML-RPC و حملات ورود

xmlrpc.php برای بعضی اپلیکیشن‌ها و سرویس‌های انتشار از راه دور استفاده می‌شود. مهاجم می‌تواند از Methodهای ورود برای فشار بیشتر یا آزمودن Credential استفاده کند.

قبل از غیرفعال‌سازی بررسی کنید

  • اپلیکیشن موبایل WordPress
  • Jetpack یا سرویس‌های وابسته
  • ابزار انتشار خارجی
  • Integrationهای قدیمی

اگر هیچ وابستگی وجود ندارد، می‌توان XML-RPC را محدود یا غیرفعال کرد. اگر نیاز است، Methodهای غیرضروری را ببندید و Rate Limit اعمال کنید.

Application Password چیست؟

Application Password یک Credential مستقل و قابل لغو برای REST API یا XML-RPC است. این رمز برای ورود انسان به wp-login.php طراحی نشده است.

مزایا

  • رمز اصلی مدیر در اختیار ابزار خارجی قرار نمی‌گیرد.
  • برای هر Integration یک Credential جدا ساخته می‌شود.
  • لغو یک اتصال بدون تغییر رمز اصلی ممکن است.
  • زمان آخرین استفاده و IP در پروفایل قابل بررسی است.

Application Password فقط روی HTTPS استفاده شود. در WordPress، مقدار آن به‌صورت Hash ذخیره و رمز فقط هنگام ساخت نمایش داده می‌شود.

مدیریت امن Application Passwordها

  1. برای هر ابزار یک رمز مستقل بسازید.
  2. نام واضح مانند «اتصال انتشار محتوا» ثبت کنید.
  3. Credential را در Secret Manager نگهداری کنید.
  4. هرگز رمز اصلی User را به ابزار ندهید.
  5. Last Used و Last IP را دوره‌ای بررسی کنید.
  6. رمز بلااستفاده را Revoke کنید.
  7. پس از تغییر تیم یا احتمال نشت، Credential را Rotate نمایید.

برای اتصال‌های مهم، بهتر است User اختصاصی با حداقل Capability ساخته شود؛ استفاده از Administrator برای همه Integrationها دامنه خسارت را افزایش می‌دهد.

فرمان‌های WP-CLI برای Application Password

در سروری که WP-CLI و SSH امن دارد:

wp user application-password list 1 --fields=uuid,name,created,last_used,last_ip

حذف یک Credential:

wp user application-password delete 1 UUID

ساخت Credential جدید:

wp user application-password create 1 "integration-name"

شناسه User و نام اتصال را متناسب با سایت خود تغییر دهید. خروجی رمز فقط یک بار نمایش داده می‌شود.

لایه پنجم: مدیریت Sessionهای ورود

بعد از ورود موفق، وردپرس Cookie نشست ایجاد می‌کند. تغییر رمز یا Logout از یک دستگاه همیشه همه Sessionهای دیگر را به‌طور خودکار از بین نمی‌برد؛ بنابراین بعد از رخداد مشکوک باید Sessionها را صریحاً لغو کنید.

روش داخل پیشخوان

در Users → Profile گزینه Log Out Everywhere Else می‌تواند نشست‌های دیگر حساب را خاتمه دهد.

روش WP-CLI

نمایش Sessionهای یک User:

wp user session list 1

حذف همه Sessionها:

wp user session destroy 1 --all

پس از حذف Session، کاربر باید دوباره با رمز و 2FA وارد شود.

چه زمانی Sessionها را لغو کنیم؟

  • مشاهده IP یا User Agent ناشناس
  • گم‌شدن لپ‌تاپ یا موبایل
  • خروج همکار از تیم
  • نصب افزونه مرورگر مشکوک
  • تغییر رمز پس از نشت
  • رخداد امنیتی روی هاست یا ایمیل

در رخداد جدی، علاوه بر Session، Application Passwordها و کلیدهای API نیز Rotate شوند.

امنیت ایمیل بازیابی حساب

Lost Password به ایمیل کاربر وابسته است. برای ایمیل مدیر:

  • رمز منحصربه‌فرد و 2FA فعال باشد.
  • Recovery Email و شماره بازیابی بررسی شود.
  • Forward و Filter ناشناس حذف شوند.
  • هشدار Login جدید فعال باشد.
  • دستگاه‌های متصل دوره‌ای بازبینی شوند.

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

پیام خطای ورود و User Enumeration

پیام‌هایی مانند «نام کاربری موجود نیست» و «رمز اشتباه است» می‌توانند اعتبار Username را مشخص کنند. بعضی افزونه‌ها پیام عمومی‌تری نمایش می‌دهند.

بااین‌حال پنهان‌کردن Username دفاع اصلی نیست. ممکن است نام کاربری از مسیرهای عمومی دیگر قابل حدس باشد. هدف اصلی باید جلوگیری از استفاده موفق Credential باشد.

Log ورود چه اطلاعاتی ثبت کند؟

یک Login Log مفید می‌تواند شامل موارد زیر باشد:

  • زمان و منطقه زمانی
  • User یا شناسه حساب
  • موفق یا ناموفق‌بودن تلاش
  • IP و User Agent
  • روش احراز هویت
  • فعال‌شدن Lockout یا Rate Limit
  • تغییر تنظیمات 2FA

رمز، کد TOTP، Secret و Recovery Code نباید داخل Log ذخیره شوند. دوره نگهداری Log نیز باید با Privacy Policy هماهنگ باشد.

چه هشدارهایی ارزشمندند؟

  • ورود موفق Administrator از IP یا کشور جدید
  • چندین شکست ورود برای حساب حساس
  • غیرفعال‌شدن 2FA
  • ایجاد Application Password جدید
  • ایجاد User دارای نقش Administrator
  • تغییر ایمیل مدیر
  • لغو ناگهانی چند Session

هشدار بیش‌ازحد باعث Alert Fatigue می‌شود. فقط رخدادهایی را اعلان کنید که اقدام مشخصی پس از آن انجام می‌دهید.

ورود مشتریان ووکامرس

افزونه امنیت ورود باید با این مسیرها سازگار باشد:

  • My Account Login
  • Registration
  • Lost Password
  • Checkout Login
  • ساخت حساب هنگام Checkout
  • REST و Store API
  • درگاه و Callback

قرار دادن CAPTCHA یا Lockout سخت روی همه مشتریان ممکن است فروش را کاهش دهد. سیاست پیشنهادی:

  • 2FA اجباری برای Administrator و Shop Manager
  • 2FA اختیاری برای Customer
  • Rate Limit هوشمند برای همه فرم‌ها
  • CAPTCHA فقط پس از رفتار مشکوک
  • تست کامل موبایل و Checkout

تنظیمات حساب مشتری در مقاله آموزش حساب کاربری و حریم خصوصی ووکامرس توضیح داده شده است.

LiteSpeed Cache و فرم ورود

صفحات Login، My Account و Checkout نباید به‌صورت عمومی Cache شوند. Cookie و Nonce هر کاربر متفاوت‌اند.

  • صفحات حساب از Page Cache خارج باشند.
  • صفحه 2FA و Challenge کش نشود.
  • Delay JS فرم ورود را خراب نکند.
  • پس از تغییر Login URL، Purge انجام شود.
  • ESI فقط با تنظیم سازگار استفاده شود.

WoodMart و Login Popup

WoodMart ممکن است Login Popup، Header Account و فرم My Account را تغییر دهد. پس از نصب افزونه 2FA یا CAPTCHA موارد زیر را تست کنید:

  • ورود از Popup
  • Redirect بعد از ورود
  • نمایش مرحله دوم احراز هویت
  • Lost Password
  • ورود از Checkout
  • موبایل و RTL

اگر 2FA فقط در wp-login.php کار می‌کند اما Popup آن را دور می‌زند، افزونه برای قالب و فرم سفارشی مناسب نیست.

برنامه پیشنهادی استقرار برای سایت فعلی

  1. از فایل و دیتابیس بکاپ کامل گرفته شود.
  2. یک Staging با همان WoodMart و افزونه‌های سفارشی ساخته شود.
  3. افزونه 2FA سازگار با WordPress 7.0.2 انتخاب شود.
  4. TOTP برای Administrator فعال و Recovery Code ذخیره گردد.
  5. Passkey یا کلید امنیتی به‌عنوان روش دوم ثبت شود.
  6. ورود Dashboard، Popup و My Account آزمایش شود.
  7. Application Passwordهای اتصال موجود فهرست و نام‌گذاری شوند.
  8. Rate Limit روی wp-login.php و XML-RPC در WAF آزمایش شود.
  9. Login Log و هشدار ورود مدیر فعال گردد.
  10. بعد از تأیید، تغییرات در سایت اصلی اعمال شوند.

برای جزئیات بکاپ، مقاله آموزش بکاپ و بازیابی وردپرس را مطالعه کنید.

اگر مدیر به‌دلیل 2FA قفل شد چه کنیم؟

ترتیب امن بازیابی:

  1. Recovery Code را امتحان کنید.
  2. Authenticator یا Passkey پشتیبان را استفاده کنید.
  3. از نشست مدیریتی فعال روی دستگاه دیگر تنظیم را اصلاح نمایید.
  4. از روش Recovery رسمی افزونه استفاده کنید.
  5. در صورت ضرورت، افزونه را از File Manager موقتاً غیرفعال کنید.
  6. پس از ورود، 2FA را دوباره تنظیم و Log را بررسی نمایید.

حذف مستقیم Metaهای ناشناخته از دیتابیس آخرین راه و نیازمند بکاپ است؛ ساختار هر افزونه متفاوت است.

اگر Login مشکوک مشاهده کردیم چه کنیم؟

  1. زمان، IP و User Agent را ثبت کنید.
  2. همه Sessionهای حساب را لغو نمایید.
  3. رمز اصلی را از دستگاه سالم تغییر دهید.
  4. 2FA Secret و Recovery Codeها را دوباره بسازید.
  5. Application Passwordها را Revoke و Rotate کنید.
  6. ایمیل مدیر و Sessionهای آن را بررسی نمایید.
  7. Userهای Administrator و نقش‌ها را بازبینی کنید.
  8. فایل‌ها، افزونه‌ها و Log سرور را کنترل نمایید.
  9. در صورت نفوذ، برنامه Incident Response را اجرا کنید.

فقط مسدودکردن IP کافی نیست؛ Credential یا Session ممکن است در اختیار مهاجم باقی مانده باشد.

خطا: کد TOTP پذیرفته نمی‌شود

  • ساعت موبایل یا سرور دقیق نیست.
  • QR Code مربوط به حساب دیگری است.
  • Secret پس از تنظیم مجدد تغییر کرده است.
  • کد دوره قبلی منقضی شده است.
  • افزونه Cache یا Login Flow را خراب کرده است.

Time Sync دستگاه را خودکار کنید و Recovery Code را آماده داشته باشید.

خطا: Passkey در مرورگر کار نمی‌کند

  • HTTPS کامل نیست.
  • دامنه یا Subdomain تغییر کرده است.
  • مرورگر یا دستگاه WebAuthn را پشتیبانی نمی‌کند.
  • Credential روی دستگاه دیگری ثبت شده است.
  • افزونه با فرم ورود سفارشی سازگار نیست.

خطا: سایت همه کاربران را قفل کرده است

Rule بیش‌ازحد سخت، IP مشترک، Reverse Proxy نادرست یا عدم تشخیص IP واقعی می‌تواند علت باشد. WAF باید Header معتبر Proxy را بشناسد و Lockout صرفاً براساس IP مشترک نباشد.

خطا: Application Password با 401 یا 403 مواجه می‌شود

  • سایت HTTPS را درست تشخیص نمی‌دهد.
  • Header Authorization در Proxy حذف می‌شود.
  • Credential لغو شده است.
  • User Capability کافی ندارد.
  • افزونه امنیتی REST API را مسدود کرده است.

رمز Application برای ورود مرورگری نیست و باید با Username حساب در HTTP Basic Auth استفاده شود.

خطا: CAPTCHA ورود مشتری را خراب کرده است

فرم My Account، Checkout Block، Login Popup و AJAX را جداگانه آزمایش کنید. ممکن است افزونه فقط فرم استاندارد WordPress را پشتیبانی کند.

چک‌لیست امنیت ورود وردپرس

  • هر فرد حساب مستقل دارد.
  • Administrator اضافی وجود ندارد.
  • رمز مدیر منحصربه‌فرد و طولانی است.
  • Password Manager استفاده می‌شود.
  • 2FA برای نقش‌های حساس فعال است.
  • Recovery Code خارج از سایت نگهداری می‌شود.
  • حداقل دو روش بازیابی وجود دارد.
  • Passkey یا کلید امنیتی برای مدیر ثبت شده است.
  • Rate Limit در WAF یا سرور فعال است.
  • CAPTCHA فقط در شرایط لازم نمایش داده می‌شود.
  • XML-RPC براساس نیاز کنترل شده است.
  • Application Password برای هر Integration جدا است.
  • Credential بلااستفاده لغو شده است.
  • Sessionهای مدیر قابل بازبینی و لغو هستند.
  • ایمیل مدیر 2FA دارد.
  • ورود My Account و Checkout آزمایش شده است.
  • Login Log داده حساس ذخیره نمی‌کند.
  • برنامه بازیابی حساب مستند است.

📌 همچنین بخوانید: ارتقای نسخه PHP وردپرس، نگهداری دوره‌ای وردپرس و انتقال وردپرس به هاست جدید

پرسش‌های متداول

آیا WordPress به‌صورت پیش‌فرض 2FA دارد؟

خیر. در مستندات فعلی برای 2FA و Passkey باید افزونه معتبر یا Identity Provider استفاده شود.

بهترین روش دومرحله‌ای چیست؟

برای مدیر، Passkey یا کلید امنیتی مقاومت بالایی در برابر Phishing دارد. TOTP نیز گزینه عملی و رایجی است. Recovery مستقل در هر دو حالت ضروری است.

آیا تغییر آدرس wp-login امنیت را کامل می‌کند؟

خیر. فقط بخشی از Botهای ساده را کاهش می‌دهد. رمز منحصربه‌فرد، 2FA و Rate Limit مهم‌ترند.

آیا باید 2FA را برای مشتریان اجباری کنیم؟

برای فروشگاه عمومی معمولاً مدیران و کاربران حساس اولویت دارند. اجبار برای همه مشتریان باید با نوع محصول، ریسک حساب و اثر آن بر Checkout سنجیده شود.

Application Password همان رمز حساب است؟

خیر. Credential جداگانه برای API است، فقط یک بار نمایش داده می‌شود و به‌صورت مستقل قابل لغو است.

چطور همه Sessionهای مدیر را ببندیم؟

از Profile گزینه Log Out Everywhere Else یا از WP-CLI دستور wp user session destroy USER --all را اجرا کنید.

آیا SMS برای 2FA امن است؟

از رمز تنها بهتر است، اما نسبت به TOTP، Passkey و کلید امنیتی در برابر SIM Swap و حملات اپراتوری آسیب‌پذیرتر است.

جمع‌بندی

امنیت ورود وردپرس باید چند لایه باشد. رمز منحصربه‌فرد جلوی Credential Stuffing را کاهش می‌دهد، 2FA اثر نشت رمز را محدود می‌کند، Passkey در برابر Phishing مقاوم‌تر است، Rate Limit فشار Botها را کنترل می‌کند و مدیریت Session و Application Password دامنه دسترسی‌های قدیمی را می‌بندد.

برای سایت فعلی، اولویت عملی فعال‌سازی 2FA برای تنها حساب Administrator، ثبت روش بازیابی مستقل، بررسی Application Password اتصال برنامه‌ای و آزمایش Rate Limit سازگار با WooCommerce است. همه تغییرات باید ابتدا روی Staging و همراه My Account، Checkout، REST API و WoodMart تست شوند.

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

منابع رسمی

آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.

دیدگاهتان را بنویسید

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