ایجاد کاربر ادمین وردپرس با MySQL یکی از عملیات حساس و در عین حال ضروری در نگهداری سایت است که می‌تواند در سناریوهای مختلف به کار آید: بازگرداندن دسترسی پس از فراموشی رمز عبور، بازیابی سایت پس از حذف ناخواسته‌ی کاربران، یا ایجاد دسترسی اضطراری در مواقع بحرانی. اما این عملیات، برخلاف تصور رایج، تنها با یک INSERT ساده انجام نمی‌شود. وردپرس برای احراز هویت، از هش phpass (در نسخه‌های قدیمی) یا bcrypt (در نسخه‌های مدرن با افزونه) استفاده می‌کند و دسترسی ادمین، از طریق ترکیب جدول wp_users، wp_usermeta و Capability تعریف می‌شود. در این راهنما، فرآیند مهندسی ایجاد کاربر ادمین وردپرس با MySQL، از ساختار جداول تا کوئری‌های دقیق و ملاحظات امنیتی، بررسی می‌شود.

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

ساختار جداول کاربران در وردپرس

وردپرس از دو جدول اصلی برای مدیریت کاربران استفاده می‌کند:

wp_users

ستون نوع توضیح
ID BIGINT شناسه یکتا
user_login VARCHAR(60) نام کاربری
user_pass VARCHAR(255) هش رمز عبور
user_nicename VARCHAR(50) نام نمایشی در URL
user_email VARCHAR(100) ایمیل
user_url VARCHAR(100) وب‌سایت
user_registered DATETIME تاریخ ثبت‌نام
user_activation_key VARCHAR(255) کلید فعال‌سازی
user_status INT وضعیت (منسوخ)
display_name VARCHAR(250) نام نمایشی

wp_usermeta

ستون نوع توضیح
umeta_id BIGINT شناسه یکتا
user_id BIGINT ارجاع به wp_users
meta_key VARCHAR(255) کلید متادیتا
meta_value LONGTEXT مقدار متادیتا

هش رمز عبور در وردپرس

وردپرس از کتابخانه‌ی phpass برای هش رمز عبور استفاده می‌کند. فرمت هش:

$P$B1234567890abcdefghijklmnopqrstuv

ساختار:

  • $P$: پیشوند phpass.
  • B: یک کاراکتر برای Iteration Count.
  • ۸ کاراکتر Salt.
  • ۲۲ کاراکتر Hash.

تولید هش با PHP

// تولید هش با WordPress
require_once("/path/to/wp-load.php");
$hash = wp_hash_password("MyNewPassword123!");
echo $hash;

// با استفاده از PasswordHash
require_once("class-phpass.php");
$hasher = new PasswordHash(8, true);
$hash = $hasher->HashPassword("MyNewPassword123!");

تولید هش با PHP CLI

php -r '
require_once("/var/www/html/wp-includes/class-phpass.php");
$hasher = new PasswordHash(8, true);
echo $hasher->HashPassword("MyNewPassword123!") . "
";
'

روش جایگزین: MD5 (ناامن)

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

UPDATE wp_users SET user_pass = MD5("MyNewPassword123!")
WHERE user_login = "admin";

هشدار: این روش تنها برای بازیابی اضطراری و در محیط ایزوله استفاده شود.

Capability و Role

دسترسی ادمین در وردپرس از طریق Capability تعریف می‌شود. Role ادمین شامل تمام Capabilityها است.

// Capabilityهای ادمین
$admin_caps = [
  "administrator" => true,
  "manage_options" => true,
  "edit_posts" => true,
  "delete_posts" => true,
  "publish_posts" => true,
  "upload_files" => true,
  "edit_users" => true,
  "delete_users" => true,
  "create_users" => true,
  "manage_categories" => true,
  "manage_links" => true,
  "moderate_comments" => true,
  "unfiltered_html" => true,
  "edit_theme_options" => true,
  "activate_plugins" => true,
  "edit_plugins" => true,
  "delete_plugins" => true,
  "install_plugins" => true,
  "update_plugins" => true,
  "install_themes" => true,
  "update_themes" => true,
  "export" => true,
  "import" => true,
];

این Capabilityها در wp_usermeta با meta_key = "wp_capabilities" ذخیره می‌شوند:

a:1:{s:13:"administrator";b:1;}

ایجاد دستی کاربر ادمین

مراحل ایجاد کاربر ادمین با MySQL:

۱. تولید هش رمز عبور

php -r '
require_once("/var/www/html/wp-includes/class-phpass.php");
$hasher = new PasswordHash(8, true);
echo $hasher->HashPassword("SecurePassword123!") . "
";
'
# خروجی: $P$Bxxxxx...

