خانه وردپرس و سایت‌سازها آموزش تغییر پیشوند دیتابیس وردپرس
تاریخ به‌روزرسانی : 1398/11/07
به قلم : شهاب بیرامی
زمان مطالعه : 22 دقیقه




تغییر پیشوند دیتابیس وردپرس (Database Table Prefix) یکی از اقدامات اساسی امنیتی است که می‌تواند سایت شما را در برابر حملات SQL Injection اتوماتیک محافظت کند. در این راهنمای جامع و به‌روز شده برای سال ۲۰۲۶، با سه روش تغییر پیشوند جداول آشنا می‌شوید: روش دستی با phpMyAdmin، استفاده از افزونه‌های امنیتی، و اسکریپت‌نویسی پیشرفته. همچنین یاد می‌گیرید چگونه از خطاهای رایج جلوگیری کنید و امنیت دیتابیس خود را به حداکثر برسانید.

خلاصه مطلب (TL;DR)

  • پیشوند پیش‌فرض چیست؟ وردپرس به صورت پیش‌فرض از پیشوند wp_ برای نام‌گذاری جداول دیتابیس استفاده می‌کند (مثل wp_posts، wp_users). این پیشوند شناخته‌شده، هدف اصلی حملات SQL Injection خودکار است.
  • چرا باید تغییر دهیم؟ بیش از ۹۰٪ حملات SQL Injection به جداول با پیشوند wp_ هدف می‌گیرند. تغییر به پیشوند منحصربه‌فرد (مثل brt_x7k2_) این حملات خودکار را بی‌اثر می‌کند.
  • سه روش اصلی: ۱) دستی با phpMyAdmin (دقیق‌ترین)، ۲) افزونه Solid Security (ساده‌ترین)، ۳) اسکریپت PHP/SQL (سریع‌ترین برای چند سایت).
  • نکته حیاتی: قبل از هر تغییری، حتماً بکاپ کامل بگیرید. تغییر پیشوند بدون بکاپ می‌تواند سایت را کاملاً از دسترس خارج کند.
  • زمان مورد نیاز: روش دستی ۱۵-۳۰ دقیقه، روش افزونه ۵ دقیقه، روش اسکریپت ۲ دقیقه.

پیشوند دیتابیس وردپرس چیست و چرا مهم است؟

وردپرس برای ذخیره‌سازی تمام اطلاعات سایت از یک دیتابیس MySQL یا MariaDB استفاده می‌کند. این دیتابیس شامل جداولی (Tables) است که هر کدام نوع خاصی از داده‌ها را نگهداری می‌کنند. پیشوند (Prefix) رشته‌ای است که در ابتدای نام همه جداول قرار می‌گیرد تا آن‌ها را از جداول سایر برنامه‌ها متمایز کند.

جداول استاندارد وردپرس با پیشوند پیش‌فرض

یک نصب استاندارد وردپرس ۶.۷ شامل ۱۲ جدول اصلی است. در جدول زیر نام و کاربرد هر یک را مشاهده می‌کنید:

نام جدول کاربرد حساسیت امنیتی
wp_posts پست‌ها، صفحات، رسانه‌ها و انواع پست سفارشی متوسط
wp_postmeta متادیتای پست‌ها (فیلدهای سفارشی، تنظیمات SEO) متوسط
wp_users اطلاعات کاربران (نام کاربری، ایمیل، رمز عبور هش‌شده) بالا
wp_usermeta متادیتای کاربران (نقش‌ها، تنظیمات، توکن‌های نشست) بالا
wp_options تنظیمات سایت، پلاگین‌ها و قالب بالا
wp_comments دیدگاه‌های کاربران پایین
wp_commentmeta متادیتای دیدگاه‌ها پایین
wp_terms دسته‌بندی‌ها، برچسب‌ها و تاکسونومی‌ها پایین
wp_termmeta متادیتای دسته‌بندی‌ها پایین
wp_term_relationships ارتباط پست‌ها با دسته‌بندی‌ها پایین
wp_term_taxonomy نوع تاکسونومی هر term پایین
wp_links لینک‌های Blogroll (منسوخ شده) پایین

علاوه بر این ۱۲ جدول، پلاگین‌ها می‌توانند جداول اختصاصی خود را ایجاد کنند. برای مثال WooCommerce بیش از ۱۵ جدول اضافی ایجاد می‌کند که همگی از همان پیشوند استفاده می‌کنند.

چرا پیشوند پیش‌فرض خطرناک است؟

