در یکی از پروژه‌های سال‌های پیش، کارفرما گفت دوازده نویسندهٔ تیم را همه با نقش ادمین بسازم. منطقش هم ساده بود: «نمی‌خواهم هر بار درگیر دسترسی‌ها شوم.» سه هفته بعد، یکی از همان کاربران ادمین، افزونه‌ای نصب کرده بود که سایت را به فهرست سیاه گوگل برده بود. آن تجربه یک درس گران به من داد که امروز در هر پروژه تکرار می‌کنم: نقش کاربری، ابزار راحتی نیست؛ ابزار امنیتی است. سؤالی که زیاد می‌شنوم، «چطور کاربر جدید اضافه کنیم؟» اما سؤال درست این است: «با چه نقشی و چطور امن؟». این مقاله، پاسخ عملی همان سؤال دوم است.

نقش کاربری در وردپرس دقیقاً چه چیزی را کنترل می‌کند؟

وردپرس یک سیستم دسترسی مبتنی بر نقش (Role-Based Access Control) دارد. هر کاربر یک نقش می‌گیرد و هر نقش مجموعه‌ای از مجوزها (Capabilities) را در خود دارد. یعنی به‌جای اینکه برای هر کاربر بگوییم «می‌تواند پست بنویسد، نمی‌تواند افزونه نصب کند»، این مجوزها در قالب نقش‌ها از پیش تعریف شده‌اند و ما فقط نقش را اختصاص می‌دهیم.

این تفکیک، مزیت بزرگ و در عین حال دام پنهانی دارد. مزیتش این است که می‌توان سطح دسترسی‌ها را استاندارد کرد؛ دامش این است که اگر نقش ادمین را به کسی بدهید، عملاً کلید همه‌چیز را داده‌اید — نصب افزونه، تعویض قالب، حذف کاربر، تغییر URL سایت، و حتی ویرایش فایل‌های قالب (اگر DISALLOW_FILE_EDIT غیرفعال باشد). این همان نکته‌ای است که در امن کردن ورود ادمین وردپرس هم تکرار کرده‌ام.

در وردپرس، نقش ادمین به معنای «مدیر محتوا» نیست؛ به معنای «مالک فنی سایت» است. این را با دقت تقسیم کنید.

پنج نقش استاندارد وردپرس — کدام برای چه کسی؟

وردپرس به‌صورت پیش‌فرض پنج نقش دارد. جدول زیر، خلاصهٔ تفاوت‌هاست:

نقشمجوزهای کلیدیمناسب برای
Administrator (مدیر)دسترسی کامل به همه‌چیز: افزونه، قالب، کاربران، تنظیماتفقط مالک یا مدیر فنی — یک تا دو نفر
Editor (ویرایشگر)مدیریت و انتشار همهٔ نوشته‌ها و برگه‌ها، مدیریت دسته‌ها و برچسب‌ها، مدیریت دیدگاه‌هاسردبیر محتوا؛ کسی که مسئول انتشار است
Author (نویسنده)نوشتن، انتشار و ویرایش نوشته‌های خودش، آپلود فایلنویسندگان مستقل محتوا
Contributor (مشارکت‌کننده)نوشتن پیش‌نویس، بدون توان انتشار یا آپلود فایلنویسندگان تازه یا مهمان
Subscriber (مشترک)فقط ورود و ویرایش پروفایل خودشکاربران عضویت‌دار، مشتریان سایت فروشگاهی

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

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

افزودن کاربر، فقط پر کردن سه فیلد نیست. سه سؤال باید پیش از هر افزودن جواب بگیرند:

تصمیم اول: نقش واقعی این کاربر چیست؟

نه نقش راحت‌تر، نه نقش بالاتر؛ نقش دقیق. اگر کسی فقط باید محتوا ببیند و کامنت بگذارد، Subscriber کافی است. اگر می‌خواهد پست بنویسد، Contributor. اگر مسئول انتشار است، Editor. فقط آن یک یا دو نفر که فنی هستند، Administrator.

