![]() |
|
UAC Security - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : الاقسام الاخرى (http://vb4arb.com/vb/forumdisplay.php?fid=74) +--- قسم : قسم المقالات العام (http://vb4arb.com/vb/forumdisplay.php?fid=85) +--- الموضوع : UAC Security (/showthread.php?tid=5392) |
UAC Security - RaggiTech - 08-10-12 كاتب الموضوع : samerselo
استعراض UACبشكل عام لا يمكن للبرنامج تأدية أعمال تتطلب صلاحيات لا يمتلكها المستخدم فإن لم يمتلك ذلك المستخدم الصلاحيات الكافية لحذف ملفات في مجلد الويندوز فلا يمكن للبرنامج المشغل من قبله أن يحذف تلك الملفات أيضا ومع ذلك يمكن للمستخدم تنفيذ أعمال من المفترض أنه ممنوع منها. والمطورون يعلمون منذ مدة طويلة أن التطبيق يجب أن يمتلك بعض الصلاحيات لكي يتمكن من إتمام العمل فإن كان التطبيق يتطلب العديد من الصلاحيات فوحدهم المستخدمون الذين يمتلكون تلك الصلاحيات يمكنهم تشغيل ذلك البرنامج. ولسوء الحظ فإن العديد من التطبيقات التي تقوم بأعمال قوية تحتاج إلى إنشاء أو حذف ملفات في مجلد الويندوز أو الوصول إلى مناطق متعلقة بالنظام أو التعديل على متغيرات البيئة أو مسجل النظام فإن كان التطبيق يحتاج تلك الصلاحيات فعندها يجب أن يمتلك تلك الصلاحيات عند تشغيله مما يعني أنه على العديد من المستخدمين امتلاك صلاحيات مدير نظام حتى يستطيعوا تشغيل تلك البرامج. والتعامل مع صلاحيات بهذا المستوى يأتي مع أخطار إضافية فإن أساء التطبيق التصرف فقد يتسبب بانهيار النظام حتى لو كان التطبيق ذات نفسه يعمل بصورة طبيعية فقد يقوم المستخدم بعمل شئ كارثي عن طريق الخطأ عندما يكون قد دخل بصلاحيات مدير فقد يقوم بحذف ملفات هامة يصبح معها من المستحيل استعادة النظام ويكون الحل الأمثل في هذه الحالة هو السماح للتطبيق برفع مستوى الصلاحيات التي يستخدمها بشكل مؤقت أثناء تأديته لتلك الوظائف القوية فإن اخطأ التطبيق عند تشغيله لجزئية معينة من الكود فلن يكون لديه الصلاحيات الكافية لعمل ضرر كبير ولن يكون للمستخدم صلاحيات مدير بشكل دائم وبهذا نكون قد قللنا من احتمال الحوادث المدمرة في النظام. في نسخ الويندوز السابقة لفيستا عندما تقوم بالدخول كمستخدم يمتلك صلاحيات مدير عندها ستتمكن من القيام بعمل أي شئ تقريبا ولكن في ويندوز فيستا فأن الـ UAC يتصرف بطريقة مختلفة قليلا فعندما تدخل كمدير يكون دخولك عبارة عن شقين الأول عبارة عن مستخدم عادي ذو صلاحيات محدودة والثاني مدير نظام يمتلك كافة الصلاحيات ففي البداية يكون عملك كمستخدم عادي حيث يتم استخدام الشق الثاني عند الحاجة فقط فعندما تريد القيام بعملية تحتاج إلى صلاحيات إضافية فالـ UAC يظهر لك صندوق حوار يسألك الموافقة فإن وافقت على تنفيذ ذلك العمل يتم رفع صلاحياتك بشكل مؤقت إلى مستوى مدير حتى ينتهي تنفيذ ذلك العمل وعندها تعود صلاحياتك إلى مستخدم عادي ثانية وإن كنت قد دخلت باسم مستخدم عادي لا يمتلك صلاحيات مدير فمازال بإمكانك تنفيذ أمر يتطلب تلك الصلاحيات المرتفعة حيث يظهر لك الـ UAC صندوق حوار تحذيري يمكنك من الدخول كمدير فإن قمت بالدخول كمدير بنجاح عندها يتم منحك صلاحيات مدير بشكل مؤقت حتى ينتهي تنفيذ ذلك العمل. ويكون الفرق بين الحالتين بسيطا فعندما تدخل كمدير فإن الـ UAC يسألك موافقتك على العمل بالصلاحيات المرتفعة وإن دخلت كمستخدم آخر فإن الـ UAC يطلب منك إدخال كلمة السر الخاصة بالمدير UAC Security - RaggiTech - 08-10-12 التصميم من اجل UAC لن يقوم الـ UAC برفع صلاحيات التطبيق بعد أن تم تشغيله فهو يقوم بإسناد الصلاحيات لذلك التطبيق عندما يبدأ ولن يقوم بعدها بتغيير تلك الصلاحيات فإن احتاج التطبيق للعمل بصلاحيات مرتفعة فعليه أن يحصل على تلك الصلاحيات عندما يبدأ ولتجنب إعطاء التطبيق صلاحيات أكثر من اللازم يجب عليك تقسيم كودك إلى أجزاء بحسب احتياجه لتلك الصلاحيات فالبرنامج الرئيسي يجب أن يعمل بصلاحيات عادية ولاحقا يجب عليه تنفيذ تطبيقات أخرى تعمل بصلاحيات مرتفعة عند الحاجة. فمثلا إن كان لدينا تطبيق يقوم بحفظ البيانات في قاعدة بيانات Sql Server فهو لا يحتاج لصلاحيات مدير ومع ذلك إن أراد إنشاء ملف بملخص العمليات في مجلد الويندوز – مجلد محمي – فسيحتاج عندها لصلاحيات مدير فيمكنك عندها تقسيم التطبيق إلى عدة أجزاء فالتطبيق الرئيسي يقوم بمعظم العمل وتطبيق آخر يقوم بكتابة معلومات الخلاصة إلى ذلك الملف عندها يمكن للتطبيق الأول تشغيل الثاني من أجل كتابة المعلومات في ذلك الملف. وعندما يكون بالإمكان يفضل أن تعيد كتابة التطبيق لتجنب استخدام صلاحيات مرتفعة فالعديد من البرامج على سبيل المثال تكون منصبة في المجلد Program Files وهذا من المجلدات المحمية وبهذا إن احتاج التطبيق إلى تخزين معلومات في ملف متواجد بنفس المجلد الذي يحتوي على الملف التنفيذي للتطبيق فسوف يحتاج إلى صلاحيات إضافية للقيام بتلك العملية ويمكنك تجاوز هذه المشكلة بجعل التطبيق يكتب ذلك الملف في المجلد الخاص بالمستخدم الحالي. والعمليات الأخرى التي تحتاج لصلاحيات مرتفعة تتضمن الكتابة إلى المجلدات المحمية والتعامل بشكل مباشر مع العتاد وتعديل الأقسام المحمية في سجل النظام مثل HKEY_LOCAL_MACHINE. وتقسيم التطبيق إلى أقسام تتطلب صلاحيات مرتفعة وأخرى لا تتطلب تلك الصلاحيات لا يمكن التطبيق من استخدام أقل الصلاحيات الممكنة فحسب ولكنه يبسط القسم الأخطر في كودك ويجعله أسهل للتنقيح فمثلا يمكننا استخدام كود شبيه بالتالي لتنفيذ تطبيق يتطلب صلاحيات مرتفعة كود : Private Sub btnRun_Click() Handles btnRun.Clickويمثل الكود التالي الإجراء main في البرنامج المستدعى كود : Function Main(ByVal cmdArgs() As String) As Integerوكجزء من خصائص المستخدم لـ UAC فأي عمل يتطلب صلاحيات مرتفعة يجب أن يتم تعليمه بواسطة الدرع القياسي لـ UAC حيث يجب إظهاره لتحذير المستخدم بأنه ينفذ تطبيق يتطلب صلاحيات مرتفعة. وفي الوقت الحالي لا توجد طريقة بسيطة لإظهار ذلك الدرع في فيجول بايزيك لذلك سنستخدم دالات API لجعل الزر يظهر ذلك الدرع كما هو ظاهر في قطعة الكود التالية كود : Imports System.Runtime.InteropServicesUAC Security - RaggiTech - 08-10-12 رفع صلاحيات البرامج يمكن للمستخدم رفع المستوى الذي يتم تنفيذ التطبيق ضمنه بواسطة اختيار الأمر Run As Administrator من القائمة التي تظهر لك عند الضغط بزر الفأرة اليميني على الملف التنفيذي للتطبيق فيقوم النظام بإظهار صندوق حوار UAC الخاص وبعد أن يقوم المستخدم بإدخال كلمة سر المدير يتم تنفيذ البرنامج باستخدام الصلاحيات المرتفعة وهذه الطريقة بسيطة ولا تتطلب تدخلا منك كمبرمج ولكنها تتطلب من المستخدم القيام بخطوة إضافية ولهذا قد لا تكون هذه الفكرة هي الحل الأفضل دوما. ويمكننا جعل تطبيقنا يبدأ تطبيق معين باستخدام صلاحيات مرتفعة بطريقة تشابه تلك الطريقة التي يستخدمها المستخدم فهو يبدأ تشغيل التطبيق طالبا من النظام تشغيله بصلاحيات مدير حيث يمكن استخدام كود شبيه بالتالي لتشغيل تطبيق آخر بصلاحيات مرتفعة مع أن ذلك التطبيق بذاته لا يطلب تلك الصلاحيات عند بدء تشغيله كود : Tryوإن كنت تعلم أن التطبيق يجب أن يتم تشغيله دوما باستخدام صلاحيات مرتفعة يمكنك جعل ذلك التطبيق يطلب رفع صلاحياته بنفسه وذلك باستخدام manifest مضمنة داخل الملف التنفيذي للتطبيق ولإنشائها انقر نقرا مزدوجا على My Project في Solution Explorer وفي صفحة Application انقر على الزر View UAC Settings الذي يقوم بفتح الملف app.manifest حيث يظهر الكود التالي المحتويات الابتدائية لذلك الملف كود : [color=#000000][COLOR=#0000bb]<?xml version[/color][color=#007700]=[/color][color=#dd0000]"1.0" [/color][color=#0000bb]encoding[/color][color=#007700]=[/color][color=#dd0000]"utf-8"[/color][COLOR=#0000bb]?> ولجعل التطبيق يطلب من UAC رفع صلاحياته غير قيمة السطر requestExecutionLevel إلى requireAdministrator والآن عندما تقوم بعمل Compile للتطبيق يقوم فيجول ستوديو بتعليم التطبيق بأنه بحاجة إلى صلاحيات مدير فعندما يقوم المستخدم أو أي برنامج آخر بتشغيله سيحاول النظام بصورة آلية رفع صلاحياته مظهرا صندوق الحوار الخاص بـ UAC للمستخدم طالبا منه الموافقة على رفع تلك الصلاحيات UAC Security - RaggiTech - 08-10-12 الخلاصة القواعد الأساسية لبرمجة UAC تتطلب استخدام الحد الأدنى من الصلاحيات لتنفيذ العمل المراد ويجب على التطبيق استخدام صلاحيات مستخدم عادي عندما يكون ذلك ممكنا وإن كان عليه تنفيذ مهمة تتطلب صلاحيات أكبر فيجب عليه تنفيذ تطبيق آخر منفصل يمتلك تلك الصلاحيات المرتفعة. وقد ورد في هذه المقالة ثلاثة طرق لبدء البرنامج بصلاحيات مرتفعة: الأولى هي الطلب من المستخدم فعل ذلك وذلك من خلال النقر بزر الفأرة اليميني على التطبيق واختيار الأمر Run As Administrator وهذه ليست بالطريقة الملائمة بشكل عام ولكنها تبقى مقبولة إن كان المستخدم سيشغل ذلك التطبيق مرات نادرة والثانية هي جعل التطبيق يبدأ التطبيق الآخر بصلاحيات مرتفعة وهذه طريقة أفضل من الأولى ولكنه مازال بالإمكان تشغيل التطبيق بدون الصلاحيات التي يحتاجها والثالثة هي تضمين manifest ضمن التطبيق المستدعى لجعله يطلب صلاحيات مرتفعة في كل مرة يبدأ فيها تشغيله مترجم بتصرف |