إطار الأمان: إدارة الاستثناءات | التخفيف

المنتج /الخدمة مقالة
WCF
واجهة برمجة تطبيقات الويب
تطبيق ويب

WCF - لا تضمن عقدة serviceDebug في ملف التكوين

عنوان التفاصيل
Component WCF
مرحلة SDL بناء
التقنيات المعمول بها عام، NET Framework 3
سمات غير متوفر
المراجع MSDN، Fortify Kingdom
الخطوات يمكن تكوين خدمات إطار عمل الاتصال في Windows (WCF) لكشف معلومات التصحيح. يجب ألا تستخدم معلومات التصحيح في بيئات الإنتاج. يحدد الوسم <serviceDebug> ما إذا كانت ميزة معلومات التصحيح مفعلة لخدمة WCF. إذا تم تعيين السمة includeExceptionDetailInFaults على true، سيتم إرجاع معلومات الاستثناءات من التطبيق إلى العميل. يمكن للمهاجمين الاستفادة من المعلومات الإضافية التي يحصلون عليها من تصحيح الأخطاء لتنفيذ هجمات تستهدف الإطار أو قاعدة البيانات أو الموارد الأخرى المستخدمة من قبل التطبيق.

مثال

يتضمن ملف التكوين التالي العلامة <serviceDebug> :

<configuration> 
<system.serviceModel> 
<behaviors> 
<serviceBehaviors> 
<behavior name=""MyServiceBehavior""> 
<serviceDebug includeExceptionDetailInFaults=""True"" httpHelpPageEnabled=""True""/> 
... 

قم بتعطيل معلومات التصحيح في الخدمة. يمكن تحقيق ذلك عن طريق إزالة العلامة <serviceDebug> من ملف إعدادات تطبيقك.

WCF - لا تضمن عقدة serviceMetadata في ملف التكوين

عنوان التفاصيل
Component WCF
مرحلة SDL بناء
التقنيات المعمول بها العام
سمات عام، NET Framework 3
المراجع MSDN، Fortify Kingdom
الخطوات كشف المعلومات عن الخدمة بشكل علني يمكن أن يوفر للمهاجمين رؤى قيمة حول كيفية استغلال الخدمة. يتيح الوسم <serviceMetadata> ميزة نشر البيانات الوصفية. قد تحتوي بيانات الخدمة الوصفية على معلومات حساسة لا ينبغي أن تكون متاحة للجمهور. على الأقل، اسمح للمستخدمين الموثوقين فقط بالوصول إلى البيانات الوصفية وضمان عدم كشف المعلومات غير الضرورية. والأفضل من ذلك، قم بتعطيل القدرة تماما على نشر البيانات الوصفية. تكوين WCF الآمن لن يحتوي على العلامة <serviceMetadata> .

تأكد من أن التعامل الصحيح مع الاستثناءات يتم في ASP.NET Web API

عنوان التفاصيل
Component واجهة برمجة تطبيقات الويب
مرحلة SDL بناء
التقنيات المعمول بها MVC 5، MVC 6
سمات غير متوفر
المراجع معالجة الاستثناءات في ASP.NET Web API، التحقق من النموذج في ASP.NET Web API
الخطوات افتراضيا، تترجم معظم الاستثناءات غير المكتشفة في ASP.NET Web API إلى استجابة HTTP برمز الحالة 500, Internal Server Error

مثال

للتحكم في رمز الحالة الذي يعيده الواجهة، HttpResponseException يمكن استخدامه كما هو موضح أدناه:

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    return item;
}

مثال

لمزيد من التحكم في استجابة الاستثناء، يمكن استخدام الفئة HttpResponseMessage كما هو موضح أدناه:

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
        {
            Content = new StringContent(string.Format("No product with ID = {0}", id)),
            ReasonPhrase = "Product ID Not Found"
        }
        throw new HttpResponseException(resp);
    }
    return item;
}

لاكتشاف الاستثناءات غير المتعاملة التي ليست من النوع HttpResponseException، يمكن استخدام مرشحات الاستثناء. تقوم مرشحات الاستثناء بتنفيذ الواجهة System.Web.Http.Filters.IExceptionFilter . أبسط طريقة لكتابة مرشح استثناء هي الاشتقاق من الفئة System.Web.Http.Filters.ExceptionFilterAttribute وتجاوز طريقة OnException.

مثال

إليك مرشح يحول NotImplementedException الاستثناءات إلى رمز 501, Not Implementedحالة HTTP:

namespace ProductStore.Filters
{
    using System;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http.Filters;

