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

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

چه زمانی به این روش نیاز داریم

ایجاد حساب مدیر بدون پنل در سناریوهای زیر ضروری است:

  • فراموشی رمز عبور ادمین: و ایمیل بازیابی در دسترس نیست.
  • حذف ناخواسته‌ی کاربران: تمام ادمین‌ها حذف شده‌اند.
  • حمله‌ی هکر: دسترسی ادمین مسدود شده است.
  • خرابی دیتابیس: پنل ادمین بارگذاری نمی‌شود.
  • خطای افزونه: افزونه‌ی امنیتی دسترسی را مسدود کرده.
  • مهاجرت: انتقال سایت از سرور قدیمی.
  • تنظیمات نادرست: تغییر اشتباه Role.
  • پاک‌سازی تهاجمی: حذف کاربران توسط اسکریپت پاک‌سازی.

آماده‌سازی و دسترسی

پیش از هر عملیات، آماده‌سازی دقیق ضروری است:

  1. دسترسی به MySQL: از طریق SSH یا phpMyAdmin.
  2. اطلاعات اتصال: در wp-config.php.
  3. Backup کامل: از دیتابیس.
  4. دسترسی به فایل‌سیستم: برای تولید هش با PHP.
  5. محیط ایزوله: در صورت امکان، تست در Staging.
  6. IP Whitelist: محدودسازی دسترسی به MySQL.
# بکاپ کامل پیش از عملیات
mysqldump -u user -p database > backup-$(date +%Y%m%d-%H%M).sql

# بررسی اطلاعات اتصال
cat /var/www/html/wp-config.php | grep -E "DB_NAME|DB_USER|DB_HOST"

برای مطالعه‌ی بیشتر، پست ایجاد کاربر ادمین وردپرس با MySQL مرجع کاملی است.

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

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

$P$B1234567890abcdefghijklmnopqrstuv

روش ۱: تولید با WP-CLI

wp eval 'echo wp_hash_password("MyNewPassword123!") . "
";'

روش ۲: تولید با PHP Script

php -r '
require_once("/var/www/html/wp-load.php");
echo wp_hash_password("MyNewPassword123!") . "
";
'

روش ۳: تولید با class-phpass

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

روش ۴: تولید با Python

در صورت نبود PHP، می‌توان از کتابخانه‌های Python استفاده کرد. اما این روش پیچیده‌تر است و توصیه نمی‌شود.

روش ۵: MD5 (اضطراری)

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

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

هشدار: MD5 ناامن است و تنها برای بازیابی اضطراری استفاده شود. پس از ورود، رمز عبور باید فوراً تغییر یابد.

ایجاد کاربر در 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 (
  "recovery_admin",
  "$P$Bxxxxx...",
  "recovery_admin",
  "recovery@example.com",
  "",
  NOW(),
  "",
  0,
  "Recovery Administrator"
);

دریافت ID کاربر ایجادشده:

SELECT LAST_INSERT_ID() AS user_id;
-- یا
SELECT ID FROM wp_users WHERE user_login = "recovery_admin";

تنظیم Capability در wp_usermeta

SET @user_id = (SELECT ID FROM wp_users WHERE user_login = "recovery_admin");

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", "recovery_admin"),
(@user_id, "first_name", ""),
(@user_id, "last_name", ""),
(@user_id, "description", ""),
(@user_id, "rich_editing", "true"),
(@user_id, "syntax_highlighting", "true"),
(@user_id, "comment_shortcuts", "false"),
(@user_id, "admin_color", "fresh"),
(@user_id, "use_ssl", "0"),
(@user_id, "show_admin_bar_front", "true"),
(@user_id, "locale", "");

نکته‌ی مهم: meta_value برای Capability به‌صورت Serialized Array ذخیره می‌شود:

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

ساختار:

  • a:1: Array با یک عنصر.
  • s:13: String با طول ۱۳.
  • "administrator": نام Role.
  • b:1: Boolean true.

Cache Invalidation

در صورت استفاده از Object Cache (Redis، Memcached)، Cache باید پاک شود:

# پاک‌سازی Redis
redis-cli FLUSHALL

# پاک‌سازی Memcached
echo "flush_all" | nc localhost 11211

# پاک‌سازی Cache وردپرس با WP-CLI
wp cache flush

در صورت استفاده از افزونه‌ی Cache (مانند WP Rocket، W3TC)، Cache صفحه و Object نیز باید پاک شود.

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

برای سرعت و کاهش خطا، می‌توان تمام عملیات را در یک Transaction انجام داد:

START TRANSACTION;

SET @username = "emergency_admin";
SET @password = "$P$Bxxxxx...";
SET @email = "emergency@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),
(@user_id, "rich_editing", "true"),
(@user_id, "admin_color", "fresh"),
(@user_id, "show_admin_bar_front", "true");

COMMIT;

SELECT @user_id AS created_user_id;

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

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

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

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

SET @user_id = (SELECT ID FROM wp_users WHERE user_login = "existinguser");

UPDATE wp_usermeta
SET meta_value = 'a:1:{s:13:"administrator";b:1;}'
WHERE user_id = @user_id AND meta_key = "wp_capabilities";

UPDATE wp_usermeta
SET meta_value = "10"
WHERE user_id = @user_id AND meta_key = "wp_user_level";

-- در صورت نبود رکورد، درج کنید
INSERT INTO wp_usermeta (user_id, meta_key, meta_value)
SELECT @user_id, "wp_capabilities", 'a:1:{s:13:"administrator";b:1;}'
WHERE NOT EXISTS (
  SELECT 1 FROM wp_usermeta
  WHERE user_id = @user_id AND meta_key = "wp_capabilities"
);

۳. حذف مسدودسازی توسط افزونه‌ی امنیتی