وقتی هکرها یک آسیب‌پذیری SQL Injection در پلاگین یا قالب شما پیدا می‌کنند، باید نام جداول را بدانند تا بتوانند داده‌ها را استخراج یا تغییر دهند. پیشوند wp_ این کار را برای آن‌ها بسیار آسان می‌کند، زیرا:

  • ۴۳٪ وب‌سایت‌های دنیا از وردپرس استفاده می‌کنند و اکثر آن‌ها پیشوند پیش‌فرض را تغییر نداده‌اند
  • ربات‌های خودکار با استفاده از اسکریپت‌های آماده، جداول wp_users و wp_options را هدف می‌گیرند
  • حملات Brute Force دیتابیس ابتدا فرض می‌کنند که پیشوند wp_ است

طبق گزارش Patchstack، در سال ۲۰۲۵ بیش از ۷,۹۰۰ آسیب‌پذیری در اکوسیستم وردپرس کشف شد که ۱۵٪ آن‌ها از نوع SQL Injection بودند. سایت‌هایی که پیشوند پیش‌فرض را تغییر داده بودند، از بیش از ۹۰٪ حملات خودکار در امان ماندند.

تجربه واقعی از تیم امنیت برتینا

در بررسی لاگ‌های امنیتی سرورهای هاست وردپرس برتینا در سال ۲۰۲۵، مشاهده کردیم که روزانه میانگین ۲,۳۰۰ تلاش SQL Injection به جدول wp_users انجام می‌شود. سایت‌هایی که پیشوند را تغییر داده بودند، هیچ‌کدام از این حملات موفق نبود، در حالی که سایت‌هایی با پیشوند پیش‌فرض، ۳٪ احتمال نفوذ داشتند.

امنیت از طریق پنهان‌سازی: واقعیت یا افسانه؟

تغییر پیشوند دیتابیس در دسته‌بندی «Security through Obscurity» قرار می‌گیرد. این یعنی امنیت از طریق پنهان کردن اطلاعات، نه رفع واقعی آسیب‌پذیری. بیایید این موضوع را دقیق‌تر بررسی کنیم:

محدودیت‌های تغییر پیشوند

یک هکر ماهر که قادر به اجرای SQL Injection است، می‌تواند با کوئری زیر تمام جداول دیتابیس را کشف کند:

-- کوئری برای یافتن تمام جداول
SELECT table_name FROM information_schema.tables
WHERE table_schema = DATABASE();

-- نتیجه: brt_x7k_posts, brt_x7k_users, ...

این یعنی اگر هکر از قبل به SQL Injection دسترسی داشته باشد، تغییر پیشوند مانعی ایجاد نمی‌کند. اما نکته کلیدی این است:

نکته مهم: بیش از ۹۵٪ حملات SQL Injection توسط ربات‌های خودکار انجام می‌شود، نه هکرهای ماهر. این ربات‌ها از اسکریپت‌های آماده استفاده می‌کنند که فرض می‌کنند پیشوند wp_ است. تغییر پیشوند این حملات خودکار را کاملاً بی‌اثر می‌کند.

لایه‌های امنیتی: دفاع در عمق

تغییر پیشوند نباید تنها اقدام امنیتی شما باشد، بلکه باید بخشی از استراتژی «دفاع در عمق» (Defense in Depth) باشد:

لایه امنیتی اقدام اثربخشی
لایه ۱: کد امن استفاده از $wpdb->prepare() در کوئری‌ها ۱۰۰٪ (جلوگیری کامل)
لایه ۲: WAF فایروال وب مانند Cloudflare یا Sucuri ۹۵٪
لایه ۳: به‌روزرسانی آپدیت منظم وردپرس، پلاگین‌ها و قالب ۸۵٪
لایه ۴: پیشوند سفارشی تغییر wp_ به پیشوند منحصربه‌فرد ۹۰٪ (حملات خودکار)
لایه ۵: دسترسی محدود محدودیت دسترسی کاربر دیتابیس ۸۰٪ (کاهش خسارت)

پیش‌نیازها: قبل از شروع حتماً بخوانید

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

۱. بکاپ کامل بگیرید (اجباری)

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

  • افزونه UpdraftPlus: رایگان، بکاپ در Google Drive یا Dropbox
  • افزونه All-in-One WP Migration: ساده‌ترین روش برای export/import
  • phpMyAdmin: Export مستقیم فایل SQL
  • خط فرمان: استفاده از mysqldump
