المُطالبات
يمكنك استخدام مُطالبات الأمان بشكل إلزامي أو تصريحي لتحديد الأذونات التي يجب أن تكون لدى طالبي الاستدعاء المباشرين أو غير المباشرين للوصول إلى المكتبة الخاصة بك. يقوم طالبو الاستدعاء المباشرون بطلب استدعاء أساليب المثيل أو الأساليب الثابتة بشكل صريح من المكتبة الخاصة بك، و لكن يقوم طالبو الاستدعاء الغير مباشرين بطلب استدعاء أساليب المثيل أو الأساليب الثابتة من مكتبة أخرى و التي تستدعي بدورها المكتبة الخاصة بك. و عندما تقوم باستخدام مطالبة، فإن أي تطبيق يتضمن التعليمات البرمجية الخاصة بك سوف يتم تنفيذه فقط إذا كان كافة طالبي الاستدعاء المباشرين و غير المباشرين لديهم الأذونات التي تحددها المطالبة. و تُعد المُطالبات مفيدة بشكل خاص في المواقف التي تستخدم فيها مكتبة الفئة الخاصة بك الموارد المحمية التي لا تريد أن يتم الوصول إليها بواسطة تعليمات برمجية غير موثوق بها. و يمكن أن يتم وضع المُطالبات في التعليمات البرمجية الخاصة بك باستخدام إما البناء التصريحي أو الإلزامي.
لاحظ أن معظم الفئات في NET Framework لديها مُطالبات مقترنة بها، بحيث لا تحتاج إلى إجراء مُطالبات إضافية كلما استخدمت فئة تقوم بالوصول إلى موارد محمية. فعلى سبيل المثال، الفئة StreamWriter تقوم تلقائياً بعمل مطالبة أمنية على FileIOPermission تلقائياً عند فتحها. و إذا قمت بإجراء طلب على FileIOPermissionعند استخدام الفئة StreamWriter، سيؤدي ذلك إلى إحداث عملية تجوال بالمكدس غير مُجدية و مُكررة. يجب عليك استخدام المُطالبات لحماية الموارد المخصصة التي تتطلب أذونات مخصصة.
يمكن أن تكون المُطالبات تصريحية أو إلزامية.
عمليات التجوال بالمكدس
تقوم المُطالبات بفرض الأمان عن طريق إجراء تحليل (يسمى تجوال بالمكدس) بحيث يتم فحص أي دالة تقوم بالاستدعاء (أو إطار بالمكدس) موجودة في مكدس الاستدعاءات الحالي للتأكد من وجود الإذن المحدد. عند تشغيل المطالبة يحدث ما يلي.
تبدأ عملية التجوال بالمكدس من إطار المكدس لطالبي الاستدعاء و ليس عند المكدس الحالي الذي تحدث عنده المطالبة. على سبيل المثال، إذا طلب الأسلوب A استدعاء الأسلوب B و كان لدى الأسلوب B مطالبة، فستبدأ عملية التجوال بالمكدس عند إطار المكدس الخاص بالأسلوب A. لا يتم تقييم الأسلوب B كجزء من عملية التجوال بالمكدس.
تستمر عملية التجوال بالمكدس خلال مكدس الاستدعاءات حتى تصل إلى نقطة الإدخال الخاصة بالبرنامج من المكدس (و عادةً يكون الأسلوب Main) أو حتى تصل إلى وحدة تعديل عملية التجوال بالمكدس مثل العثور على assert. للحصول على معلومات حول معدّلات عملية التجوال بالمكدسإبطال مفعول تدقيقات الأمان.
عند ظهور مطالبة أو معدّل لعملية التجوال بالمكدس (assert، على سبيل المثال) لنفس الإذن في نفس إطار المكدس، المطالبة يكون لها الأسبقية.
بناء الجملة التصريحي و الإلزامي لا يُبدي أي اختلاف في السلوك.
لاحظ أن المطالبة الموضوعة بنقطة الإدخال للبرنامج الخاص بك لا يتم تقييمها أبداً و ذلك لأن عمليات التجوال بالمكدس تبدأ دائماً عند إطار المكدس الذي يقوم بالاستدعاء، ولكن في هذه الحالة، لا يوجد شئ إطار استدعاء ليتم تقييمه. ولذلك فإن المُطالبات الموضوعة بنقطة الإدخال للبرنامج تنجح دوماً.
المُطالبات التصريحية
تضع المُطالبات التصريحية معلومات في بيانات التعريف الخاصة بتعليماتك البرمجية باستخدام السمات. و يمكنك استخدام بناء جملة التصريحي لوضع مطالبة إما في مستوى الفئة أو الأسلوب بالتعليمات البرمجية الخاصة بك.
و إذا قمت بوضع اختبار أمان تصريحي عند مستوى الفئة، فإن ذلك ينطبق على كل عضو من أعضاء الفئة. ومع ذلك، إذا قمت بوضع اختبار أمان تصريحي عند مستوى العضو، فإنه ينطبق على ذلك العضو فقط و يبطل مفعول الإذن المحدد عند مستوى الفئة، إن وُجد. على سبيل المثال، افترض أنك قمت بتحديد أن PermissionA مطلوب عند مستوى الفئة، و بالنسبة للأسلوب Method1 الخاص بتلك الفئة قد قمت بتحديد أن PermissionB مطلوب. فعندما يتم استدعاء Method، يقوم الاختبار الأمني بالبحث فقط عن PermissionB، ولكن ستستمر الأساليب الأخرى للفئة بطلب PermissionA.
يضع المثال التالي مطالبة تصريحية للإذن المخصص تسمى CustomPermission على كافة طالبي الاستدعاء من الأسلوب ReadData. يعد هذا الإذن إذناً افتراضياً مخصصاً و لا يوجد في بيئة .NET Framework. و لدى الإذن المخصص CustomPermissionAttribute معرّف بشكل منفصل وهو ما يقوم بالمطالبة. و في هذه الحالة، فسيأخذ الإشارة SecurityAction.Demand لتحديد نوع المطالبة التي ستنفذها السمة.
<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := True)>Public Shared Function ReadData() As String
'Read from a custom resource.
End Function
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
public static string ReadData()
{
//Read from a custom resource.
}
المُطالبات الإلزامية
يتم وضع المُطالبات الإلزامية عند مستوى الأسلوب للتعليمات البرمجية الخاصة بك بواسطة إنشاء مثيل جديد من كائن الإذن و طلب استدعاء أسلوب Demand الخاص بذلك الكائن. لا يمكن استخدام بناء الجملة الإلزامي لوضع المُطالبات عند مستوى الفئة.
و تساعد المُطالبات الإلزامية التي تضعها بالتعليمات البرمجية الخاصة بك على حماية كافة التعليمات البرمجية المتبقية في الأسلوب الذي يتم طلب الأسلوب Demand الخاص به. يتم تنفيذ التدقيق الأمني عند تنفيذ Demand; و إذا فشل الاختبار الأمني يتم طرح SecurityException و لا يتم تنفيذ باقي التعليمات البرمجية في ذلك الأسلوب أو العضو إلا إذا تم التقاط SecurityException و التعامل معه.
يستخدم المثال التالي بناء الجملة الإلزامي لوضع مطالبة على كافة طالبي الاستدعاء للإذن المخصص CustomPermission. و تقوم هذه التعليمات البرمجية بإنشاء مثيل جديد من الفئة CustomPermission، مع تمرير الإشارة PermissionState.Unrestricted للدالة الإنشائية. يتم عندئذٍ استدعاء الأسلوب Demand.
Public Shared Sub ReadData()
Dim MyPermission As New CustomPermission(PermissionState.Unrestricted)
MyPermission.Demand()
'Read from a custom resource.
End Sub
public static void ReadData()
{
CustomPermission MyPermission = new CustomPermission(PermissionState.Unrestricted);
MyPermission.Demand();
//Read from a custom resource.
}
ملاحظة |
---|
إن سلوك تحسين الأداء لعملية المطالبة تختلف بين أنظمة 64 بت و 32 بت.في أنظمة 64 بت، لن تتحقق المطالبة من مجموعة الأذونات الممنوحة للتجميع الذي يحتوي على المطالبة في الحالات حيث لا يوجد تجميعات أخرى تقوم بالاستدعاء.و على الرغم من ذلك، فإن هذا التحسين لا يؤدي إلى رفع الامتياز لأنه لا يزال يتم تنفيذ عملية التجوال بالمكدس عند وجود تجميعات تقوم بالاستدعاء.و على أنظمة 32 بت، تتحقق عملية المطالبة من مجموعة الأذونات الممنوحة للتجميع الذي يحتوي على الطلب و كافة التجميعات التي تقوم بالاستدعاء. |
راجع أيضًا:
المرجع
المبادئ
لتوسيع بيانات التعريف باستخدام السمات
أمان الوصول إلى التعليمات البرمجية