وثوقية أفضل الممارسات
قواعد الوثوقية التالية موجه إلى SQL الخادم؛ على الرغم من ذلك، كما تنطبق أي يطبق الخادم يستند إلى مضيف. هو بالغة الأهمية عدم حدوث تسرب موارد الملقمات مثل SQL الخادم ولم يتم إحضارها أسفل. ومع ذلك، التي لا يمكن إجراء إلغاء إعادة كتابة تعليمات برمجية لكل أسلوب تبديل الولاية الكائن. والهدف هو لا بالكتابة 100 بالمائة يمكن الاعتماد عليها المدار رمز التي سيتم استردادها من أي أخطاء في كل مكان مع الخلفية-سحب رمز. ستكون مهمة صعبة مع فرصة ضئيلة للنجاح. وقت تشغيل اللغة العامة (CLR) لا بسهولة توفير قوي كافية صريحة إلى تعليمات برمجية تمت إدارتها إلى تأكد من كتابة التعليمات البرمجية السرية feasible. لاحظ أنه بخلاف ASP.NET، يستخدم SQL الخادم عملية واحدة فقط والتي لا يمكن إعادة استخدام دون اتخاذ قاعدة بيانات لأسفل لفترة طويلة unacceptably.
مع هذه صريحة الضعيفة والتشغيل في عملية واحدة، ثبات يستند إنهاء عمليات جزئية أو تكرير مجالات تطبيق عندما لا تكون leaked الاحتياطات اللازمة وأخذ للتأكد من موارد النظام مثل مؤشرات أو ذاكرة. حتى مع th هو أبسط الوثوقية قيد، هناك هو لا تزال متطلبات اعتمادية هامة:
عدم حدوث تسرب النظام تشغيل الموارد.
تعريف الجميع مدارة تأمين في الجميع النماذج إلى CLR.
عدم مشاركة المجال عبر تطبيق فاصل الولاية، مما يسمح AppDomainتكرير إلى تعمل بصورة ملائمة.
على الرغم من أنه هو نظرياً المحتملة لكتابة تعليمات برمجية تمت إدارتها لمعالجة ThreadAbortException، StackOverflowException، و OutOfMemoryExceptionالاستثناءات، توقع المطورين كتابة تعليمات برمجية مثل قوة من خلال تطبيق كامل هو unreasonable. لهذا السبب، استثناءات مسح شريط ينتج مؤشر ترابط التنفيذ منتهية؛ وإذا كان مؤشر الترابط تم إنهاؤها بتحرير الحالة المشتركة، يمكن تحديد بما إذا كان مؤشر الترابط يحتفظ بتأمين، ثم AppDomainهو غير محمل. عند أسلوب التي هو تحرير مشتركة حالة هو منتهية، الحالة التي سوف تكون تالفة لأن هو لا يمكن الكتابة يمكن الاعتماد عليه حالة المشترك مرة أخرى-سحب رمز التحديثات إلى.
في.NET Framework الإصدار 2.0، مضيف فقط التي تتطلب الثبات هو SQL الخادم. إذا كان سيتم تشغيل تجميع الخاص بك على SQL Server يجب القيام العمل الثبات لكل جزء من هذا تجميع، حتى إذا كان هناك ميزات معينة معطلة عند تشغيل في قاعدة بيانات. Th هو هو المطلوبة لأن analys تعليمات برمجية هو محرك فحص تعليمات برمجية على المستوى تجميع ويتعذر التفرقة بين رمز dهوabled. آخر SQL الخادم اعتبار البرمجة أن SQL الخادم يعمل كل شيء في عملية واحدة، AppDomainتكرير المستخدم لمسح الجميع موارد مثل ذاكرة و نظام تشغيل المقابض.
التي لا تعتمد تشغيل finalizers أو destructors أو try/finallyكتل تعليمات برمجية خلف السحب. قد يكون مقاطعة كانت أو لم يتم استدعاء.
يمكن أن يتم طرح استثناءات غير المتزامن في أماكن غير متوقعة، من الممكن أن تكون كل تعليمة آلة: ThreadAbortException ، StackOverflowException و OutOfMemoryException
عمليات جزئية التي تمت إدارتها ليست بالضرورة عمليات جزئية Win32 في SQL، فربما يكون fibers.
مشاركة واسعة عملية أو تطبيق المشتركة في مجال mutable الولاية هو صعبة للغاية لتغيير أمان ويجب تجنب كلما أمكن ذلك.
الشروط بنفاد الذاكرة غير نادرة في SQL الخادم.
في حالة عدم تحديث المكتبات التي تتم استضافتها في ملقم SQL بشكل صحيح المشترك حالتها، هناك هو يتم إعادة تشغيل احتمال عالية التي لا يتم استرداد التعليمة البرمجية إلى أن قاعدة البيانات. بالإضافة إلى ذلك، في بعض الحالات القصوى، فإنه هو th المحتملة هو قد يؤدي إلى فشل، عملية SQL الخادم التسبب في قاعدة البيانات لإعادة التمهيد. Rebooting the قاعدة بيانات can take أسفل a ويب موقع أو affect شركة العمليات, hurting availability. حدوث تسرب بطيء من نظام تشغيل قد يسبب الموارد مثل الذاكرة أو مقابض الملقم أخيرا فشل تخصيص المقابض مع لا إمكانية استرداد، أو من المحتمل أن يكون قد ينخفض ببطء في أداء الملقم ويقلل من توفر التطبيق الخاص بالعميل. Clearly we want إلى avoid these scenarios.
أفضل ممارسة Rules
The introduction focused تشغيل what the استعراض تعليمات برمجية for the مدارة تعليمات برمجية that runs في the الخادم would have إلى catch إلى زيادة the stability و وثوقية of the framework. الجميع these checks are بضاعة practice في عام و an مطلق must تشغيل the الخادم.
في the face of a dead قفل أو مورد قيد, SQL الخادم will إيقاف قبل الاكتمال a مؤشر ترابط أو tear أسفل an AppDomain. When this happens, فقط الخلف-خارج تعليمات برمجية في a constrained execution منطقة (CER) هو guaranteed إلى be تشغيل.
استخدم SafeHandle إلى Avoid مورد Leaks
في حالة من AppDomainإلغاء التحميل، التي لا تعتمد على finallyكتل أو fفيalizers يتم تنفيذه، لذا فمن المهم مجردة كافة نظام تشغيل الوصول إلى المورد من خلال SafeHandleفئة بدلاً من IntPtr، HandleRef، أو فئات مشابهة. This allows the CLR إلى مقطع صوتي و يغلق the handles you استخدم even في the AppDomain tear-أسفل حالة. SafeHandle will be using a حرج أداة الإنهاء which the CLR will دوماً تشغيل.
نظام تشغيل مقبض المخزنة في المؤشر الأمن من لحظة إنشائها حتى لحظة إصدارها. هناك هو لا يوجد إطار خلالها ThreadAbortExceptionقد يحدث تسرب مقبض. Additionally, النظام الأساسي invoke will مرجع-العدد the مؤشر, which allows يغلق تعقب of the مدة بقاء of the مؤشر, preventing a الأمان issue مع a حالة تعارض between Dispose و a أسلوب that هو currently using the مؤشر.
معظم الفئات التي تملك حاليا أداة الإنهاء لمجرد تنظيف حتى نظام تشغيل لن تحتاج مؤشر أداة الإنهاء مرة أخرى. Instead, the أداة الإنهاء will be تشغيل the SafeHandle الفئة المشتقة.
ملاحظة that SafeHandle ليس a replacement for IDisposable.Dispose. There are still potential مورد contention و الأداء advantages إلى بوضوح dispose operating النظام موارد. Just realize that finally blocks that do بوضوح dispose of موارد may not ينفذ إلى completion.
SafeHandleيسمح لك بتنفيذ الخاص بكReleaseHandleالأسلوب الذي يجري العمل لتحرير المؤشر، مثل تمرير الالولاية إلى النظام تشغيل مقبض تحرير روتين أو تحرير التعيين من المؤشرات في تكرار حلقي. يضمن CLR التي th هو أسلوب هو تشغيل. هو مسؤولية الكاتب ReleaseHandleالتطبيق للتأكد من أن المؤشر هو إصدارها في الجميع الحالات. فشل إلى للقيام بذلك سيتسبب المقبض إلى تكون leaked، الذي غالباً ما ينتج عنه leakage موارد الأصلية المقترنة بالمعالج. ولذلك هو هامة لبناء SafeHandleاشتقاق الفئات بحيث ReleaseHandleتطبيق لا يتطلب تخصيص أي من موارد التي قد تكون غير متوفرة في الوقت الاستدعاء. لاحظ أنه هو permهوsible لاستدعاء الأساليب التي قد فشلت في التنفيذ ReleaseHandleشريطة يمكن معالجة مثل فشل تعليمات برمجية الخاصة بك وإتمام اتفاق لتحرير المؤشر الأصلي. لأغراض، التصحيح ReleaseHandleيحتوي Booleanبإرجاع القيمة يمكن تعيين falseفي حالة وجود خطأ الكوارث هو مصادفة الذي يمنع إصدار مورد. يؤدي ذلك إلى تنشيط releaseHandleFailed MDAMDA، إذا كان ممكناً، للمساعدة في التعرف على المشكلة. ولا يؤثر على وقت التشغيل بأية طريقة غير ذلك؛ ReleaseHandleسوف لا يتم استدعاء مرة غير ذلك لنفس مورد و وبالتالي leaked في hوle.
SafeHandleهو غير المناسب في بعض السياقات. منذ ReleaseHandleيمكن تشغيل الأسلوب على GCمؤشر ترابط أداة الإنهاء، أية معالجات مطلوبة إلى يمكن تحريرها في معينة يجب أن لا يكون مؤشر الترابط الملتفة في SafeHandle.
وقت تشغيل تنظيف wrappers الاستدعاء (RCWs) بواسطة CLR بدون تعليمات برمجية إضافى. للتعليمات البرمجية التي تستخدم استدعاء النظام الأساسي ويتعامل مع كائن COM IUnknown*أو IntPtr، يجب إعادة كتابة التعليمة البرمجية باستخدام RCW عنصر. SafeHandleقد تكون غير مناسبة لهذا السيناريو بسبب في احتمال وجود أسلوب إصدار غير مدار استدعاء مرة أخرى في إدارة تعليمات برمجية.
قاعدة تحليل تعليمات برمجية
استخدام SafeHandleلتغليف النظام تشغيل الموارد. لا استخدم HandleRefأو حقول نوع IntPtr.
تأكد من غير خاص Finalizers لتشغيل لمنع Leaking النظام تشغيل الموارد
قم بمراجعة finalizers عناية للتأكد من أن حتى إذا كانت لا تعمل، الهامة النظام تشغيل لم يتم leaked المورد. عكس عادي AppDomainإلغاء تحميلها عند تطبيق هو تنفيذها في الولاية مستقرة أو عند إيقاف تشغيل ملقم مثل SQL الخادم، لا يتم إنهاؤه الكائنات أثناء abrupt AppDomainإلغاء التحميل. تأكد أن لا تكون leaked موارد في حالة من إلغاء تحميل abrupt، لأنه لا يمكن ضمان صحة تطبيق ما، ولكن يجب الاحتفاظ تكامل الملقم بواسطة عدم leaking موارد. استخدام SafeHandleلتحرير أي النظام تشغيل الموارد.
تأكد من أي أخيرا "غير خاص عبارات" لتشغيل لمنع Leaking النظام تشغيل الموارد
finallyعبارات لا يمكن ضمان إلى تشغيله خارج CERs، التي تتطلب مطوري مكتبة إلى لا تعتمد على تعليمات برمجية داخلfinallyحظر إلى تحرير موارد غير مدار. استخدام SafeHandleهو الحلول الموصى بها.
قاعدة تحليل تعليمات برمجية
استخدام SafeHandleعن تنظيف موارد النظام التشغيل بدلاً من Finalize. لا تستخدم IntPtr؛ استخدم SafeHandleإلى تغليف موارد. إذا كانت أخيرا يجب تشغيل جملة، وضعه في CER.
يجب انتقال الجميع التأمينات من خلال تعليمات برمجية المدارة تأمين موجودة
يجب أن تعرف CLR عندما تكون تعليمات برمجية في قفل حيث أنه سيعرف إلى تفكيك استمرار AppDomainبدلاً من مجرد إحباط? مسار التنفيذ. إحباط? مسار التنفيذ قد يكون خطيرا كما قد يتم ترك بيانات يدار من خلال مسار التنفيذ في الولاية غير صحيحة. ولذلك، بأكمله AppDomainله إلى يمكن إعادة استخدام. عواقب الفشل إلى التعرف على قفل يمكن أن تكون deadlocks أو نتائج غير صحيحة. استخدم وظائف BeginCriticalRegionو EndCriticalRegionللتعرف على مناطق التأمين. They are ثابت وظائف تشغيل the Thread فئة that فقط يطبق على the الحالي مؤشر ترابط, helping إلى prevent واحد مؤشر ترابط من تحرير another مؤشر ترابط’s قفل العدد.
Enter و Exit have this CLR إعلام built في, so their usage هو recommended كـ well كـ the استخدم of the تأمين بيان (C# مرجع), which uses these وظائف.
غير ذلك locking mechanisms such كـ spin locks و AutoResetEvent must يتصل these وظائف إلى notify the CLR that a حرج مقطع هو being entered. These وظائف do not take أي locks; they inform the CLR that تعليمات برمجية هو executing في a حرج مقطع و إحباط? the مؤشر ترابط could المغادرة shared الولاية inconsistent. If you have defined your own قفل نوع, such كـ a مخصص ReaderWriterLock فئة, استخدم these قفل العدد وظائف.
قاعدة تحليل تعليمات برمجية
Mark و identify الجميع locks using BeginCriticalRegion و EndCriticalRegion. Do not استخدمCompareExchange,Increment, وDecrementفي a تكرار حلقي. Do not do a النظام الأساسي invoke of the Win32 variants of these وظائف. لا استخدم Sleepفي الحلقة. لا استخدم حقول المتغيرة.
تنظيف "يجب أن تكون تعليمات برمجية" في في النهاية أو الالتقاط حظر، "غير التالية" الالتقاط
عدم اتباع تعليمات برمجية تنظيف catchكتلة؛ يجب أن تكون في finallyأو catchحظر نفسه. يجب أن يكون هذا الجيد عادي. finallyيفضل الحظر بشكل عام حيث يتم تشغيل كلاهما عند استثناء نفس رمز تم طرح وعند النهاية tryالحظر بشكل عادي. في حال من استثناء غير متوقع يتم طرح، على سبيل المثال ThreadAbortException، التنظيف تعليمات برمجية سوف لا التشغيل. أي غير مدارة موارد التي سيتم تنظيفها في finallyيجب أن يكون التفاف نموذجياً في SafeHandleإلى منع تسرب. لاحظ في C# usingيمكن أن يتم استخدام الكلمة الأساسية بكفاءة إلى التخلص من الكائنات، بما فيها مقابض.
تشغيل الرغم من أن AppDomainتكرير يمكن تنظيف موارد تشغيل مؤشر ترابط أداة الإنهاء، هو لا تزال هامة لوضع رمز تنظيف في المكان الصحيح. ملاحظة أنه إذا قام مؤشر ترابط بتلقي استثناء غير متزامنة دون الاستمرار في قفل، CLR يحاول إنهاء مؤشر ترابط نفسه دون الحاجة إلى إعادة تصنيع AppDomain. التأكد من أنه يتم تنظيف موارد لأعلى شكل أبكر بدلاً من المساعدة فيما بعد بواسطة توفير المزيد من الموارد، والعمر بإدارته بشكل أفضل. إذا لم يتم بوضوح إغلاق مؤشر ملف في بعض مسار رمز الخطأ ثم انتظر SafeHandleأداة الإنهاء لتنظيف ذلك، في المرة التالية التي يتم فيها تشغيل تعليمات برمجية فإنه قد تفشل محاولة الوصول تماما إلى نفس ملف إذا كان أداة الإنهاء الفعل تشغيل. لترتيب هو reason، مؤكدا أن exهوts رمز تنظيف ويعمل بشكل صحيح سيساعد استرد من فشل أكثر وضوح وسرعة، حتى بالرغم من ذلك فإنه هو غير الضرورية حصرا.
قاعدة تحليل تعليمات برمجية
تنظيف تعليمات برمجية بعد catchيجب أن يكون في finallyحظر. إجراء مكالمات إلى التخلص في حظر أخيرا. catchيجب أن ينتهي كتل في يرمي أو rethrow. بينما يكون هناك استثناءات، مثل رمز الكشف عن ما إذا كان يمكن تأسيس اتصال بشبكة الموقع فقد تتلقى أي من عدد كبير من الاستثناءات، أي تعليمات برمجية الذي يتطلب catching عدد من الاستثناءات في الظروف العادية يجب إعطاء إشارة التي يجب أن يتم اختبار التعليمات البرمجية إلى راجع إذا ستنجح.
يجب أن يتم حلها Mutable الولاية المشتركة عملية واسع بين المجالات تطبيق أو استخدام منطقة تنفيذ مقيدة
كما هو موضح في المقدمة، يمكن أن يكون صعبة جداً كتابة تعليمات برمجية المدارة التي تراقب عملية-عرض مشاركة الالولاية عبر مجالات تطبيق بطريقة يمكن الاعتماد عليها. عملية مستوى الالولاية المشتركة هو أي نوع من بنية بيانات المشتركة بين مجالات تطبيق، أما في التعليمات البرمجية Win32، داخل CLR أو في التعليمات البرمجية المدارة باستخدام اتصال عن بعد. أي الولاية مشترك mutable هو صعبة جداً بشكل صحيح كتابة تعليمات برمجية مُدارة، وثابت أي مشاركة قد يتم إنجازه الولاية فقط بعناية كبيرة. إذا كان لديك الحالة المشتركة العملية بأكمله أو آلة بأكمله، ابحث عن طريقة إلى طريقة التخلص منها أو يحمي الحالة المشتركة باستخدام منطقة تنفيذ مقيدة (CER). لاحظ أن مشاركة أي مكتبة بالحالة التي هو لا تعريف وتصحيح يؤدي مضيف، مثل SQL الخادم، يتطلب نظيف AppDomainإلغاء تحميل للأعطال.
إذا تعليمات برمجية يستخدم COM الكائن، وتجنب مشاركة هذا الكائن COM بين مجالات التطبيقات.
لا تعمل عمليات تأمين عملية واسع أو بين مجالات التطبيقات.
في الماضي، Enterو تأمين بيان (C# مرجع)تم استخدام إلى إنشاء العمومية عملية التأمين. تشغيل سبيل المثال، يحدث هذا عند تأمين تشغيل AppDomainagile clكـses، مثل كـ Typeمثيلات غير المشترك كـ semblies، Threadالكائنات وسلاسل interned، وبعض سلاسل المشتركة عبر مجالات تطبيق باستخدام اتصال عن بعد. تم تأمين هذه لا عملية أطول بأكمله. للتعرف تشغيل وجود قفل عملية واسعة مجال interapplication، تحدد إذا كانت تستخدم التعليمة البرمجية ضمن التأمين أي مورد خارجي، الدائمة كملف تشغيل قرص أو من الممكن أن تكون قاعدة بيانات.
ملاحظة that taking a قفل within an AppDomain might cause problems if the protected تعليمات برمجية uses an خارجي مورد because that تعليمات برمجية may تشغيل simultaneously عبر multiple تطبيق domains. This can be a problem when writing إلى واحد ملف السجل أو ربط إلى a مأخذ for the entire عملية. These التغييرات mean there غير محقق easy way, using مدارة تعليمات برمجية, إلى يحصل a عملية-عمومي قفل, غير ذلك than using a named Mutex أو Semaphore مثيل. إنشاء تعليمات برمجية that does not تشغيل في الثاني تطبيق domains simultaneously, أو استخدم the Mutex أو Semaphore فئات. If موجود تعليمات برمجية cannot be تم تغييره, do not استخدم a Win32 named mutex إلى achieve this المزامنة because تشغيل في fiber الوضع means you cannot guarantee the same operating النظام مؤشر ترابط will اكتساب و يطرح المنتج a mutex. يجب أن تستخدم مدار Mutexفئة، أو مسمى ManualResetEvent، AutoResetEvent، أو Semaphoreليزامن قفل تعليمات برمجية بطريقة التي CLR هو علم بدلاً من يزامن القفل باستخدام تعليمات برمجية غير المدارة.
تجنب قفل(typeof(النوع الخاص بي))
العامة والخاصة Typeالكائنات في تجميعات مشتركة مع نسخ واحدة فقط من تعليمات برمجية المشتركة عبر الجميع التطبيقات مجالات أيضا وجود مشاكل. للتجميعات مشتركة، هناك هو مثيل واحد فقط من Typeكل عملية، مما يعني أن عدة مجالات تطبيق يجعله مشتركًا تماما نفس Typeالمثيل. أخذ بتأمين تشغيل Typeمثيل يأخذ قفل الذي يؤثر تشغيل العملية بالكامل، لا فقط AppDomain. إذا واحد AppDomainتأخذ بتأمين Typeيحصل فجأة إحباط الكائن ثم مؤشر الترابط هذا، لا يتم تحرير التأمين. وهذا قفل ثم قد يسبب مجالات التطبيقات الأخرى إلى dead قفل.
تتضمن طريقة بضاعة للحصول على التأمين في وظائف ثابتة إضافة ثابت داخلي المزامنة الكائن إلى التعليمات البرمجية. Th هو قد تتم تهيئة في الدالة الإنشائية الفئة إذا كان ملف هو موجود، ولكن إذا لم يمكن يمكن تهيئته كرقم هو:
private static Object s_InternalSyncObject;
private static Object InternalSyncObject
{
get
{
if (s_InternalSyncObject == null)
{
Object o = new Object();
Interlocked.CompareExchange(
ref s_InternalSyncObject, o, null);
}
return s_InternalSyncObject;
}
}
ثم أخذ بتأمين استخدام InternalSyncObjectالخاصية إلى الحصول تشغيل كائن إلى تأمين تشغيل. لا تحتاج إلى استخدام خاصية إذا كنت قد تهيئة كائن مزامنة داخلية في المكتب فئة المنشئ. تدقيق مزدوجة قفل تهيئة تعليمات برمجية يجب أن يبدو هذا المثال:
public static MyClass SingletonProperty
{
get
{
if (s_SingletonProperty == null)
{
lock(InternalSyncObject)
{
// Do not use lock(typeof(MyClass))
if (s_SingletonProperty == null)
{
MyClass tmp = new MyClass(…);
// Do all initialization before publishing
s_SingletonProperty = tmp;
}
}
}
return s_SingletonProperty;
}
}
ملاحظة حول قفل(this)
هو المقبولة بشكل عام الحصول تشغيل تأمين تشغيل فرد الكائن الذي هو قابل للوصول بشكل عام. ومع ذلك، إذا كان الكائن هو كائن المفرد التي قد تتسبب في الأنظمة الفرعية بأكمله إلى حالة توقف تام، جرب استخدام نمط التصميم أعلاه أيضا. تشغيل سبيل المثال، قفل تشغيل واحدة SecurityManagerيتسبب الكائن في حالة توقف تام داخل AppDomainإجراء الكامل AppDomainغير قابل للاستخدام. هو ممارسة جيدة للا تأخذ قفل تشغيل كائن قابل للوصول بشكل عام لترتيب هو النوع. تشغيل الرغم من ذلك قفل تشغيل مجموعة فردية أو الصفيف يجب عادة لا تقدم مشكلة.
قاعدة تحليل تعليمات برمجية
لا يكون هناك تأمين تشغيل الأنواع التي قد يتم استخدام عبر مجالات تطبيق أو لم يكن ملائماً قوية للهوية. Do not يتصلEnterتشغيل aType,MethodInfo,PropertyInfo,String,ValueType,Thread, أو أي كائن that derives منMarshalByRefObject.
المكالمات إزالة GC.KeepAlive
مقداراً كبيرا من تعليمات برمجية exهوting أما لا يستخدم KeepAliveإذا يجب أو يقوم باستخدامها عند ذلك هو لا تناسب. بعد التحويل إلى SafeHandle، فئات لا يلزم يتصل KeepAlive، باعتبار أن لم يكن أداة الإنهاء لكن تعتمد تشغيل SafeHandleلإنهاء مؤشرات النظام التشغيل. أثناء الاحتفاظ باستدعاء تكلفة أداء KeepAliveقد يكون طفيف، الإدراك التي استدعاء KeepAliveهو ضرورية أو كافية لحل عمر هو sue التي قد لم تعد exهوt يجعل التعليمة البرمجية من الصعب المحافظة على. ومع ذلك، عند استخدام COM إمكانية التشغيل المتداخل CLR الاستدعاء wrappers (RCWs) KeepAliveهو سيظل مطلوبة بواسطة رمز.
قاعدة تحليل تعليمات برمجية
قم بإزالة KeepAlive.
استخدم سمة حماية مضيف
HostProtectionAttribute(HPA) يوفر استخدام الاجراءات الأمان مصرحة إلى تحديد متطلبات حماية مضيف، مما يسمح للمضيف إلى منع بعض الأساليب التي تعتبر غير مناسبة لمضيف معين، مثل استدعاء تعليمات برمجية الموثوق به ثقة كاملة حتى Exitأو Showلخادم SQL.
HPA يؤثر على التطبيقات غير المدارة فقط والتي تستضيف وقت تشغيل اللغة العامة و تطبيق حماية مضيف، مثل SQL الخادم. عند تطبيق، نتائج إجراء الأمني في إنشاء الطلب الارتباط تشغيل أساس موارد مضيف يعرض فئة أو أسلوب. إذا التعليمة البرمجية هو تشغيل في تطبيقات عميل أو على الخادم التي هو لا المضيف محمية، السمة "evaporates"؛ فإنه هو عدم الكشف عنها ولذلك لن يطبق.
هام |
---|
الغرض من القيم بالموضع هو السمة هو الخاصة بمضيف البرمجة طراز الإرشادات، لا سلوك الأمان الخاص بفرض.Although a ارتباط demand هو used إلى تحقق من conformance إلى programming model requirements, the HostProtectionAttribute ليس a الأمان إذن. |
If the مضيف does not have programming model requirements, the ارتباط demands do not occur.
This سمة identifies the following:
وظائف أو فئات that do not احتواء the مضيف programming model, but are otherwise benign.
وظائف أو فئات that do not احتواء the مضيف programming model و could lead إلى destabilizing الخادم-مدارة مستخدم تعليمات برمجية.
وظائف أو فئات that do not احتواء the مضيف programming model و could lead إلى a destabilization of the الخادم عملية itself.
ملاحظة |
---|
إذا كنت تقوم بإنشاء مكتبة الفئات ليتم استدعاؤها من قبل التطبيقات التي قد ينفذ في بيئة مضيف المحمي، يجب يطبق هذه السمة إلى الأعضاء التي تكشف HostProtectionResourceمورد الفئات.The .NET Framework فئة مكتبة الأعضاء مع this سمة cause فقط the فوري caller إلى be محدد.Your مكتبة عضو must also cause a فحص of its فوري caller في the same manner. |
Please بحث المزيد معلومات تشغيل HPA في HostProtectionAttribute.
قاعدة تحليل تعليمات برمجية
ل SQL الخادم، الجميع الأساليب المستخدمة إلى تقدم المزامنة أو مؤشر الترابط التشعبي يجب تعريف HPA. يتضمن ذلك وظائف المشاركة في الولاية مزامنة أو إدارة معالجات خارجي. TheHostProtectionResourcevalues that impact SQL الخادم areSharedState,Synchronization, andExternalProcessMgmt. ومع ذلك، أي أسلوب الكشف عن أي HostProtectionResourceيجب تعريف HPA، ليس فقط تلك استخدام موارد التي تؤثر على SQL.
عدم حظر في تعليمات برمجية غير مُدارة بشكل غير محدود
حظر في تعليمات برمجية غير المدارة بدلاً من تعليمات برمجية المدارة يؤدي هجوم لقطع الخدمة لأن CLR هو تعذر إيقاف قبل الاكتمال مسار التنفيذ. يمنع مؤشر ترابط محظورة CLR من إلغاء تحميل AppDomain، على الأقل دون القيام بعمليات غير آمنة بعض بالغة. حظر استخدام اﻷولى تزامن Win32 هو مثال واضح عن شيء ما لا يسمح لنا. Blockفيg في استدعاء ReadFileتشغيل مأخذ توصيل يجب تجنب أمكن — مثاليا API Wفي32 يجب أن يوفر إليه لعملية مثل هذا إلى انتهاء مهلة.
يجب أن أي أسلوب المكالمات في الأصلي مثاليا استخدم استدعاء Win32 مع مهلة معقولة، محدودة. إذا كان المستخدم هو السماح بتحديد المهلة، المستخدم يجب أن لا يتم السماح بتحديد مهلة لانهائية دون permهوsion الأمان الخاص ببعض. كـ إرشاد، إذا كان أسلوب يقوم بحظر لأكثر من~ 10 ثوان، تحتاج إلى استخدام الإصدار يدعم مهلات أو تحتاج إلى دعم إضافي CLR.
فيما يلي بعض الأمثلة عن API مشكوك فيه. يمكن تاريخ الإنشاء أنابيب (المجهول والمسمى) مع المهلة المحددة؛ ومع ذلك، رمز يجب التأكد من عدم استدعاء الدالة CreateNamedPipeولا WaitNamedPipeمع NMPWAIT_WAIT_FOREVER. بالإضافة إلى ذلك، يمكن أن يكون هناك غير متوقع منع حتى في حالة مهلة هو المحدد. استدعاء WriteFileتشغيل توجيه مجهول يمنع حتى يتم كتابة الجميع وحدات البايت، يعني ذلك أنه إذا كان احتياطي بيانات غير مقروءة بداخلها، WriteFileيحظر المكالمة حتى قام القارئ بتحرير مسافة احتياطي للتوجيه. مأخذ توصيل يجب دائماً استخدم بعض واجهة برمجة تطبيقات يمنح إليه مهلة.
قاعدة تحليل تعليمات برمجية
حظر دون المهلة المحددة في تعليمات برمجية غير المدارة هو هجوم لقطع الخدمة. عدم تنفيذ النظام الأساسي استدعاء الاستدعاءات إلى WaitForSingleObject، WaitForSingleObjectEx، WaitForMultipleObjects، MsgWaitForMultipleObjects، و MsgWaitForMultipleObjectsEx. لا استخدم NMPWAIT_WAIT_FOREVER.
قم بتعريف أي ميزات STA-تابع.
قم بتعريف أية تعليمات برمجية يستخدم COM مؤشر ترابط مفرد apartments (STAs). STAs معطلة في SQL Server العملية. الميزات التي تستند إلى CoInitialize، مثل كـ يجب معطّل العدادات أداء أو حافظة، ضمن SQL الخادم.
تأكد من Finalizers حر من مشاكل المزامنة
عدة مؤشرات ترابط أداة الإنهاء قد تكون موجودة في المستقبل الإصدارات من برنامج.NET Framework، وهذا يعني في finalizers لمثيلات أخرى من نفس النوع تشغيل في نفس الوقت. لم يكن إلى يكون تماما مسار تنفيذ اﻷمن; collecإلىr البيانات المهملة يضمن تشغيل مؤشر ترابط واحد فقط أداة الإنهاء لمثيل كائن معطى. ومع ذلك، يجب أن يوجد رمز finalizers إلى تجنب حالات السباق و deadlocks عند تشغيل مثيلات متعددة لكائن آخر في نفس الوقت. عند استخدام أي الولاية خارجي، مثل كـ الكتابة إلى ملف يسجل، في أداة الإنهاء، ترابط مشكلات يجب معالجة. لا تعتمد تشغيل الإنهاء إلى توفير أمان مؤشر ترابط. لا تستخدم sإلىrage المحلي مؤشر ترابط، إدارتها أو الأصلية، إلى الولاية sإلىre تشغيل مؤشر ترابط أداة الإنهاء.
قاعدة تحليل تعليمات برمجية
يجب أن يكون finalizers خال من مشاكل المزامنة. لا استخدم الولاية mutable ثابتة في أداة الإنهاء.
تجنب ذاكرة غير المدارة إذا ممكن
ذاكرة غير مدار يمكن أن تكون leaked، تماما مثل مؤشر النظام التشغيل. إذا كان ذلك ممكناً، أعد إلى استخدام ذاكرة تشغيل المكدس استخدام stackalloc (C# مرجع)أو كائن مدار المضافة مثل بيان ثابتة (C# مرجع)أو GCHandleاستخدام [بايت. GCيؤدي مسح هذه لأعلى. ومع ذلك، إذا كان يجب أن يمكنك يخصص ذاكرة غير المدارة، يمكنك استخدام فئة مشتقة من SafeHandleإلى التفاف يخصص ذاكرة.
لاحظ أن هناك هو حالة واحدة على الأقل الموقع SafeHandleهو غير كاف. بالنسبة لاستدعاءات الأسلوب COM التي يخصص أو حر ذاكرة، فإنه من الشائع لواحد مكتبة الارتباط الديناميكي يخصص ذاكرة مع CoTaskMemAllocثم DLL آخر بتحرير ذاكرة مع CoTaskMemFree. Using SafeHandle في these places would be inappropriate since it will attempt إلى tie the مدة بقاء of the unmanaged ذاكرة إلى the مدة بقاء of the SafeHandle instead of allowing the غير ذلك DLL عنصر تحكم the مدة بقاء of the ذاكرة.
Review الجميع Uses of Catch( استثناء)
Catch blocks that catch الجميع استثناءات instead of واحد specific استثناء will now catch the غير متزامن استثناءات كـ well. Examine every catch( استثناء) حظر, looking for لا important مورد releasing أو backout تعليمات برمجية that might be skipped, كـ well كـ potentially incorrect سلوك within the catch حظر itself for handling a ThreadAbortException, StackOverflowException, أو OutOfMemoryException. لاحظ أنه هو th المحتملة هو قد يتم تسجيل التعليمة البرمجية أو إجراء بعض الافتراضات أن ذلك قد فقط رؤية استثناءات معينة، أو عند حدوث استثناء فشلت لسبب معين واحد. هذه الافتراضات التي قد تحتاج إلى محدث ليتضمن ThreadAbortException.
خذ بعين الاعتبار تغيير الجميع يضع هذا الالتقاط الجميع الاستثناءات إلى catching نوع معين من الاستثناءات التي تتوقعها سوف يتم طرح، مثل FormatExceptionمن سلسلة تنسيق الأساليب. يؤدي ذلك إلى منع حظر catch استثناءات غير متوقعة بتشغيل و يساعد في ضمان لا يخفي أخطاء في تعليمات برمجية ب catching استثناءات غير متوقعة. كـ قاعدة عامة مطلقا بمعالجة استثناء في تعليمات برمجية للمكتبة (تعليمات برمجية التي تتطلب منك معرفة استثناء قد يشير إلى وجود خلل تصميم في تعليمات برمجية الذي تحاول الاتصال به). قد تحتاج في بعض الحالات إلى جذب استثناء وقم بطرح استثناء مختلفة نوعا إلى توفير مزيد من بيانات. استخدم استثناءات المتداخلة في هذا حالة، تخزين سبب الفشل الحقيقي في InnerExceptionخاصية جديدة استثناء.
قاعدة تحليل تعليمات برمجية
مراجعة الجميع جذب الكتل في إدارة تعليمات برمجية هذا الالتقاط الجميع الكائنات أو catch الجميع الاستثناءات. في C#، وهذا يعني وضع إشارة كلا catch{} و catch(Exception){}. خذ بعين الاعتبار إجراء نوع استثناء خاص جداً، أو قم بمراجعة تعليمات برمجية إلى التأكد من أنه لا تعمل بطريقة غير صحيحة دون إذا أنه catches على نوع استثناء غير متوقع.
قم بافتراض غير مدارة مؤشر ترابط هي Win32 مؤشر ترابط – هو استخدام الألياف البصرية
يعمل استخدام تخزين المحلي لمؤشر ترابط المدارة، ولكن قد لا استخدم تخزين المحلي مؤشر ترابط غير المدارة أو تفترض تشغيل التعليمة البرمجية على الحالي نظام تشغيل مؤشر ترابط مرة أخرى. لا تقم بتغيير الإعدادات مثل مؤشر ترابط لغة. باستدعاء InitializeCriticalSectionأو CreateMutexعبر استدعاء النظام الأساسي لأنها تتطلب أيضا إنهاء مؤشر ترابط نظام التشغيل الذي يدخل قفل قفل. حيث أن هذا لن يكون الحال عند استخدام fibers، مقاطع هامة Win32 و كائنات المزامنة لا يمكن استخدامها في SQL مباشرة. لاحظ أن مدارة Mutexفئة عدم معالجة هذه المشكلات ترابط مؤشر ترابط.
يمكنك بأمان باستخدام معظم الولاية تشغيل مدار Threadكائن، بما في ذلك تخزين المحلي لمؤشر الترابط المدارة و لمؤشر الترابط الحالي واجهة المستخدم الثقافة. يمكنك أيضا استخدام ThreadStaticAttribute، الذي يجعل القيمة متغير ثابتة exهوting يمكن الوصول إليها فقط من قبل مؤشر ترابط المدارة الحالية (th هو هو طريقة أخرى للقيام بتخزين محلي ألياف بصرية في CLR). برمجة أسباب الطراز، يمكنك عدم تغيير الثقافة الحالي من مؤشر ترابط عند التشغيل في SQL.
قاعدة تحليل تعليمات برمجية
SQL الخادم يعمل في الوضع ألياف بصرية؛ قم بعدم استخدام مؤشر ترابط مخزن محلي. النظام الأساسي تجنب استدعاء الاستدعاءات إلى TlsAlloc، TlsFree، TlsGetValue، وTlsSetValue.
ترك SQL الخادم معالجة التمثيل
منذ التمثيل يعمل على مؤشر ترابط المستوى و SQL تشغيل في الوضع ألياف بصرية، لا يجب على تعليمات برمجية مُدارة تمثيل المستخدمين، و يجب أن لا استدعاء RevertToSelf.
قاعدة تحليل تعليمات برمجية
ترك SQL الخادم بمعالجة التمثيل. Do not استخدمRevertToSelf,ImpersonateAnonymousToken,DdeImpersonateClient,ImpersonateDdeClientWindow,ImpersonateLoggedOnUser,ImpersonateNamedPipeClient,ImpersonateSelf,RpcImpersonateClient,RpcRevertToSelf,RpcRevertToSelfEx, أوSetThreadToken.
غير يتصل مؤشر ترابط::توقف مرحلي
القدرة على إلى التوقف المرحلي قد يظهر مؤشر ترابط عملية بسيطة، ولكن يمكن أن يسبب deadlocks. حالة مؤشر ترابط الضغط بتأمين يتم إيقافها مرحلياً من قبل مؤشر ترابط ثاني و مؤشر ترابط آخر يحاول استخدام التأمين نفسه، يحدث حالة توقف تام. Suspendيمكن أن تتداخل مع الأمان، وتحميل فئة، والعمل عن بعد، و انعكاس حاليا.
قاعدة تحليل تعليمات برمجية
Do not يتصلSuspend. يمكنك استخدام اﻷولى تزامن حقيقية بدلاً من ذلك، مثل على Semaphoreأو ManualResetEvent.
يحمي العمليات حرج بعقود و الثبات مناطق تنفيذ مقيدة
عند تنفيذ عملية معقدة بتحديث حالة مشترك أو الذي يحتاج determinهوtically أما تنجح بشكل كامل أو كامل فشل، تأكد من أنه هو محمي بمنطقة تنفيذ مقيدة (CER). وهذا يضمن أن يتم تشغيل تعليمات برمجية في كل حالة، حتى abrupt مؤشر ترابط الإيقاف قبل الاكتمال أو على abrupt AppDomainإلغاء التحميل.
CER هو على try/finallyحظر مباشرة مسبوقة استدعاء معينة PrepareConstrainedRegions.
القيام بذلك يرشد المحول البرمجي في نفس الوقت إلى تحضير الجميع تعليمات برمجية الموجودة في أخيرا حظر قبل تشغيل tryكتلة. Th هو الذي يضمن التعليمة البرمجية في حظر أخيرا هو وسوف تعمل في الجميع الحالات. هو غير معروفة في CER أن عنصر فارغ tryحظر. استخدام CER يحمي إحباط مسار التنفيذ غير المتزامن و استثناءات بنفاد ذاكرة. راجع ExecuteCodeWithGuaranteedCleanupلنموذج من CER الذي يعالج بالإضافة إلى ذلك امتدت مكدس الذاكرة المؤقتة للتعليمات البرمجية exceedingly عميق.
راجع أيضًا:
المرجع
System.Runtime.ConstrainedExecution