تصمیم دوم: آیا این کاربر باید فقط یک سایت را ببیند یا چند سایت؟

اگر سایت شما Multisite (چند‌سایتی) است، کاربر می‌تواند در سطح شبکه یا فقط در یک سایت نقش داشته باشد. این تصمیم را همان اول بگیرید — بعداً تغییر دادنش دردناک است.

تصمیم سوم: از چه راهی رمز به کاربر برسد؟

وردپرس دو مسیر پیشنهاد می‌کند: (۱) خودتان رمز تعیین کنید، (۲) به کاربر ایمیل بازیابی رمز ارسال شود. توصیهٔ من، گزینهٔ دوم است. رمزی که در ایمیل متنی می‌رود، از دیدگاه امنیتی همیشه یک نقطهٔ ضعف است. راه سوم — افزونه‌ای که لینک دعوت با انقضای زمانی می‌فرستد — انتخاب تمیزترین است.

افزودن کاربر جدید از پنل مدیریت — گام‌به‌گام

مسیر ساده‌اش این است:

  1. وارد پیشخوان شوید و به «کاربران ← افزودن جدید» بروید.
  2. در فیلد «نام کاربری»، یک نام یکتا و غیرقابل‌حدس بگذارید (جزئیاتش در بخش بعد).
  3. ایمیل کاربر را وارد کنید — این همان جایی است که رمز و اطلاعیه‌ها به آن می‌رسد.
  4. در بخش «رمز عبور»، بین دو گزینه انتخاب کنید: تعیین رمز توسط شما، یا ارسال لینک بازیابی به کاربر.
  5. نقش مناسب را از منوی کشویی انتخاب کنید.
  6. روی «افزودن کاربر» بزنید.

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

اما یک نکتهٔ ظریف که در پیشخوان نمی‌بینید: وردپرس به‌طور پیش‌فرض، ایمیلی برای اطلاع به کاربر نمی‌فرستد مگر گزینهٔ «ارسال اعلان به کاربر» را تیک بزنید. اگر بدون تیک، کاربر را اضافه کنید، کاربر متوجه نمی‌شود. گاهی همین جزئیات، منبع «کاربر اضافه کردم اما وارد نمی‌شود» می‌شود.

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

نام کاربری، ایمیل و رمز — سه پارامتر حساس

سه فیلد اساسی در افزودن کاربر، هر سه به‌ظاهر ساده و در واقعیت، بسیار حساس. یک‌به‌یک:

نام کاربری

وردپرس به شما اجازهٔ تغییر نام کاربری را در پنل نمی‌دهد؛ فقط از دیتابیس یا افزونه. یعنی اگر روز اول یک نام کاربری حدس‌زدنی مثل admin انتخاب کنید، مادام‌العمر با آن درگیرید. توصیهٔ من: نام کاربری غیرقابل‌حدس مثل ترکیب چند کلمه یا حروف تصادفی با معنا. توجه کنید که ایمیل ورود و نام کاربری، هر دو برای ورود قابل استفاده هستند — این یعنی نام کاربری ایمیل، سطح حملهٔ دیگری می‌سازد که ایمیل‌های عمومی مثل info@example.com را باید برای ورود غیرفعال کنید.

ایمیل

ایمیل، مسیر بازیابی رمز و اطلاع‌رسانی است. اگر ایمیل اشتباه باشد، کاربر نمی‌تواند رمز را بازیابی کند و در نهایت درخواست می‌کند شما دسترسی را دستی بدهید. همیشه یک ایمیل معتبر بگیرید — ترجیحاً همان ایمیل کاری خود کاربر، نه ایمیل مشترک تیم. علاوه بر این، بخشی از امنیت سایت به امنیت همان صندوق ایمیل وابسته است؛ اگر ایمیل کاربر هک شود، ورود به سایت هم در خطر است. به همین دلیل در فعال‌سازی 2FA برای کاربران وردپرس توصیه می‌کنم که آن ایمیل هم باید با احراز هویت دومرحله‌ای محافظت شود.

