پروژه‌ای را به یاد می‌آورم که در آن، مدیر فروشگاه با اعتماد کامل می‌گفت سایتش امن است، چون هم SSL نصب دارد و هم افزونه امنیتی. اما وقتی روی یک نکته دقیق شدم و پرسیدم کاربر دیتابیس فروشگاه چه دسترسی‌ای دارد، جوابش این بود: با کاربر روت متصل می‌شود. یعنی حتی اگر فقط یک افزونه، یک آسیب‌پذیری کوچک SQL Injection داشت، مهاجم می‌توانست نه‌فقط جدول سفارش‌ها، بلکه کل دیتابیس سرور را در اختیار بگیرد. امنیت دیتابیس در ووکامرس، همان لایه‌ای است که در بیشتر بحث‌های امنیتی فروشگاهی گم می‌شود. چه SSL، چه فایروال و چه 2FA، همه بر پایه فرض می‌کنند که لایه زیرین — دیتابیس — امن است. اگر این لایه نباشد، بقیه لایه‌ها فقط سطح حمله را محدود می‌کنند، نه مسیر را می‌بندند. در این نوشته، از تجربه پروژه‌های فروشگاهی واقعی، هفت نکته کلیدی امنیت دیتابیس ووکامرس را می‌گویم و در پایان به تصمیم‌هایی می‌رسیم که مدیر فروشگاه باید همین امروز بگیرد.

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

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

نکته اول: کاربر اختصاصی و کم‌دسترسی

اولین و مهم‌ترین کار: اتصال ووکامرس به دیتابیس نباید با کاربر روت یا کاربر مدیر کل انجام شود. کاربر دیتابیس ووکامرس باید فقط سه دسترسی داشته باشد: SELECT، INSERT و UPDATE روی دیتابیس اختصاصی خودش. حذف دسترسی‌های اضافی، به‌ویژه:

  • DROP (حذف جدول و دیتابیس) — لازم نیست ووکامرس چنین کاری بکند.
  • CREATE — در طول عملیات روزمره لازم نیست.
  • FILE — دسترسی به فایل‌سیستم سرور، بی‌نیاز و خطرناک.
  • PROCESS و SUPER — دسترسی‌های مدیریتی که هیچ افزونه‌ای نباید داشته باشد.

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

در اولین جلسه امنیتی که با صاحب فروشگاه داشتم، تنها تغییر کاربر دیتابیس از روت به یک کاربر محدود، سطح ریسک را چشمگیر پایین آورد. حتی قبل از هر افزونه امنیتی.

نکته دوم: بستن مسیر SQL Injection

SQL Injection (تزریق SQL) شایع‌ترین مسیر نشت داده از دیتابیس است. در وردپرس و ووکامرس، خود هسته از Prepared Statement استفاده می‌کند و امن است، اما افزونه‌های شخص ثالث همیشه این قاعده را رعایت نمی‌کنند. سه اقدام در این لایه:

  1. استفاده از افزونه‌های به‌روز: بیشتر آسیب‌پذیری‌های SQL Injection در افزونه‌های قدیمی و بدون نگهداری است. فهرست افزونه‌های بی‌خطر و به‌روز در افزونه‌های ضروری وردپرس آمده.
  2. کد سفارشی امن: در هر کوئری سفارشی، از $wpdb->prepare() استفاده کنید و هرگز مقادیر ورودی را مستقیم در کوئری قرار ندهید. اصول کامل در جلوگیری از SQL Injection و کدنویسی کوئری سفارشی در وردپرس.
  3. اعتبارسنجی سخت‌گیرانه ورودی‌ها: هر فیلد ورودی، حتی اگر به‌نظر بی‌خطر باشد، باید sanitize و validate شود. مسیرش در اعتبارسنجی داده‌ها و پاک‌سازی داده‌ها.

نکته سوم: پیکربندی امن wp-config و پیشوند جدول‌ها