۲. درج در wp_users

INSERT INTO wp_users (
  user_login,
  user_pass,
  user_nicename,
  user_email,
  user_url,
  user_registered,
  user_activation_key,
  user_status,
  display_name
) VALUES (
  "newadmin",
  "$P$Bxxxxx...",
  "newadmin",
  "admin@example.com",
  "",
  NOW(),
  "",
  0,
  "New Administrator"
);

۳. دریافت ID کاربر

SELECT ID FROM wp_users WHERE user_login = "newadmin";
-- فرض: ID = 100

۴. درج Capability در wp_usermeta

INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES
(100, "wp_capabilities", 'a:1:{s:13:"administrator";b:1;}'),
(100, "wp_user_level", "10"),
(100, "nickname", "newadmin"),
(100, "first_name", ""),
(100, "last_name", ""),
(100, "description", ""),
(100, "rich_editing", "true"),
(100, "syntax_highlighting", "true"),
(100, "comment_shortcuts", "false"),
(100, "admin_color", "fresh"),
(100, "use_ssl", "0"),
(100, "show_admin_bar_front", "true"),
(100, "locale", ""),
(100, "wp_dashboard_quick_press_last_post_id", "0");

۵. یکپارچه‌سازی در یک کوئری

SET @username = "newadmin";
SET @password = "$P$Bxxxxx...";
SET @email = "admin@example.com";

INSERT INTO wp_users (
  user_login, user_pass, user_nicename, user_email,
  user_url, user_registered, user_activation_key,
  user_status, display_name
) VALUES (
  @username, @password, @username, @email,
  "", NOW(), "", 0, @username
);

SET @user_id = LAST_INSERT_ID();

INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES
(@user_id, "wp_capabilities", 'a:1:{s:13:"administrator";b:1;}'),
(@user_id, "wp_user_level", "10"),
(@user_id, "nickname", @username);

روش WP-CLI

روش توصیه‌شده‌ی ایجاد کاربر ادمین، WP-CLI است:

# ایجاد کاربر ادمین
wp user create newadmin admin@example.com 
  --role=administrator 
  --user_pass="SecurePassword123!" 
  --display_name="New Administrator"

# بررسی
wp user list --role=administrator
wp user get newadmin

مزایای WP-CLI:

  • مدیریت صحیح هش رمز عبور.
  • یکپارچگی با Cache.
  • مدیریت خودکار Usermeta.
  • لاگ‌گیری.

روش اسکریپت PHP

<?php
// create-admin.php
require_once(__DIR__ . "/wp-load.php");

$username = "newadmin";
$password = "SecurePassword123!";
$email = "admin@example.com";

// بررسی وجود کاربر
if (username_exists($username)) {
    echo "User already exists
";
    exit;
}

if (email_exists($email)) {
    echo "Email already registered
";
    exit;
}

// ایجاد کاربر
$user_id = wp_create_user($username, $password, $email);

if (is_wp_error($user_id)) {
    echo "Error: " . $user_id->get_error_message() . "
";
    exit;
}

// تنظیم Role
$user = new WP_User($user_id);
$user->set_role("administrator");

// تنظیم Display Name
wp_update_user([
    "ID" => $user_id,
    "display_name" => "New Administrator",
]);

echo "User created: ID = {$user_id}
";

اجرا:

php create-admin.php
rm create-admin.php  # پاک‌سازی پس از اجرا

سناریوهای بازیابی

۱. بازگرداندن رمز عبور ادمین موجود

UPDATE wp_users
SET user_pass = "$P$Bxxxxx..."
WHERE user_login = "admin";

۲. ارتقای کاربر به ادمین

UPDATE wp_usermeta
SET meta_value = 'a:1:{s:13:"administrator";b:1;}'
WHERE user_id = (SELECT ID FROM wp_users WHERE user_login = "existinguser")
AND meta_key = "wp_capabilities";

UPDATE wp_usermeta
SET meta_value = "10"
WHERE user_id = (SELECT ID FROM wp_users WHERE user_login = "existinguser")
AND meta_key = "wp_user_level";

۳. بازیابی در صورت حذف تمام ادمین‌ها

با WP-CLI:

wp user list --role=administrator
# اگر خالی بود:
wp user create emergency admin@example.com 
  --role=administrator 
  --user_pass="EmergencyPass123!"

