إنشاء مستخدم قاعدة بيانات محدود لووردبريس واختبار عزله
هل يحتاج ووردبريس إلى حساب يتحكم بكل قواعد البيانات على الخادم؟ لا؛ الأفضل أن يكون له مستخدم خاص يستطيع العمل على قاعدة موقعه فقط. سنشرح معنى هذا الفصل، وكيف تعرف أن الصلاحيات مضبوطة، ومتى تحتاج مساعدة الاستضافة بدل تنفيذ أوامر لا تعرف أثرها.
مستخدم قاعدة البيانات ليس حساب المدير الذي تدخل به إلى لوحة ووردبريس. إنه حساب يستخدمه الموقع في الخلفية لقراءة المقالات وحفظها. أما root فهو عادة حساب واسع الصلاحيات؛ استخدامه لكل المواقع يجعل أثر أي مشكلة أكبر.
ما الصلاحيات التي منحناها في الاختبار؟
الأمر التالي للمسؤول عن قاعدة البيانات. يفترض أن المستخدم والقاعدة أنشئا بالفعل، وأن المنفذ والمضيف صحيحان. إذا كان المتاح لك لوحة ووردبريس فقط، أرسل المتطلبات إلى دعم الاستضافة ولا تبحث عن مكان للصق هذا الأمر داخل مقال أو قالب.
GRANT SELECT, INSERT, UPDATE, DELETE,
CREATE, DROP, INDEX, ALTER
ON your_wordpress_database.*
TO 'your_wordpress_user'@'127.0.0.1';
استبدل اسم القاعدة والمستخدم والمضيف بما يناسب بيئتك؛ لا يتضمن هذا المثال كلمة مرور. الصلاحيات الأربع الأولى تكفي للعمليات اليومية عادة. أضفنا صلاحيات بنيوية لأن التثبيت والتحديثات وبعض الإضافات قد تنشئ جداول أو تعدلها. يمكن تشديدها لاحقا إذا كانت لديك خطة نسخ واستعادة واختبار للتحديثات.
أخطاء شائعة
- منح صلاحيات بيانات أو إدارة واسعة على
*.*بدل قاعدة الموقع فقط؛ أماUSAGEوحدها فلا تمنح هذه الصلاحيات. - كتابة كلمة المرور داخل لقطة شاشة أو أمر منشور.
- سحب ALTER وCREATE قبل تحديث رئيسي ثم استغراب فشل الترقية.
- استخدام المستخدم نفسه لكل مواقع الحساب مع توفر إمكانية الفصل.
خطوات التنفيذ والتحقق
- أنشئ قاعدة ومستخدما باسمين مختلفين، واستخدم كلمة مرور مولدة لا تظهر في اسم الموقع.
- امنح الصلاحيات على
database_name.*فقط، ثم استخدمSHOW GRANTSلعرض الصلاحيات وتأكد أن اسم قاعدة موقعك هو النطاق المسموح، وليس كل القواعد. - اتصل بالمستخدم الجديد ونفذ SELECT بسيطا على قاعدة ووردبريس.
- اختبر عملية كتابة داخل بيئة التجربة أو دع ووردبريس ينشئ جدول تحديث تجريبيا.
- في بيئة تملكها أو لديك إذن لاختبارها، حاول فتح قاعدة اختبار أخرى لم تمنح المستخدم صلاحية لها. نجاح المحاولة هنا يعني أن العزل غير صحيح.
- ضع بيانات الحساب في wp-config عبر قناة آمنة، ثم احذفها من سجل الأوامر أو لقطة الدعم.
ماذا عن التحديثات؟
التقوية ليست قرارا ثابتا لكل الاستضافات. إذا سمحت بأربع صلاحيات قراءة وكتابة فقط فقد يعمل النشر اليومي، بينما يفشل تحديث يحتاج ALTER أو CREATE. لذلك افصل بين حساب تشغيل شديد التقييد وحساب صيانة مؤقت إن كانت خبرتك والاستضافة تسمحان، أو استخدم مجموعة الصلاحيات التي توصي بها الاستضافة مع نسخ احتياطي مجرب. الأهم ألا يكون مستخدم الموقع مديرا لكل قواعد الخادم.
تفاصيل التجربة ونتيجتها
تاريخ التجربة: 18 أغسطس 2026؛ ووردبريس: نسخة استعادة مع 19 جدولا؛ مكان التنفيذ وأدواته: MySQL محلي على 3308.
تمكن المستخدم المحدود من قراءة قاعدة gzkhabar_restore_test، وأعاد الخادم الخطأ 1044 عندما حاول المستخدم نفسه فتح قاعدة gzkhabar_local الخاصة بالمشروع الجديد.
تحقق إضافي، 19 أغسطس 2026: قرأنا schema_privileges للمستخدم التجريبي وقارنّا منح قاعدة الاستعادة بقاعدة المشروع. عد الصلاحيات الممنوحة ليس اختبار اتصال مكافئا لكل عملية. اختبر الوصول المسموح ورفض الوصول إلى القاعدة الأخرى بحساب مخصص، دون كشف بيانات الدخول.