-- حذف محدودیت IP
DELETE FROM wp_options WHERE option_name LIKE "%limit_login%";

-- حذف قفل حساب
DELETE FROM wp_usermeta
WHERE meta_key LIKE "%capabilities%"
AND user_id = (SELECT ID FROM wp_users WHERE user_login = "admin");

۴. بازیابی پس از حمله‌ی هکر

-- حذف کاربران ناشناس
DELETE FROM wp_users WHERE user_registered > "2024-01-01"
AND ID NOT IN (SELECT user_id FROM wp_usermeta WHERE meta_key = "wp_capabilities"
AND meta_value LIKE "%administrator%");

-- ایجاد کاربر ادمین اضطراری
-- (طبق مراحل قبل)

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

  • رمز عبور قوی: حداقل ۱۲ کاراکتر با ترکیب متنوع.
  • تغییر فوری رمز: پس از اولین ورود.
  • MFA: فعال‌سازی پس از ورود.
  • محدودسازی IP: برای ورود ادمین.
  • حذف کاربر موقت: پس از بازیابی.
  • Audit Log: ثبت رویداد در Error Log.
  • اجرای از Localhost: پرهیز از اسکریپت روی اینترنت.
  • HTTPS: اجبار HTTPS برای ورود.
  • پاک‌سازی Cache: پس از عملیات.
  • بررسی Backup: تأیید صحت Backup پیش از عملیات.
// در wp-config.php
define("FORCE_SSL_ADMIN", true);
define("DISALLOW_FILE_EDIT", true);

اعتبارسنجی

  1. ورود به پنل: با نام کاربری و رمز جدید.
  2. بررسی دسترسی: دسترسی به تمام بخش‌های ادمین.
  3. بررسی Usermeta: Capability و User Level.
  4. بررسی Cache: پاک‌سازی شده.
  5. بررسی Error Log: بدون خطا.
  6. بررسی عملکرد سایت: تمام صفحات.
-- بررسی Usermeta
SELECT um.meta_key, um.meta_value
FROM wp_usermeta um
WHERE um.user_id = (SELECT ID FROM wp_users WHERE user_login = "recovery_admin")
AND um.meta_key IN ("wp_capabilities", "wp_user_level");

-- بررسی کاربران ادمین
SELECT u.ID, u.user_login, u.user_email, um.meta_value
FROM wp_users u
JOIN wp_usermeta um ON um.user_id = u.ID
WHERE um.meta_key = "wp_capabilities"
AND um.meta_value LIKE "%administrator%";

پاک‌سازی پس از عملیات

  1. حذف اسکریپت: rm create-admin.php.
  2. حذف کاربر موقت: در صورت ایجاد کاربر اضطراری.
  3. پاک‌سازی Error Log: حذف اطلاعات حساس.
  4. بروزرسانی Backup: بکاپ جدید پس از تغییرات.
  5. مستندسازی: ثبت رویداد در گزارش تیم.
# حذف کاربر اضطراری با WP-CLI
wp user delete emergency_admin --yes --reassign=1

# حذف اسکریپت
rm -f /var/www/html/create-admin.php

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

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

با WP-CLI یا افزونه. در غیر این صورت، می‌توان از MD5 اضطراری استفاده کرد.

چرا Cache باید پاک شود؟

چون Cache ممکن است اطلاعات قدیمی کاربران را نگه دارد و تغییرات اعمال نشود.

آیا MD5 واقعاً کار می‌کند؟

بله، وردپرس در اولین ورود، هش را به phpass ارتقا می‌دهد. اما این روش ناامن است.

چگونه Capability را مستقیماً تنظیم کنیم؟

با INSERT یا UPDATE روی wp_usermeta با meta_key = "wp_capabilities".

آیا پس از ایجاد کاربر، نیاز به Restart سرور است؟

خیر، تنها Cache باید پاک شود.

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

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

چگونه از حمله‌ی هکر پس از بازیابی جلوگیری کنیم؟

با تغییر رمزها، فعال‌سازی MFA، بررسی لاگ‌ها و به‌روزرسانی افزونه‌ها.

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

اشتباه علت راه‌حل
عدم Backup پیش از عملیات شتاب در بازیابی Backup کامل
استفاده از MD5 بدون تغییر بعدی ناآشنایی تغییر رمز پس از ورود
عدم تنظیم Usermeta فرض کافی بودن wp_users درج Capability
فراموشی Cache Invalidation فرض نبود Cache پاک‌سازی Redis/Memcached
عدم حذف اسکریپت غفلت از امنیت حذف فوری
رمز عبور ضعیف شتاب رمز قوی
عدم حذف کاربر موقت فراموشی حذف کاربر
اجرای اسکریپت از اینترنت عدم محدودسازی اجرا از Localhost

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

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

۱. Emergency Access Plan: مستندسازی فرآیند بازیابی.

۲. Password Vault: نگهداری رمز اضطراری در Vault.

۳. MFA Backup Codes: نگهداری Backup Codes در محل امن.

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

۵. Audit Log: ثبت تمام رویدادها.

۶. Automation: با WP-CLI و اسکریپت.

۷. Monitoring: پایش ورودهای مشکوک.

۸. Backup Strategy: بکاپ منظم و تست‌شده.

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

نتیجه

ایجاد حساب مدیر وردپرس با MySQL بدون پنل یک عملیات مهندسی چندمرحله‌ای است که نیازمند درک هش phpass، Capability، Usermeta و Cache Invalidation است. این روش، در مواقع بحران نجات‌بخش است، اما نیازمند احتیاط، Backup و پاک‌سازی دقیق پس از عملیات است. ملاحظات امنیتی و اعتبارسنجی، بخشی جدایی‌ناپذیر از فرآیند است.

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