ایجاد کاربر ادمین وردپرس با MySQL چطور انجام میشود؟
تحلیل مهندسی ایجاد کاربر ادمین وردپرس با MySQL از منظر هش رمز عبور، Capability، Usermeta و امنیت؛ راهنمای عملی برای مدیران سرور و توسعهدهندگان ارشد.
ایجاد کاربر ادمین وردپرس با 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
اعتبارسنجی پس از ایجاد
- ورود به پنل مدیریت: با نام کاربری و رمز جدید.
- بررسی دسترسی: دسترسی به تمام بخشهای ادمین.
- بررسی Usermeta: Capability و User Level.
- بررسی Cache: پاکسازی Object Cache در صورت استفاده از Redis.
- لاگگیری: ثبت رویداد در 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. تجربهی خودتان را در دیدگاهها بنویسید.