قاعدة بيانات أوراكل / المتقدم: تطور آمن وقابل للتعافي / الدرس 13
الصلاحيات والحزم والواجهات الآمنة
اعرض واجهة حجز ضيقة وحلّل ملكية المخطط وصلاحيات الشيفرة المخزنة وSQL الديناميكي.
في هذه الصفحة
أهداف الدرس
- ميّز صلاحيات الكائنات والأدوار وصلاحيات استدعاء الحزم.
- راجع حقوق المعرّف والمستدعي مع ربط القيم بأمان.
افصل المالك عن مستخدم التشغيل
يمكن لمالك المخطط صيانة الجداول بينما يتلقى حساب التشغيل العمليات اللازمة فقط. تمنح صلاحيات ANY الواسعة أو الملكية كل عيب في التطبيق قدرة أكبر. تستطيع حزمة عرض reserve_capacity مع إبقاء الكتابة المباشرة للجداول خارج واجهة المستدعي. هذا حد تصميم لا مبرر لحزمة ضخمة تضم أي سلوك مميز. اسرد الانتقالات والمدخلات وحقول التدقيق المسموحة. راجع الترحيل والتقارير والتشغيل كمسؤوليات منفصلة كي لا تتحول صلاحية النشر بصمت إلى صلاحية دائمة للتطبيق.
امنح الواجهة المراجعة بدلاً من كل الجداول
يمنح المثال حساب تشغيل اصطناعياً تنفيذ حزمة واحدة للمالك، ولا يمنح تلقائياً SELECT أو UPDATE على كل الجداول. يحدد التنفيذ وAUTHID وصلاحيات المالك كيفية الفحص. المنح تغييرات إدارية وتبقى غير قابلة للتشغيل هنا. افحص السياسة الحالية بأدلة معتمدة وسمِّ المالك الدقيق قبل اقتراحها. قد يبسط المرادف اسم الحزمة دون إضافة سلطة. سجّل مبرر كل منح وكيف يُسحب عند تقاعد التطبيق.
GRANT EXECUTE ON lab_owner.booking_api TO lab_runtime;
منح مقترح لواجهة بأقل صلاحيات لحسابات خيالية، وليس أمراً للتنفيذ على قاعدة مهيأة.
AUTHID قرار تنفيذ
تعمل PL/SQL المخزنة افتراضياً بحقوق المعرّف. يختار AUTHID CURRENT_USER حقوق المستدعي ويغيّر فحص الأسماء والصلاحيات أثناء التنفيذ وفق القواعد الموثقة. تعتمد شيفرة المعرّف عادة على منح المالك المباشرة ذات الصلة لا أدوار جلسة تفاعلية؛ راجع الترجمة والتنفيذ معاً. وليست شيفرة المستدعي آمنة تلقائياً لأنها تستخدم سياقه؛ يظل حل الكائنات والامتيازات الموروثة والإجراءات المستدعاة مهماً. صرّح بالسلطة المقصودة في مواصفة الحزمة واختبر الحالات المسموحة والمرفوضة في مختبر مصرح به.
اربط البيانات داخل SQL الديناميكي
يسهل فحص SQL الثابت عندما يُعرف الكائن والهيكل. إذا لزم SQL ديناميكي فاربط الملاحظة ومعرّف الشحنة بدلاً من دمج القيم. يبقي المثال الهيكل ثابتاً. لا تُمرر المعرّفات كقيم ربط عادية، لذا يحتاج اختيار جدول ديناميكي قائمة ضيقة والتحقق المناسب من المعرّف لا مجرد تهريب النص. تساعد DBMS_ASSERT في مهام تحقق محددة لكنها لا تقرر تفويض الكائن للعملية التجارية؛ فقد يشير اسم صحيح صياغياً إلى كائن حساس غير مقصود.
DECLARE
v_note VARCHAR2(100) := 'lab inspection';
v_id NUMBER := 101;
BEGIN
EXECUTE IMMEDIATE
'UPDATE shipment_notes SET note_text = :note WHERE shipment_id = :id'
USING v_note, v_id;
END;
تبقى القيم بيانات حتى مع علامات الاقتباس. يظل المستدعي بحاجة إلى معاملة معتمدة ونموذج صلاحيات صحيح.
راجع النجاح المصرح به والمسارات المرفوضة
يشمل التحقق مستخدم تشغيل يستطيع استدعاء واجهة الحجز ولا يستطيع تحديث الجداول المحمية مباشرة أو تمرير اسم كائن غير مسموح. التقط مدخلات اصطناعية وأدلة تدقيق معتمدة فقط. لا يثبت نجاح حساب إداري صلاحيات حساب التشغيل. قد يسرّب مجمّع الاتصالات سياق التطبيق بين الطلبات إن لم تُحدّد التهيئة وإعادة الضبط. عامل التدقيق والتشفير والسياسات وفق الإصدار والعرض والاستحقاق الدقيق؛ وجود خيار في الوثائق لا يثبت شموله في نشر معين.
الأخطاء الشائعة وإصلاحها
ORA-01031
- لماذا يحدث؟
- يفتقر سياق التنفيذ إلى صلاحية تتطلبها العبارة.
- كيف تصلحه؟
- حدّد الكائن ونموذج حقوق الشيفرة قبل اقتراح منح ضيق.
- كيف تتجنب تكراره؟
- تحقق بالصلاحيات الفعلية لحساب التشغيل لا الإداري.
تفشل الشيفرة المخزنة رغم نجاح SQL التفاعلي
- لماذا يحدث؟
- اعتمدت الجلسة على دور أو سياق أسماء غير متاح للوحدة المخزنة.
- كيف تصلحه؟
- راجع منح الترجمة وAUTHID والاعتماديات المؤهلة بالمالك.
- كيف تتجنب تكراره؟
- سجّل الاعتماديات المباشرة والمستدعين المسموحين في المراجعة.
يغيّر إدخال يتضمن اقتباساً عبارة SQL
- لماذا يحدث؟
- دمج SQL الديناميكي البيانات في الهيكل التنفيذي.
- كيف تصلحه؟
- اربط القيم وحدّد المعرّفات الديناميكية بقائمة مسموحة.
- كيف تتجنب تكراره؟
- اختبر الاقتباس ويونيكود وخيارات الكائنات المرفوضة بمدخلات اصطناعية.
اختبر فهمك
1. لماذا قد يُفضّل منح EXECUTE للحزمة على UPDATE لكل جداول التطبيق؟
اعرض الحل المشروح
يمكن للحزمة عرض انتقالات حالة مراجعة والتحقق من قيودها مع حجب الكتابات الاعتباطية. يظل تنفيذها وسلطتها بحاجة إلى مراجعة. تحقق من أن حساب التشغيل يستطيع الاستدعاء ولا يتجاوزه بمنح الجداول أو معلمة SQL ديناميكية واسعة.
2. هل تجعل DBMS_ASSERT أي اسم جدول صحيح هدفاً مصرحاً به؟
اعرض الحل المشروح
لا؛ تنفذ وظائف تحقق موثقة لا تفويض أعمال. اربط الاختيار المسموح بهدف معروف مؤهل بالمالك وارفض غيره. اربط القيم الفعلية مستقلة، واجعل الواجهة ضيقة بحيث لا يختار مستدع شرعي كائنات غير مرتبطة بمجرد تسميتها.
أهم ما تعلمته
- الملكية ومنح الكائن وحقوق الاستدعاء حدود أمنية مختلفة.
- تحتاج الواجهة الضيقة SQL ديناميكياً وتحققاً ضيقين كذلك.