فایل wp-config.php قلب اتصال ووکامرس به دیتابیس است. سه اقدام در این لایه:

  • رمز دیتابیس قوی و یکتا: حداقل ۲۰ کاراکتر با ترکیب حروف، اعداد و نمادها. این رمز جدا از رمز ادمین ووکامرس باشد.
  • دسترسی فایل: فایل wp-config.php باید فقط توسط کاربر وب سرور قابل خواندن باشد. سرورهایی که همه‌چیز را با مجوز 644 نگه می‌دارند، همان فایل را برای کاربران دیگر هم باز می‌گذارند.
  • پیشوند جدول غیرپیش‌فرض: پیشوند پیش‌فرض wp_ را تغییر دهید. این کار امنیت را تضمین نمی‌کند اما حملات خودکار بر پایه پیشوند پیش‌فرض را بی‌اثر می‌کند. مسیرش در امن‌سازی wp-config آمده است.

نکته ظریف در ووکامرس: خود ووکامرس، پیشوند جدول‌ها را از پیشوند وردپرس می‌گیرد و جدول‌های اختصاصی مثل wp_woocommerce_order_items را می‌سازد. اگر پیشوند را عوض می‌کنید، همه جدول‌های ووکامرس هم باید همزمان منتقل شوند. این کار نیازمند احتیاط است و باید در محیط staging انجام شود.

نکته چهارم: رمزنگاری داده‌های حساس

در فروشگاه، دو دسته داده حساس وجود دارد: اطلاعات هویتی مشتری و اطلاعات پرداخت. در رمزنگاری سه لایه داریم:

  • رمزنگاری در حال انتقال (TLS): ارتباط بین وردپرس و دیتابیس باید رمزنگاری‌شده باشد، به‌خصوص اگر دیتابیس روی سرور جداگانه است. مسیرش در رمزنگاری دیتابیس.
  • رمزنگاری در حالت سکون: دیتابیس روی دیسک باید رمزنگاری‌شده باشد. بیشتر هاست‌های حرفه‌ای و سرویس‌های ابری این را در لایه زیرساخت دارند، اما در محیط‌های اختصاصی باید فعالش کنید.
  • رمزنگاری داده حساس در سطح ستون: اطلاعات پرداخت، در اکثر فروشگاه‌ها نباید اصلاً در دیتابیس شما ذخیره شود. درگاه‌های پرداخت مدرن، اطلاعات کارت را نگه می‌دارند و شما فقط یک شناسه تراکنش دریافت می‌کنید. اگر به هر دلیل اطلاعات پرداخت روی سرور شما ذخیره می‌شود، باید استاندارد PCI DSS رعایت شود که در اکثر پروژه‌ها فراتر از بودجه است. راهکار ساده‌تر: هرگز اطلاعات کامل پرداخت را ذخیره نکنید.

مسیر مرتبط با رمز عبور کاربران در وردپرس در مدیریت امن رمز عبور آمده است. رمز عبور کاربران وردپرس، به‌طور پیش‌فرض هش می‌شود؛ مسئله اصلی، امنیت داده‌های سفارش و مشتری است.

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

در فروشگاه، دو نوع داده داریم: داده‌های تنظیمات (که با بکاپ معمولی کافی است) و داده‌های تراکنشی مثل سفارش‌ها. مسیر بکاپ اختصاصی:

  • بکاپ روزانه از جدول‌های سفارش: جدول‌هایی مثل wp_posts (که سفارش‌ها در آن ذخیره می‌شوند) و wp_woocommerce_order_items باید جداگانه و روزانه بکاپ داشته باشند.
  • بکاپ بیرون از سرور: بکاپ روی همان دیتابیس، بکاپ نیست. مقصد باید متفاوت باشد — object storage، سرور دوم یا سرویس ابری.
  • رمزنگاری فایل بکاپ: فایل بکاپ به‌خودی‌خود ارزشمندی زیادی دارد؛ اگر رمزنگاری‌شده نباشد، خودش یک هدف است.
  • آزمایش بازیابی دوره‌ای: حداقل فصل یک بار، بازیابی از بکاپ را آزمایش کنید. در پروژه‌ها زیاد دیده‌ام که بکاپ هست اما قابل بازیابی نیست.

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

نکته ششم: لاگ و پایش دیتابیس