اختبار مستقل: قراءة المنح ثم تجربة العمليات فعليًا
نفّذنا هذه التجربة في 21 سبتمبر 2026، الساعة 11:29 UTC، على MySQL 8.4.3 وPHP 8.3.30 داخل مختبر محلي معزول. وهي تجربة جديدة مستقلة عن سجل أغسطس وصورته أعلاه؛ لا تستخدم قاعدة الموقع الحي أو بيانات زواره.
أنشأنا قاعدتين تجريبيتين فارغتين، ثم حسابًا محدودًا له الصلاحيات الثماني على قاعدة واحدة فقط. بعد ذلك استخدمنا الاتصال نفسه بالحساب المحدود لقراءة هويته ومنحه، وتنفيذ عمليات داخل قاعدته ومحاولة الوصول إلى الأخرى. جميع الأسماء التالية خاصة بعينة الاختبار، ولا يتضمن السجل كلمة مرور.
أولًا: هل اتصلنا بالحساب الذي نختبره؟
الأمران التاليان للقراءة فقط، ويُنفّذان من اتصال الحساب المحدود نفسه، لا من جلسة المدير:
SELECT CURRENT_USER();
SHOW GRANTS;
أظهرت النتيجة الحساب [email protected] والمنح الآتية. هذه نتيجة العرض وليست تعليمات لمنح صلاحيات في موقعك:
GRANT USAGE ON *.* TO `gz_fixture_20260921`@`127.0.0.1`
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER
ON `gz_grants_allowed_20260921`.*
TO `gz_fixture_20260921`@`127.0.0.1`
نقطة مهمة: ظهور USAGE ON *.* لا يعني السماح بقراءة جميع القواعد؛ USAGE تعني «بلا صلاحيات». افحص الصلاحيات الفعلية ونطاقها في بقية المنح، وأي أدوار ممنوحة إن كانت بيئتك تستخدمها. في هذه العينة ظهرت صلاحيات البيانات والبنية على القاعدة المحددة فقط.
ثانيًا: ماذا نجح وماذا رُفض؟
- داخل القاعدة المسموحة: أنشأنا جدول عينة، وأضفنا صفًا وقرأناه وعدّلناه، ثم أضفنا عمودًا وفهرسًا. أخيرًا حذفنا صف العينة وجدولها. نجحت العمليات الثماني، وتحققنا من القيمة المقروءة بعد الكتابة والتعديل.
- محاولة اختيار القاعدة الأخرى بالحساب نفسه رُفضت بالرمز
1044. - محاولة قراءة جدول تجريبي في القاعدة الأخرى باستخدام اسمه المؤهل رُفضت بالرمز
1142. اختلاف الرمز هنا مرتبط بنوع الطلب؛ لا تتوقع رمزًا واحدًا لكل اختبار عزل.
سجل النتائج المختصر للتجربة الجديدة
runAt: 2026-09-21T11:29:06+00:00
engine: MySQL 8.4.3; client: PHP 8.3.30 / mysqli
same limited connection: true
CREATE: pass; INSERT: pass; SELECT: pass; UPDATE: pass
ALTER: pass; INDEX: pass; DELETE: pass; DROP: pass
select other database: denied (1044 / SQLSTATE 42000)
qualified read from other database: denied (1142 / SQLSTATE 42000)
كيف تعيد التحقق بأمان؟ استخدم مختبرًا مع قاعدتين تملكهما وجدولًا قابلًا للتخلص منه، وسجّل الحساب والمنح ونتيجة كل عملية من الاتصال المحدود. لا تنفذ اختبارات DELETE أو DROP على جداول ووردبريس الحقيقية. إذا لم تملك إلا لوحة ووردبريس، اطلب من دعم الاستضافة تقرير المنح واختبار العزل بدل تثبيت أداة لتنفيذ SQL في الموقع.
حدود النتيجة: هذا يثبت نطاق الوصول والعمليات المذكورة في عينة MySQL المحلية فقط. لم نختبر به تثبيت ووردبريس أو ترقية جميع الإضافات، ولم نفحص صلاحيات حساب الاستضافة الفعلي. أوقفنا خادم المختبر بعد الاختبار، ولم نغيّر حسابات الموقع الحي.
مراجع قراءة النتيجة: MySQL: SHOW GRANTS، ومعاني الصلاحيات وUSAGE.
المصادر الرسمية