ملاحظات امنیتی

  • رمز عبور قوی: حداقل ۱۲ کاراکتر با ترکیب حروف، اعداد و علائم.
  • پاک‌سازی اسکریپت: حذف اسکریپت پس از اجرا.
  • محدودسازی دسترسی: اجرای اسکریپت تنها از Localhost.
  • Audit Log: ثبت رویداد ایجاد کاربر.
  • MFA: فعال‌سازی پس از ورود.
  • حذف کاربر موقت: پاک‌سازی کاربر اضافی پس از بازیابی.
  • بررسی IP: محدودسازی ورود ادمین به IP مشخص.
  • HTTPS: اجبار HTTPS برای ورود.
// حذف کاربر موقت
wp user delete temporary_admin --yes --reassign=1

اعتبارسنجی پس از ایجاد

  1. ورود به پنل مدیریت: با نام کاربری و رمز جدید.
  2. بررسی دسترسی: دسترسی به تمام بخش‌های ادمین.
  3. بررسی Usermeta: Capability و User Level.
  4. بررسی Cache: پاک‌سازی Object Cache در صورت استفاده از Redis.
  5. لاگ‌گیری: ثبت رویداد در Audit Log.
-- بررسی Usermeta
SELECT * FROM wp_usermeta
WHERE user_id = 100
AND meta_key IN ("wp_capabilities", "wp_user_level");

پرسش‌های پرتکرار

آیا می‌توان بدون دسترسی به پنل، کاربر ادمین ساخت؟

بله، با MySQL یا WP-CLI. اما WP-CLI توصیه می‌شود.

چرا MD5 ناامن است؟

MD5 سریع است و در برابر Rainbow Table آسیب‌پذیر است. وردپرس از phpass استفاده می‌کند.

آیا پس از ایجاد کاربر، باید Cache پاک شود؟

در صورت استفاده از Object Cache (Redis، Memcached)، بله.

چگونه رمز عبور را در دیتابیس تغییر دهیم؟

با تولید هش جدید و UPDATE wp_users.

آیا می‌توان Capability را مستقیماً تغییر داد؟

بله، با UPDATE wp_usermeta روی wp_capabilities.

آیا WP-CLI برای همه‌ی هاست‌ها در دسترس است؟

خیر، برخی هاست‌های اشتراکی WP-CLI را محدود می‌کنند. در این حالت، MySQL یا PHP Script.

چگونه از ایجاد کاربر ناخواسته جلوگیری کنیم؟

با محدودسازی ثبت‌نام، MFA، مانیتورینگ و Audit Log.

اشتباهات رایج

اشتباه علت راه‌حل
استفاده از MD5 ناآشنایی phpass یا bcrypt
عدم تنظیم Usermeta فرض کافی بودن wp_users درج Capability
فراموشی user_level ناآشنایی درج wp_user_level = 10
عدم پاک‌سازی اسکریپت غفلت از امنیت حذف فوری اسکریپت
عدم Cache Invalidation فرض نبود Cache پاک‌سازی Cache
رمز عبور ضعیف شتاب در بازیابی رمز قوی + تغییر پس از بازیابی
عدم حذف کاربر موقت فراموشی حذف کاربر موقت
اجرای اسکریپت از اینترنت عدم محدودسازی اجرا از Localhost

ملاحظات پیشرفته

در سطح معماری، ایجاد کاربر ادمین نیازمند استراتژی جامع است:

۱. WP-CLI Automation: خودکارسازی با اسکریپت و CI/CD.

۲. Audit Log: ثبت تمام رویدادهای ایجاد کاربر.

۳. MFA Integration: فعال‌سازی پس از ایجاد.

۴. IP Whitelisting: محدودسازی ورود ادمین.

۵. Password Policy: با افزونه‌های Password Policy.

۶. Role Management: با Custom Role و Capability.

۷. Backup Integration: بکاپ پیش و پس از تغییر.

۸. Secret Management: با Vault یا KMS.

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

نتیجه

ایجاد کاربر ادمین وردپرس با MySQL یک عملیات مهندسی چندمرحله‌ای است که نیازمند درک هش رمز عبور، Capability و Usermeta است. روش WP-CLI توصیه می‌شود، اما در مواقع اضطراری، MySQL و اسکریپت PHP جایگزین‌های مؤثری هستند. ملاحظات امنیتی، اعتبارسنجی و پاک‌سازی پس از عملیات، بخشی جدایی‌ناپذیر از فرآیند است.

💡 اگر تجربه‌ای در ایجاد یا بازیابی کاربر ادمین وردپرس با MySQL داشته‌اید، برای ما جالب است بدانیم کدام چالش بیشترین زمان را از شما گرفت: تولید هش، تنظیم Capability یا پاک‌سازی Cache. تجربه‌ی خودتان را در دیدگاه‌ها بنویسید.