    public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute 
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            if (context.Exception is NotImplementedException)
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
            }
        }
    }
}

هناك عدة طرق لتسجيل مرشح استثناءات واجهة برمجة تطبيقات الويب:

  • بالفعل
  • حسب وحدة التحكم
  • عالميا

مثال

لتطبيق المرشح على إجراء معين، أضف المرشح كخاصية إلى الإجراء:

public class ProductsController : ApiController
{
    [NotImplExceptionFilter]
    public Contact GetContact(int id)
    {
        throw new NotImplementedException("This method is not implemented");
    }
}

مثال

لتطبيق المرشح على جميع الإجراءات على ، controllerأضف المرشح كسمة إلى الفئة controller :

[NotImplExceptionFilter]
public class ProductsController : ApiController
{
    // ...
}

مثال

لتطبيق الفلتر بشكل عام على جميع وحدات تحكم واجهة برمجة تطبيقات الويب، أضف نسخة من الفلتر إلى المجموعة GlobalConfiguration.Configuration.Filters . تنطبق مرشحات الاستثناء في هذه المجموعة على أي إجراء لوحدة تحكم واجهة برمجة تطبيقات الويب.

GlobalConfiguration.Configuration.Filters.Add(
    new ProductStore.NotImplExceptionFilterAttribute());

مثال

للتحقق من صحة النموذج، يمكن تمرير حالة النموذج إلى طريقة CreateErrorResponse كما هو موضح أدناه:

public HttpResponseMessage PostProduct(Product item)
{
    if (!ModelState.IsValid)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
    // Implementation not shown...
}

تحقق من الروابط في قسم المراجع لمزيد من التفاصيل حول التعامل الاستثنائي والتحقق من صحة النماذج في ASP.NET Web API

لا تكشف تفاصيل الأمان في رسائل الخطأ

عنوان التفاصيل
Component تطبيق ويب
مرحلة SDL بناء
التقنيات المعمول بها العام
سمات غير متوفر
المراجع غير متوفر
الخطوات

يتم توفير رسائل خطأ عامة مباشرة للمستخدم دون تضمين بيانات التطبيقات الحساسة. أمثلة على البيانات الحساسة تشمل:

  • أسماء الخوادم
  • سلاسل الاتصال
  • أسماء المستخدمين
  • كلمات المرور
  • إجراءات SQL
  • تفاصيل أعطال SQL الديناميكية
  • تتبع المكدس وخطوط الشيفرة
  • المتغيرات المخزنة في الذاكرة
  • مواقع الأقراص والمجلدات
  • نقاط تثبيت التطبيق
  • إعدادات تكوين المضيف
  • تفاصيل تطبيقات داخلية أخرى

سيساعد حبس جميع الأخطاء داخل التطبيق وتوفير رسائل أخطاء عامة، بالإضافة إلى تمكين أخطاء مخصصة داخل IIS، في منع الكشف عن المعلومات. إدارة قواعد بيانات SQL Server واستثناءات .NET، إلى جانب بنى معالجة الأخطاء الأخرى، مطولة بشكل خاص ومفيدة للغاية للمستخدمين الخبيثين الذين يصنفون تطبيقك. لا تعرض محتويات الفئة المشتقة من فئة استثناءات .NET مباشرة، وتأكد من أن لديك معالجة استثنائية بشكل صحيح حتى لا يتم عرض استثناء غير متوقع مباشرة للمستخدم عن غير قصد.

  • توفير رسائل خطأ عامة مباشرة للمستخدم تجريد التفاصيل المحددة الموجودة مباشرة في رسالة الاستثناء/الخطأ
  • لا تعرض محتويات فئة استثناء .NET مباشرة للمستخدم
  • قم بحجز جميع رسائل الخطأ وإذا كان ذلك مناسبا أبلغ المستخدم عبر رسالة خطأ عامة مرسلة إلى عميل التطبيق
  • لا تعرض محتويات فئة الاستثناء مباشرة للمستخدم، خاصة قيمة الإرجاع من .ToString()، أو قيم خصائص Message أو StackTras. سجل هذه المعلومات بأمان وعرض رسالة أكثر براءة للمستخدم

تنفيذ صفحة معالجة الأخطاء الافتراضية

عنوان التفاصيل
Component تطبيق ويب
مرحلة SDL بناء
التقنيات المعمول بها العام
سمات غير متوفر
المراجع تحرير مربع حوار إعدادات صفحات الخطأ ASP.NET
الخطوات

