محتويات الدورة

MySQL / التطبيقات الموثوقة والاستعلامات التحليلية / الدرس 12

الحسابات والأدوار وبناء الاستعلام الآمن

طبّق أقل الصلاحيات واربط القيم دون خلطها بمعرّفات SQL.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • افصل المصادقة والتخويل وأمان الاستعلام.
  • اربط القيم وحدد قوائم مسموحة للمعرّفات واتجاهات الترتيب.

يتضمن الحساب مضيفه

تعرّف حسابات MySQL باسم مستخدم ومضيف معاً. تثبت المصادقة حق العميل في استخدام الحساب، ثم تحدد الصلاحيات أفعاله. لا يعني نجاح الاتصال إمكان قراءة كل مخطط. افحص الحساب المصادق عليه بـ CURRENT_USER() لأن اسم الدخول والحساب المطابق قد يختلفان. وأبعد بيانات التشخيص عن السجلات العامة.

امنح صلاحيات تناسب المهمة

استخدم مختبر إدارة مؤقتاً فقط. يحتاج دور التقارير إلى SELECT على العلاقات المعتمدة، لا كتابة عامة أوإدارة حسابات. يغير إنشاء الحسابات والمنح حالة الخادم، لذا نقدم أوامر فحص لا بيانات دخول. يستخدم MySQL8.4 افتراضياً caching_sha2_password ويعطل mysql_native_password افتراضياً. حدّث العملاء المتوافقين بدلاً من افتراض ملاءمة حيلة مصادقة قديمة.

sql قراءة أدلة المصادقة والتخويل
SELECT USER() AS requested_identity, CURRENT_USER() AS matched_account;
SHOW GRANTS FOR CURRENT_USER;
SELECT CURRENT_ROLE() AS active_roles;

تعتمد القيم على الاتصال ولا نختلقها. تعرض USER سياق دخول العميل ومضيفه وتعرض CURRENT_USER الحساب المستخدم لفحص الصلاحيات. تختلف الأدوار الممنوحة عن النشطة، فتحقق من التفعيل قبل استنتاج غياب المنح.

تمثل المعاملات قيماً

يجب أن يكون الاسم الذي يتحكم فيه المستخدم بيانات لا نص SQL ملصقاً. تفصل العبارات المحضرة القالب عن القيم المربوطة، وتمثل المعاملات تعبيرات مثل الرقم أوالحالة. ولا تجعل أسماء الجداول أوالأعمدة أوالكلمات المفتاحية غير الموثوقة آمنة. توفر الموصلات واجهات ربط خاصة؛ استخدمها وفق توثيقها ولا تعتمد على الهروب اليدوي كحماية أساسية.

sql ربط قيمتين بقالب ثابت
PREPARE customer_orders FROM
 'SELECT id,total FROM orders WHERE customer_id=? AND status=? ORDER BY id';
SET @customer_id=1, @status='paid';
EXECUTE customer_orders USING @customer_id,@status;
DEALLOCATE PREPARE customer_orders;
الناتج المتوقع
id | total
101 | 25.00

تكون النتيجة الطلب 101 بإجمالي 25.00. وتظل بنية SQL ثابتة عند تغيير القيم. يستخدم الشرح متغيرات جلسة؛ وينبغي للتطبيق الحقيقي استخدام ربط الموصل الأصلي وإغلاق الموارد وفق دورة حياته.

حدد قائمة مسموحة لبنية SQL

لترتيب يختاره المستخدم اربط خيارات خارجية مثل newest أو amount بمقاطع ثابتة يملكها المطور مثل placed_at DESC, id DESC أو total DESC, id DESC وارفض المجهول. لا تسمي ORDER BY ? عموداً ديناميكياً، بل ترتب بقيمة المعامل. واقتباس معرّف عشوائي ليس تخويلاً؛ يجب تحديد المعرّفات المسموح اختيارها.

احم النظام المحيط

استخدم نقلاً مشفراً موثقاً واحفظ الأسرار خارج المستودع ولا تطبع سلاسل الاتصال أوكلمات المرور في الاستثناءات. افصل حساب الترحيل عن الكتابة والتقارير. يتطلب التدوير اختبار بيانات الدخول الجديدة وتجميع الاتصالات لا مجرد تغيير متغير. تختلف إضافات المصادقة والصلاحيات والأدوار بين MySQL و MariaDB، فتحقق من المنتج والموصل قبل نقل وصفات الحسابات.

الأخطاء الشائعة وإصلاحها

ERROR 1045 (28000): Access denied.

لماذا يحدث؟
لا تتطابق بيانات المستخدم والمضيف أوالسر أومتطلبات إضافة المصادقة مع العميل.
كيف تصلحه؟
تحقق من الوجهة ومطابقة الحساب مع المسؤول وبعميل متوافق.
كيف تتجنب تكراره؟
افصل تشخيص الاتصال عن تغيير الصلاحيات ولا تمنح صلاحيات واسعة تخميناً.

لا يرتب معامل اسم العمود حسب ذلك العمود.

لماذا يحدث؟
يمثل المعامل قيمة تعبير لا معرّفاً.
كيف تصلحه؟
اربط خيار الترتيب بمقطع SQL ثابت من قائمة مسموحة.
كيف تتجنب تكراره؟
اربط القيم وأبق البنية تحت تحكم المطور.

ERROR 1142 (42000): command denied.

لماذا يحدث؟
نجحت المصادقة لكن الحساب النشط لا يملك العملية المطلوبة.
كيف تصلحه؟
افحص الحساب والمنح والأدوار النشطة قبل طلب تصحيح محدود.
كيف تتجنب تكراره؟
افحص مهام التشغيل بالحساب ذي أقل الصلاحيات.

اختبر فهمك

1. هل يمكن لمعامل أن يحل بأمان محل اسم الجدول في SELECT * FROM ؟

اعرض الحل المشروح

لا؛ اسم الجدول بنية SQL لا موضع قيمة. اختر من خريطة ثابتة لأسماء مسموحة ثم اربط قيم المستخدم منفصلة. وإن لم يكن اختيار الجدول جزءاً من صلاحيات المستدعي، فقدم عملية تطبيق ثابتة.

2. يتصل مستخدم التقارير لكنه لا يستطيع SELECT من orders؛ ما الأدلة المطلوبة؟

اعرض الحل المشروح

افحص CURRENT_USER() و SHOW GRANTS FOR CURRENT_USER و CURRENT_ROLE() في الجلسة المصرح بها، ثم المخطط والعلاقة المقصودين. اطلب أقل SELECT مفقودة أوتفعيل الدور بدلاً من تغيير السر أومنح كل الصلاحيات، لأن الفشل تخويل لا مصادقة.

أهم ما تعلمته

  • تحل المصادقة والصلاحيات وبناء SQL مشكلات مختلفة.
  • اربط القيم وحدد قوائم للمعرّفات والكلمات وتحقق من تشفير النقل.

المراجع الرسمية