بدون لاگ، بعد از حادثه نمی‌دانید چه اتفاقی افتاد. سه سطح لاگ در دیتابیس فروشگاه:

  • لاگ کوئری‌های کند: کوئری‌های بیش از یک ثانیه را ثبت کنید. اگر حمله‌ای در حال اجرا باشد، معمولاً کوئری‌های سنگین غیرعادی می‌بینید.
  • لاگ اتصال‌های ناموفق: اگر تعداد بالایی اتصال ناموفق به دیتابیس دارید، یا مهاجم در حال حدس رمز است یا اپلیکیشنی مشکل پیکربندی دارد.
  • لاگ عملیات مدیریتی: تغییر ساختار جدول‌ها، ایجاد کاربر جدید و تغییر رمزها، همه باید لاگ شوند.

مسیر پایش در بررسی لاگ‌های دیتابیس و روش اتصال به ابزارهای مانیتورینگ آمده است.

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

فراتر از دیتابیس فیزیکی، لایه‌ای دیگر وجود دارد: دسترسی‌های برنامه‌ای. در ووکامرس، نقش‌های پیش‌فرض مثل Shop Manager یا Administrator دسترسی زیادی دارند. سه قاعده در این لایه:

  • کم‌کردن تعداد ادمین: هیچ فروشگاهی به بیش از دو ادمین نیاز ندارد. بقیه نقش‌ها باید Shop Manager، Editor یا نقش سفارشی با دسترسی محدود باشند.
  • محدودسازی Shop Manager: نقش Shop Manager به‌طور پیش‌فرض دسترسی گسترده دارد؛ اگر نمی‌خواهید، آن را با یک افزونه مدیریت نقش‌ها محدودتر کنید.
  • بازبینی دوره‌ای کاربران: هر سه ماه، فهرست کاربران و نقش‌های فروشگاه را مرور کنید و حساب‌های بی‌استفاده را حذف کنید.

مسیر پیاده‌سازی نقش‌های سفارشی و سطوح دسترسی در افزونه‌های مدیریت کاربران وردپرس آمده است.

پرسش‌های پرتکرار درباره امنیت دیتابیس ووکامرس

آیا افزونه‌های امنیتی وردپرس روی دیتابیس کار می‌کنند؟ بعضی از آن‌ها، مانند اسکنرهای بدافزار، تغییرات دیتابیس را هم بررسی می‌کنند. اما بیشتر افزونه‌های امنیتی روی لایه فایل و شبکه کار می‌کنند. امنیت دیتابیس بیشتر به پیکربندی سرور و کد بستگی دارد تا افزونه.

آیا جدا کردن کاربر دیتابیس خطرناک است؟ نه، استاندارد است. فقط باید در محیط staging تست شود چون تغییر wp-config می‌تواند اگر اشتباه انجام شود، سایت را از دسترس خارج کند.

چطور بفهمم دیتابیس من آلوده شده؟ سه نشانه: صفحات سایت با محتوای اضافه (backlink خارجی)، کاربران ناشناس در جدول wp_users و کوئری‌های غیرعادی در لاگ. مسیر تشخیص دقیق در علائم آلودگی وردپرس آمده است.

آیا رمزنگاری کل دیتابیس ضروری است؟ در حالت سکون، بله برای سایت‌های با داده حساس، اما در اکثر سرویس‌های هاستینگ مدرن، این لایه در سطح زیرساخت فعال است. آنچه ضروری است، رمزنگاری ارتباط و پرهیز از ذخیره اطلاعات پرداخت است.

چگونه مطمئن شوم افزونه‌هایم SQL Injection ندارند؟ اسکن خودکار آسیب‌پذیری روی سایت و بازبینی کد افزونه‌های شخص ثالث. اگر افزونه‌ای از مخزن رسمی وردپرس است و به‌روز نگه داشته می‌شود، ریسکش پایین است. مسیر اسکن در اسکنرهای آسیب‌پذیری وب.

اگر هک شدم، اول چه کاری انجام دهم؟ اول بکاپ لحظه جرم بگیرید (قبل از هر پاک‌سازی)، بعد رمز همه کاربران دیتابیس را تغییر دهید، بعد مسیر ورود را پیدا کنید. ترتیب کامل در پاک‌سازی سایت هک‌شده آمده.

امنیتی که با هیچ افزونه‌ای جایگزین نمی‌شود

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