رمز عبور

ساده‌ترین اشتباه، انتخاب رمز برای کاربر است. به‌جای این کار، از وردپرس بخواهید به کاربر ایمیل بازیابی بفرستد. این کار دو مزیت دارد: اول اینکه شما رمز کاربر را نمی‌دانید — و این برای حفظ مسئولیت‌پذیری خوب است؛ دوم اینکه کاربر خودش رمزی قوی انتخاب می‌کند. اصول رمز عبور در مدیریت رمز عبور امن چه اصولی دارد آمده است.

افزودن کاربر از طریق کد با wp_insert_user

اگر پروژه‌ای دارید که باید چند کاربر را برنامه‌ریزی‌شده اضافه کند (مثلاً در یک فرآیند استقرار یا مهاجرت)، استفاده از تابع هستهٔ وردپرس گزینهٔ تمیزتری است. تابع wp_insert_user آرایه‌ای از پارامترها می‌گیرد و آی‌دی کاربر را برمی‌گرداند:

$user_id = wp_insert_user( array(
    'user_login' => 'sara_editor',
    'user_email' => 'sara@example.com',
    'user_pass'  => wp_generate_password( 20, true, true ),
    'first_name' => 'سارا',
    'last_name'  => 'محمدی',
    'role'       => 'editor',
) );

if ( is_wp_error( $user_id ) ) {
    error_log( $user_id->get_error_message() );
}

سه نکتهٔ فنی که در این قطعه باید به آن‌ها دقت کنید:

  • always check is_wp_error: اگر نام کاربری یا ایمیل تکراری باشد، wp_insert_user یک WP_Error برمی‌گرداند، نه آی‌دی. بدون بررسی خطا، باگ‌های پنهانی می‌سازید که به‌سختی پیدا می‌شوند.
  • رمز خودکار تولید کنید: با wp_generate_password یک رمز تصادفی قوی بسازید و بعد به کاربر ایمیل بازیابی بفرستید. این ترکیب امن‌تر از انتخاب رمز ثابت است.
  • role را از منبع قابل اعتماد بگیرید: هرگز نقش کاربر را از ورودی کاربر (Form) مستقیماً نگیرید — این خودش یک آسیب‌پذیری افزایش دسترسی (Privilege Escalation) است.

این کد را در functions.php قالب فرزند قرار ندهید؛ آن را در یک افزونهٔ اختصاصی یا در فایل migration یک‌بارمصرف بگذارید. دلایل این تفکیک را در قالب فرزند چیست و چه زمانی به آن نیاز داریم توضیح داده‌ام.

افزودن کاربر از دیتابیس — مسیر فنی

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

وردپرس اطلاعات کاربران را در دو جدول نگه می‌دارد: wp_users (اطلاعات پایه) و wp_usermeta (مجوزها و متادیتا). برای افزودن دستی، باید هر دو جدول به‌روز شوند. اگر فقط جدول اول را بنویسید، کاربر در پایگاه داده هست اما وردپرس آن را با نقش درست نمی‌بیند. حداقل دو رکورد در wp_usermeta لازم است: یکی برای wp_capabilities و یکی برای wp_user_level. رمز در wp_users به‌صورت هش ذخیره می‌شود — و هش وردپرس از نوع phpass است، نه MD5 ساده.

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

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

وقتی نیاز از پنج نقش استاندارد عبور می‌کند — مثلاً می‌خواهید یک نقش «مدیر فروشگاه» با دسترسی محدود به ووکامرس بسازید — دو راه پیش روی شماست:

  • افزونه‌های مدیریت نقش: رابط گرافیکی می‌دهند و مجوزها را با چک‌باکس تنظیم می‌کنید. سریع، بی‌دردسر، مناسب اکثر پروژه‌ها.
  • نقش سفارشی با کد: با add_role و بعد add_cap، نقش دلخواه می‌سازید. تمیزتر و قابل نسخه‌بندی، اما نیاز به درک مجوزها دارد.