عندما يفشل تطبيق ASP.NET ويتسبب في خطأ في خادم HTTP/1.x 500 داخلي، أو عندما يمنع تكوين الميزة (مثل تصفية الطلبات) عرض الصفحة، يتم توليد رسالة خطأ. يمكن للمسؤولين اختيار ما إذا كان يجب على التطبيق عرض رسالة ودية للعميل، أو رسالة خطأ مفصلة للعميل، أو رسالة خطأ مفصلة للمضيف المحلي فقط. <customErrors> الوسم في web.config له ثلاثة أوضاع:

  • عن: يحدد تفعيل الأخطاء المخصصة. إذا لم يتم تحديد خاصية defaultRedirect، يرى المستخدمون خطأ عام. تظهر الأخطاء المخصصة للعملاء البعيدين وللمضيف المحلي
  • الخارج: يحدد تعطيل الأخطاء المخصصة. يتم عرض أخطاء ASP.NET التفصيلية للعملاء البعيدين وللمضيف المحلي
  • RemoteOnly: يحدد أن الأخطاء المخصصة تعرض فقط للعملاء البعيدين، وأن ASP.NET الأخطاء تعرض للمضيف المحلي. هذه هي القيمة الافتراضية

افتح ملف web.config التطبيق/الموقع وتأكد من أن العلامة تحتوي على أي من <customErrors mode="RemoteOnly" /> المحددات أو <customErrors mode="On" /> التعريف.

تعيين طريقة النشر في البيع بالتجزئة في IIS

عنوان التفاصيل
Component تطبيق ويب
مرحلة SDL التوزيع
التقنيات المعمول بها العام
سمات غير متوفر
المراجع deployment element (ASP.NET Set Schema)
الخطوات

<deployment retail> المفتاح مخصص للاستخدام من قبل خوادم IIS الإنتاجية. يستخدم هذا المفتاح لمساعدة التطبيقات على العمل بأفضل أداء ممكن وأقل تسريبات معلومات أمان ممكنة عن طريق تعطيل قدرة التطبيق على توليد مخرجات تتبع على الصفحة، وتعطيل القدرة على عرض رسائل الخطأ التفصيلية للمستخدمين النهائيين، وتعطيل مفتاح التصحيح.

غالبا ما يتم تفعيل المفاتيح والخيارات التي تركز على المطورين، مثل فشل تتبع الطلبات وتصحيح الأخطاء، أثناء التطوير النشط. يوصى بأن يتم ضبط طريقة النشر على أي خادم إنتاجي على النسخة السوقية. افتح ملف machine.config وتأكد من بقائها <deployment retail="true" /> مضبوطة على true.

يجب أن تفشل الاستثناءات بأمان

عنوان التفاصيل
Component تطبيق ويب
مرحلة SDL بناء
التقنيات المعمول بها العام
سمات غير متوفر
المراجع فشل بأمان
الخطوات يجب أن يفشل التطبيق بأمان. أي طريقة ترجع قيمة بوليانية، بناء على اتخاذ قرار معين، يجب أن يكون لديها كتلة استثناء منشأة بعناية. هناك الكثير من الأخطاء المنطقية التي تتسلل بسببها مشاكل الأمان عندما تكتب كتلة الاستثناء بشكل غير دقيق.

مثال

        public static bool ValidateDomain(string pathToValidate, Uri currentUrl)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(pathToValidate))
                {
                    var domain = RetrieveDomain(currentUrl);
                    var replyPath = new Uri(pathToValidate);
                    var replyDomain = RetrieveDomain(replyPath);

                    if (string.Compare(domain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
                    {
                        //// Adding additional check to enable CMS urls if they are not hosted on same domain.
                        if (!string.IsNullOrWhiteSpace(Utilities.CmsBase))
                        {
                            var cmsDomain = RetrieveDomain(new Uri(Utilities.Base.Trim()));
                            if (string.Compare(cmDomain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
                            {
                                return false;
                            }
                            else
                            {
                                return true;
                            }
                        }

                        return false;
                    }
                }

                return true;
            }
            catch (UriFormatException ex)
            {
                LogHelper.LogException("Utilities:ValidateDomain", ex);
                return true;
            }
        }

الطريقة أعلاه ستعيد دائما True، إذا حدث استثناء ما. إذا قدم المستخدم النهائي عنوان URL مشوه، يحترمه المتصفح بينما لا يحترمه الصانع Uri() ، فهذا سيعطي استثناء، وسيتم نقل الضحية إلى الرابط الصحيح ولكن المشوه.