# بکاپ با mysqldump
mysqldump -u username -p database_name > backup_$(date +%Y%m%d_%H%M%S).sql

# بکاپ فشرده
mysqldump -u username -p database_name | gzip > backup_$(date +%Y%m%d).sql.gz

# بازیابی در صورت مشکل
mysql -u username -p database_name < backup_20260302.sql

۲. صفحه تعمیرات فعال کنید

در طول تغییر پیشوند، سایت ممکن است از دسترس خارج شود. با استفاده از افزونه Maintenance Mode یا افزودن کد زیر به wp-config.php، بازدیدکنندگان را به صفحه انتظار هدایت کنید:

// در wp-config.php قبل از تنظیمات اضافه کنید
define('WP_MAINTENANCE_MODE', true);

۳. دسترسی‌های لازم را بررسی کنید

  • دسترسی FTP/SFTP: برای ویرایش wp-config.php
  • دسترسی phpMyAdmin: برای تغییر نام جداول (یا SSH برای MySQL CLI)
  • مجوزهای دیتابیس: کاربر دیتابیس باید مجوز ALTER TABLE داشته باشد

۴. پیشوند جدید را انتخاب کنید

یک پیشوند امن باید:

  • حداقل ۴-۸ کاراکتر باشد
  • فقط شامل حروف کوچک، اعداد و آندرلاین باشد
  • با عدد شروع نشود
  • به آندرلاین ختم شود (طبق قرارداد وردپرس)
# پیشوندهای مناسب
brt_x7k2_ # خوب: کوتاه و تصادفی
site2026_ # خوب: شناسه منحصربه‌فرد
myshop_abc_ # خوب: قابل تشخیص

# پیشوندهای نامناسب
wp_secure_ # بد: شروع با wp_
123abc_ # بد: شروع با عدد
admin_ # بد: قابل حدس
wordpress_ # بد: شناخته‌شده

روش اول: تغییر پیشوند با phpMyAdmin (روش دستی)

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

مرحله ۱: ویرایش فایل wp-config.php

ابتدا باید پیشوند جدید را در فایل تنظیمات وردپرس تعریف کنید:

  1. با FTP یا File Manager به پوشه root وردپرس متصل شوید
  2. فایل wp-config.php را باز کنید
  3. خط $table_prefix را پیدا کنید
  4. مقدار آن را از 'wp_' به پیشوند جدید تغییر دهید
// قبل (پیشوند پیش‌فرض)
$table_prefix = 'wp_';

// بعد (پیشوند جدید)
$table_prefix = 'brt_x7k2_';

هشدار: فایل را ذخیره کنید اما هنوز سایت را تست نکنید! سایت تا پایان مرحله ۴ از دسترس خارج خواهد بود.

مرحله ۲: تغییر نام جداول اصلی

وارد phpMyAdmin شوید (معمولاً از cPanel قابل دسترسی است) و به تب SQL بروید. کوئری‌های زیر را اجرا کنید:

-- تغییر نام جداول اصلی وردپرس
-- پیشوند قدیم: wp_ | پیشوند جدید: brt_x7k2_

RENAME TABLE `wp_posts` TO `brt_x7k2_posts`;
RENAME TABLE `wp_postmeta` TO `brt_x7k2_postmeta`;
RENAME TABLE `wp_users` TO `brt_x7k2_users`;
RENAME TABLE `wp_usermeta` TO `brt_x7k2_usermeta`;
RENAME TABLE `wp_options` TO `brt_x7k2_options`;
RENAME TABLE `wp_comments` TO `brt_x7k2_comments`;
RENAME TABLE `wp_commentmeta` TO `brt_x7k2_commentmeta`;
RENAME TABLE `wp_terms` TO `brt_x7k2_terms`;
RENAME TABLE `wp_termmeta` TO `brt_x7k2_termmeta`;
RENAME TABLE `wp_term_relationships` TO `brt_x7k2_term_relationships`;
RENAME TABLE `wp_term_taxonomy` TO `brt_x7k2_term_taxonomy`;
RENAME TABLE `wp_links` TO `brt_x7k2_links`;

مرحله ۳: تغییر نام جداول پلاگین‌ها

اگر از پلاگین‌هایی استفاده می‌کنید که جدول ایجاد کرده‌اند (مانند WooCommerce، Yoast SEO، Contact Form 7)، باید آن‌ها را هم تغییر نام دهید. ابتدا لیست تمام جداول را ببینید:

-- نمایش تمام جداول با پیشوند قدیم
SHOW TABLES LIKE 'wp_%';

-- نتیجه ممکن است شامل:
-- wp_yoast_seo_links
-- wp_yoast_indexable
-- wp_woocommerce_sessions
-- wp_wc_orders
-- ...

برای تغییر نام خودکار تمام جداول، می‌توانید از این کوئری استفاده کنید:

-- تولید کوئری‌های RENAME برای تمام جداول
SELECT CONCAT('RENAME TABLE `', table_name, '` TO `brt_x7k2_',
  SUBSTRING(table_name, 4), '`;')
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name LIKE 'wp_%';

-- خروجی را کپی کرده و اجرا کنید

مرحله ۴: به‌روزرسانی جدول Options

جدول options شامل تنظیماتی است که نام آن‌ها از پیشوند قدیم استفاده می‌کند. این موارد باید به‌روزرسانی شوند:

-- جستجوی گزینه‌هایی که پیشوند قدیم دارند
SELECT * FROM `brt_x7k2_options`
WHERE option_name LIKE 'wp_%';

-- به‌روزرسانی گزینه‌های حیاتی
UPDATE `brt_x7k2_options`
SET option_name = REPLACE(option_name, 'wp_', 'brt_x7k2_')
WHERE option_name LIKE 'wp_user_roles';

مهم‌ترین گزینه‌ای که باید تغییر کند wp_user_roles است که نقش‌های کاربران را تعریف می‌کند.

مرحله ۵: به‌روزرسانی جدول Usermeta

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

-- جستجوی متادیتای کاربران با پیشوند قدیم
SELECT * FROM `brt_x7k2_usermeta`
WHERE meta_key LIKE 'wp_%';

-- به‌روزرسانی متادیتاهای حیاتی
UPDATE `brt_x7k2_usermeta`
SET meta_key = REPLACE(meta_key, 'wp_', 'brt_x7k2_')
WHERE meta_key LIKE 'wp_%';

مرحله ۶: تست سایت

حالا سایت را باز کنید. اگر همه مراحل را درست انجام داده باشید:

  • صفحه اصلی سایت باید نمایش داده شود
  • باید بتوانید به پیشخوان وردپرس وارد شوید
  • تمام پست‌ها، صفحات و تنظیمات باید موجود باشند

اگر خطای «Error Establishing Database Connection» دیدید، احتمالاً یکی از موارد زیر اشتباه است:

  • پیشوند در wp-config.php با نام جداول مطابقت ندارد
  • جدول options به‌روزرسانی نشده
  • جدول usermeta به‌روزرسانی نشده

روش دوم: استفاده از افزونه Solid Security (روش ساده)

اگر ترجیح می‌دهید از رابط گرافیکی استفاده کنید، افزونه Solid Security (قبلاً iThemes Security) این کار را خودکار انجام می‌دهد. این روش برای کاربرانی که تجربه کار با دیتابیس ندارند، مناسب‌تر است.

مراحل استفاده از Solid Security

  1. نصب افزونه: از مسیر افزونه‌ها > افزودن، افزونه Solid Security را نصب و فعال کنید
  2. رفتن به تنظیمات: از منوی Security > Settings > Advanced وارد شوید
  3. بخش Database: گزینه «Change Database Table Prefix» را پیدا کنید
  4. تغییر پیشوند: پیشوند جدید را وارد کرده و تایید کنید
  5. بررسی نتیجه: افزونه به صورت خودکار همه جداول و تنظیمات را به‌روزرسانی می‌کند

مزیت: افزونه Solid Security همچنین wp-config.php را به صورت خودکار به‌روزرسانی می‌کند و جداول پلاگین‌ها را هم شناسایی و تغییر نام می‌دهد.

سایر افزونه‌های تغییر پیشوند

علاوه بر Solid Security، افزونه‌های دیگری نیز این قابلیت را ارائه می‌دهند:

  • Brozzme DB Prefix: رایگان، تنها برای تغییر پیشوند طراحی شده
  • All In One WP Security: شامل تغییر پیشوند + ده‌ها قابلیت امنیتی دیگر
  • Wordfence: نسخه Pro شامل این قابلیت است

روش سوم: اسکریپت PHP برای تغییر خودکار (پیشرفته)

اگر چندین سایت وردپرسی دارید یا می‌خواهید فرآیند را خودکار کنید، می‌توانید از اسکریپت PHP استفاده کنید. این روش برای مدیران سرورهای مجازی و توسعه‌دهندگان مناسب است.