در انتخاب افزونه، همان معیارهای فیلتر کردن افزونه‌ها را رعایت کنید که در افزونه وردپرس چیست و چگونه افزونه مناسب انتخاب کنیم گفتم. افزونهٔ نقش، دسترسی سطح مدیر دارد؛ انتخاب اشتباهش، امنیت کل سایت را زیر سؤال می‌برد. یکی از افزونه‌های امنیتی محبوب را هم که ترکیب مدیریت کاربر و امنیت را یک‌جا انجام می‌دهد، در بهترین افزونه‌های امنیت ورود وردپرس معرفی کرده‌ام.

امنیت کاربران: چهار نکته‌ای که همیشه چک می‌کنم

در هر پروژه، قبل از تحویل نهایی، این چهار مورد را چک می‌کنم:

۱. فهرست کاربران ادمین

هر کاربر ادمین، یک در باز است. اگر بیش از دو ادمین دارید، بررسی کنید چرا. معمولاً یکی از آن‌ها کاربر تستی است که فراموش شده، یا حساب قدیمی که دیگر استفاده نمی‌شود. حذف همین کاربران ناشناس، یکی از بزرگ‌ترین بردها در امنیت کاربران است.

۲. ایمیل کاربران ادمین

ایمیل ادمین باید یک ایمیل امن، فعال، و ترجیحاً با 2FA محافظت‌شده باشد. اگر ادمین از ایمیل مشترک تیم استفاده می‌کند، یک شکاف امنیتی جدی است، چون ورود به آن ایمیل، مستقیم به بازیابی رمز سایت منتهی می‌شود.

۳. تاریخچهٔ ورود و آخرین فعالیت

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

۴. اجبار 2FA برای نقش‌های بالا

در پنل‌های مدیریتی تیمی، اجبار 2FA برای نقش‌های Editor و Administrator، یک تصمیم اجتناب‌ناپذیر است. خود راه‌اندازی را در فعال‌سازی 2FA برای کاربران وردپرس و اصول کلی‌اش را در احراز هویت دو مرحله‌ای چگونه امنیت را افزایش می‌دهد آورده‌ام.

هر کاربری که در فهرست کاربران سایت می‌بینید، یک در است. سؤال همیشگی این است: آیا این در را باز گذاشته‌ام یا بسته؟

اشتباهات رایج در افزودن و مدیریت کاربران

چهار اشتباهی که در بازبینی سایت‌ها بیشتر از همه می‌بینم:

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

و یک توصیهٔ پیشگیرانه: پس از هر تغییر در فهرست کاربران — افزودن، حذف یا تغییر نقش — بکاپ بگیرید و یک اسکرین‌شات از فهرست کاربران نگه دارید. در پروژه‌هایی که این عادت را داشتم، بازیابی بعد از اشتباه چند دقیقه‌ای بود؛ در پروژه‌هایی که نداشتم، چند ساعتی.

حرف آخر: کمترین دسترسی، بیشترین امنیت

افزودن کاربر جدید به وردپرس، فنی‌ترین کار این مقاله نبود؛ اما یکی از تصمیم‌هایی است که بیشترین اثر بلندمدت را روی امنیت سایت دارد. سه اقدام ساده، تفاوت را می‌سازند: انتخاب نقش بر اساس کمترین دسترسی لازم (Principle of Least Privilege)، اجبار 2FA برای نقش‌های بالا، و بازبینی فصلی فهرست کاربران. اگر همین سه را در پروژه‌هایتان اجرا کنید، بیش از هر افزونهٔ امنیتی، به سایت خودتان خدمت کرده‌اید.

اگر تجربه‌ای از پروژه‌ای دارید که مدیریت کاربران در آن دردسر شده — چه به‌دلیل اشتباه نقش‌بندی، چه به‌دلیل حادثهٔ امنیتی — خوشحال می‌شوم در دیدگاه‌ها بخوانم. برای خواننده‌های بعدی، همان جزئیات واقعی از هر کتاب راهنما کاربردی‌تر است. 👥