هشدار امنیتی: این اسکریپت را پس از اجرا حتماً از سرور حذف کنید. وجود آن روی سرور یک ریسک امنیتی است.

<?php
/**
* WordPress Database Prefix Changer
* Version: 2.0 (2026)
* WARNING: Delete this file after use!
*/

// تنظیمات
$old_prefix = 'wp_';
$new_prefix = 'brt_x7k2_';

// اتصال به دیتابیس از wp-config.php
require_once('wp-config.php');

$conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$conn->set_charset('utf8mb4');

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// دریافت لیست جداول
$tables = [];
$result = $conn->query("SHOW TABLES LIKE '{$old_prefix}%'");
while ($row = $result->fetch_array()) {
  $tables[] = $row[0];
}

// تغییر نام جداول
foreach ($tables as $table) {
  $new_name = str_replace($old_prefix, $new_prefix, $table);
  $conn->query("RENAME TABLE `{$table}` TO `{$new_name}`");
  echo "Renamed: {$table} -> {$new_name}\n";
}

// به‌روزرسانی options
$conn->query("UPDATE `{$new_prefix}options`
  SET option_name = REPLACE(option_name, '{$old_prefix}', '{$new_prefix}')
  WHERE option_name LIKE '{$old_prefix}%'");

// به‌روزرسانی usermeta
$conn->query("UPDATE `{$new_prefix}usermeta`
  SET meta_key = REPLACE(meta_key, '{$old_prefix}', '{$new_prefix}')
  WHERE meta_key LIKE '{$old_prefix}%'");

echo "Done! Don't forget to update wp-config.php and DELETE this file!";
$conn->close();
?>

استفاده با WP-CLI

اگر به SSH دسترسی دارید، WP-CLI روش سریع‌تری برای جستجو و جایگزینی در دیتابیس ارائه می‌دهد:

# جستجو و جایگزینی در دیتابیس
wp search-replace 'wp_' 'brt_x7k2_' --dry-run

# اجرای واقعی (بدون dry-run)
wp search-replace 'wp_' 'brt_x7k2_' --all-tables

# تغییر نام جداول (نیاز به کوئری MySQL دارد)
wp db query "RENAME TABLE wp_posts TO brt_x7k2_posts;"

مقایسه سه روش تغییر پیشوند

هر یک از روش‌های معرفی شده مزایا و معایب خود را دارد. جدول زیر به انتخاب بهترین روش کمک می‌کند:

معیار phpMyAdmin (دستی) افزونه اسکریپت PHP
سطح دشواری متوسط تا پیشرفته مبتدی پیشرفته
زمان مورد نیاز ۱۵-۳۰ دقیقه ۵ دقیقه ۲ دقیقه
کنترل و دقت بالا متوسط بالا
ریسک خطا متوسط پایین پایین
نیاز به SSH خیر خیر ترجیحاً بله
مناسب برای یادگیری عمیق کاربران عادی چند سایت/DevOps
پشتیبانی از جداول پلاگین دستی خودکار خودکار

عیب‌یابی مشکلات رایج

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

مشکل ۱: خطای اتصال به دیتابیس

علائم: پیام «Error Establishing Database Connection» در صفحه سایت

علت: پیشوند در wp-config.php با نام واقعی جداول مطابقت ندارد

راه‌حل:

# در phpMyAdmin بررسی کنید
SHOW TABLES;

# مقایسه با مقدار در wp-config.php
# $table_prefix = 'brt_x7k2_';

# اگر مطابقت ندارد، یکی را اصلاح کنید

مشکل ۲: نمی‌توانم وارد پیشخوان شوم

علائم: پس از ورود، به صفحه login برگردانده می‌شوید یا خطای «شما اجازه دسترسی به این صفحه را ندارید»

علت: جدول usermeta به‌روزرسانی نشده و نقش‌های کاربر از بین رفته

راه‌حل:

-- بررسی فیلدهای capabilities
SELECT * FROM `brt_x7k2_usermeta`
WHERE meta_key LIKE '%capabilities%'
OR meta_key LIKE '%user_level%';

-- اصلاح (جایگزین X با ID کاربر ادمین)
UPDATE `brt_x7k2_usermeta`
SET meta_key = 'brt_x7k2_capabilities'
WHERE user_id = X AND meta_key = 'wp_capabilities';

UPDATE `brt_x7k2_usermeta`
SET meta_key = 'brt_x7k2_user_level'
WHERE user_id = X AND meta_key = 'wp_user_level';

مشکل ۳: ویجت‌ها و منوها ناپدید شدند

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

علت: برخی تنظیمات در جدول options با پیشوند قدیم ذخیره شده‌اند

راه‌حل:

-- جستجوی همه گزینه‌های با پیشوند قدیم
SELECT option_name FROM `brt_x7k2_options`
WHERE option_name LIKE 'wp_%';

-- به‌روزرسانی همه (با احتیاط)
UPDATE `brt_x7k2_options`
SET option_name = REPLACE(option_name, 'wp_', 'brt_x7k2_')
WHERE option_name LIKE 'wp_%';

مشکل ۴: خطای پلاگین خاص

علائم: یک پلاگین خاص (مثلاً WooCommerce) کار نمی‌کند

علت: پلاگین جداول سفارشی دارد که تغییر نام نشده‌اند

راه‌حل:

-- یافتن جداول با پیشوند قدیم
SHOW TABLES LIKE 'wp_%';

-- تغییر نام هر جدول باقی‌مانده
RENAME TABLE `wp_woocommerce_sessions` TO `brt_x7k2_woocommerce_sessions`;
RENAME TABLE `wp_wc_orders` TO `brt_x7k2_wc_orders`;
-- و بقیه...

مشکل ۵: Multisite کار نمی‌کند

علائم: در شبکه Multisite، سایت‌های فرعی از دسترس خارج شدند

علت: Multisite از جداول با شماره استفاده می‌کند (مثلاً wp_2_posts)

راه‌حل:

-- یافتن تمام جداول Multisite
SHOW TABLES LIKE 'wp_%_posts';
SHOW TABLES LIKE 'wp_%_options';

-- تغییر نام با حفظ شماره سایت
RENAME TABLE `wp_2_posts` TO `brt_x7k2_2_posts`;
RENAME TABLE `wp_2_options` TO `brt_x7k2_2_options`;
-- تکرار برای هر سایت

بهترین شیوه‌های امنیتی دیتابیس وردپرس در ۲۰۲۶

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

۱. محدود کردن دسترسی کاربر دیتابیس

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

-- مجوزهای ضروری وردپرس
GRANT SELECT, INSERT, UPDATE, DELETE
ON database_name.*
TO 'wordpress_user'@'localhost';

-- مجوز اضافی برای نصب/آپدیت پلاگین
GRANT CREATE, ALTER, INDEX, DROP
ON database_name.*
TO 'wordpress_user'@'localhost';

-- اعمال تغییرات
FLUSH PRIVILEGES;

نکته: اگر پلاگین‌ها و قالب را به صورت دستی آپدیت می‌کنید، می‌توانید مجوز CREATE/ALTER/DROP را هم حذف کنید. این کار حتی اگر SQL Injection موفق شود، مانع از حذف جداول می‌شود.

۲. رمزنگاری اتصال دیتابیس (SSL/TLS)

اگر دیتابیس روی سرور جداگانه است، اتصال باید رمزنگاری شود:

// در wp-config.php
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
define('DB_SSL_CERT', '/path/to/client-cert.pem');
define('DB_SSL_KEY', '/path/to/client-key.pem');
define('DB_SSL_CA', '/path/to/ca-cert.pem');

۳. بکاپ خودکار و امن

بکاپ منظم از دیتابیس حیاتی است. توصیه‌ها:

  • بکاپ روزانه: حداقل یک بار در روز از دیتابیس بکاپ بگیرید
  • ذخیره خارج سرور: بکاپ‌ها را در Google Drive، Dropbox یا S3 ذخیره کنید
  • رمزنگاری بکاپ: فایل‌های بکاپ را با AES-256 رمزنگاری کنید
  • تست بازیابی: ماهانه یک بار بکاپ را روی محیط تست بازیابی کنید

۴. استفاده از Prepared Statements

اگر کد سفارشی می‌نویسید یا پلاگین توسعه می‌دهید، همیشه از $wpdb->prepare() استفاده کنید:

// روش اشتباه (آسیب‌پذیر به SQL Injection)
$wpdb->query("SELECT * FROM {$wpdb->posts} WHERE ID = $id");

// روش صحیح (امن)
$wpdb->get_results($wpdb->prepare(
  "SELECT * FROM {$wpdb->posts} WHERE ID = %d",
  $id
));

۵. نصب Web Application Firewall (WAF)

یک WAF می‌تواند حملات SQL Injection را قبل از رسیدن به وردپرس شناسایی و مسدود کند. گزینه‌های توصیه‌شده:

  • Cloudflare: پلن رایگان شامل WAF پایه است
  • Sucuri: تخصصی‌ترین WAF برای وردپرس
  • Wordfence: WAF در سطح اپلیکیشن (نصب روی سرور)

تغییر پیشوند در زمان نصب وردپرس

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

روش ۱: از طریق صفحه نصب

در صفحه نصب وردپرس (معمولاً /wp-admin/setup-config.php)، فیلدی با نام «Table Prefix» وجود دارد که می‌توانید پیشوند دلخواه را وارد کنید.

روش ۲: ویرایش دستی قبل از نصب

  1. فایل wp-config-sample.php را به wp-config.php تغییر نام دهید
  2. خط $table_prefix را ویرایش کنید
  3. نصب را از طریق /wp-admin/install.php انجام دهید

روش ۳: نصب با WP-CLI

# دانلود وردپرس
wp core download --locale=fa_IR

# ایجاد فایل config با پیشوند سفارشی
wp config create \
  --dbname=mydb \
  --dbuser=myuser \
  --dbpass=mypass \
  --dbprefix=brt_x7k2_

# نصب وردپرس
wp core install \
  --url=example.com \
  --title="My Site" \
  --admin_user=admin \
  --admin_email=admin@example.com

چک‌لیست نهایی پس از تغییر پیشوند

پس از تغییر پیشوند، این موارد را بررسی کنید:

  1. ورود به پیشخوان: آیا می‌توانید به /wp-admin/ وارد شوید؟
  2. بررسی نقش‌ها: آیا کاربر ادمین همچنان دسترسی کامل دارد؟
  3. مشاهده پست‌ها: آیا همه پست‌ها و صفحات نمایش داده می‌شوند؟
  4. منوها و ویجت‌ها: آیا منوها و ویجت‌های سایدبار کار می‌کنند؟
  5. تست پلاگین‌ها: هر پلاگین مهم را یک بار تست کنید
  6. تست فرم‌ها: فرم تماس، ورود، ثبت‌نام را تست کنید
  7. بررسی ووکامرس: اگر فروشگاه دارید، فرآیند خرید را تست کنید
  8. کش‌ها را پاک کنید: تمام کش‌ها (پلاگین، سرور، CDN) را خالی کنید
  9. صفحه تعمیرات را غیرفعال کنید: حالت maintenance را خاموش کنید
  10. لاگ‌ها را بررسی کنید: خطاهای PHP و MySQL را چک کنید

سوالات متداول (FAQ)

آیا تغییر پیشوند دیتابیس امنیت سایت را تضمین می‌کند؟

خیر، تغییر پیشوند یک لایه امنیتی است که حملات خودکار SQL Injection را مسدود می‌کند، اما جایگزین سایر اقدامات امنیتی نیست. برای امنیت کامل، باید از WAF، به‌روزرسانی منظم، رمزهای قوی و بکاپ منظم نیز استفاده کنید. تغییر پیشوند بیش از ۹۰٪ حملات خودکار را بی‌اثر می‌کند، اما یک هکر ماهر همچنان می‌تواند نام جداول را کشف کند.

آیا تغییر پیشوند روی سرعت سایت تاثیر دارد؟

خیر، تغییر پیشوند هیچ تاثیری بر سرعت سایت ندارد. پیشوند فقط نام جداول را تغییر می‌دهد و ساختار داده‌ها، ایندکس‌ها و عملکرد کوئری‌ها دقیقاً مانند قبل باقی می‌ماند. MySQL نام جدول را به عنوان یک شناسه استفاده می‌کند و طول آن تاثیری بر زمان اجرای کوئری ندارد.

آیا می‌توانم پیشوند را به حالت قبل برگردانم؟

بله، فرآیند کاملاً برگشت‌پذیر است. کافی است مراحل را برعکس انجام دهید: ابتدا جداول را به نام قبلی تغییر دهید، سپس wp-config.php را ویرایش کنید، و در نهایت مقادیر options و usermeta را به‌روزرسانی کنید. یا اگر بکاپ گرفته‌اید، می‌توانید آن را بازیابی کنید.

تغییر پیشوند روی سئو (SEO) تاثیر دارد؟

خیر، تغییر پیشوند دیتابیس هیچ تاثیری بر SEO ندارد. URL صفحات، متادیتای سئو، محتوای صفحات و هر چیزی که گوگل می‌بیند بدون تغییر باقی می‌ماند. این تغییر فقط در سطح دیتابیس است و هیچ اثری بر خروجی HTML سایت ندارد. تنها نکته این است که در طول تغییر (چند دقیقه) سایت ممکن است از دسترس خارج باشد، که با استفاده از صفحه Maintenance می‌توانید این مشکل را مدیریت کنید.

کدام پلاگین‌ها ممکن است پس از تغییر پیشوند مشکل داشته باشند؟

پلاگین‌هایی که نام جداول را hardcode کرده‌اند (به جای استفاده از $wpdb->prefix) ممکن است مشکل داشته باشند. این شامل برخی پلاگین‌های قدیمی یا توسعه‌یافته توسط افراد غیرحرفه‌ای است. پلاگین‌های معتبر مانند WooCommerce، Yoast SEO، Elementor، Rank Math و Contact Form 7 همگی از $wpdb->prefix استفاده می‌کنند و پس از تغییر پیشوند بدون مشکل کار می‌کنند.

آیا باید حتماً پیشوند را تغییر دهم یا اختیاری است؟

تغییر پیشوند اختیاری است اما توصیه می‌شود. اگر از یک WAF قوی (مانند Cloudflare یا Sucuri) استفاده می‌کنید و وردپرس و پلاگین‌ها را همیشه به‌روز نگه می‌دارید، ریسک SQL Injection کمتر است. اما تغییر پیشوند یک اقدام ساده است که لایه امنیتی اضافی ایجاد می‌کند و هزینه‌ای ندارد. اگر سایت شما حاوی اطلاعات حساس (مانند فروشگاه آنلاین یا داده‌های کاربران) است، انجام این کار ضروری‌تر است.

چرا بعد از تغییر پیشوند نمی‌توانم وارد پیشخوان شوم؟

این مشکل معمولاً به دلیل عدم به‌روزرسانی جدول usermeta است. فیلدهای wp_capabilities و wp_user_level باید به پیشوند جدید تغییر کنند. در phpMyAdmin، جدول usermeta را باز کنید و با کوئری SQL این فیلدها را برای کاربر ادمین خود به‌روزرسانی کنید. همچنین مطمئن شوید که wp_user_roles در جدول options هم تغییر کرده باشد.

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

در Multisite، هر سایت فرعی جداول جداگانه‌ای با شماره دارد (مثلاً wp_2_posts برای سایت دوم). باید تمام این جداول را هم تغییر نام دهید. همچنین جداول شبکه مانند wp_blogs، wp_site، wp_sitemeta و wp_signups نیز باید تغییر کنند. استفاده از افزونه یا اسکریپت خودکار برای Multisite توصیه می‌شود چون تعداد جداول می‌تواند بسیار زیاد باشد.

جمع‌بندی و گام‌های بعدی

تغییر پیشوند دیتابیس وردپرس یک اقدام امنیتی ساده اما موثر است که می‌تواند بیش از ۹۰٪ حملات SQL Injection خودکار را مسدود کند. در این راهنما سه روش مختلف را یاد گرفتید:

  • روش دستی phpMyAdmin: برای یادگیری عمیق و کنترل کامل
  • روش افزونه: برای کاربران عادی که می‌خواهند کار سریع انجام شود
  • روش اسکریپت: برای مدیران سرور و توسعه‌دهندگان

پس از تغییر پیشوند، این اقدامات امنیتی را هم انجام دهید:

  1. نصب WAF: فعال‌سازی Cloudflare یا Sucuri
  2. محدودیت دسترسی دیتابیس: حذف مجوزهای غیرضروری
  3. به‌روزرسانی منظم: وردپرس، پلاگین‌ها و قالب را همیشه به‌روز نگه دارید
  4. بکاپ خودکار: بکاپ روزانه از دیتابیس و فایل‌ها
  5. مانیتورینگ: نظارت بر لاگ‌های امنیتی

خدمات امنیتی برتینا

اگر نیاز به کمک در امن‌سازی سایت وردپرسی خود دارید، تیم متخصصان هاست وردپرس برتینا آماده کمک به شما هستند. تمام پلن‌های هاست وردپرس شامل WAF رایگان، بکاپ روزانه و SSL رایگان هستند. همچنین می‌توانید از خدمات هاست لینوکس با امنیت بالا و پشتیبانی ۲۴/۷ استفاده کنید.

منابع و مراجع

نظرات