Güvenlik Çerçevesi: Özel Durum Yönetimi | Azaltıcı etken

Ürün/Hizmet Makale
WCF
Web API'si
Web uygulaması

WCF- Yapılandırma dosyasına serviceDebug düğümünü eklemeyin

Başlık Ayrıntılar
Bileşen WCF
SDL Aşaması İnşa et
Uygulanabilir Teknolojiler Genel, NET Framework 3
Öznitelikler N/A
Referanslar MSDN, Fortify Kingdom
Adımlar Windows Communication Framework (WCF) hizmetleri, hata ayıklama bilgilerini kullanıma sunacak şekilde yapılandırılabilir. Hata ayıklama bilgileri üretim ortamlarında kullanılmamalıdır. etiketi, <serviceDebug> bir WCF hizmeti için hata ayıklama bilgileri özelliğinin etkinleştirilip etkinleştirilmediğini tanımlar. includeExceptionDetailInFaults özniteliği true olarak ayarlanırsa, uygulamadan gelen özel durum bilgileri istemcilere döndürülür. Saldırganlar, hata ayıklama çıkışından elde ettikleri ek bilgilerden yararlanarak çerçeveye, veritabanına veya uygulama tarafından kullanılan diğer kaynaklara yönelik saldırıları bağlayabilir.

Example

Aşağıdaki yapılandırma dosyası etiketini içerir <serviceDebug> :

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

Hizmette hata ayıklama bilgilerini devre dışı bırakın. Bu, etiketi uygulamanızın yapılandırma dosyasından <serviceDebug> kaldırarak gerçekleştirilebilir.

WCF- Yapılandırma dosyasına serviceMetadata düğümünü eklemeyin

Başlık Ayrıntılar
Bileşen WCF
SDL Aşaması İnşa et
Uygulanabilir Teknolojiler Genel
Öznitelikler Genel, NET Framework 3
Referanslar MSDN, Fortify Kingdom
Adımlar Bir hizmetle ilgili bilgilerin herkese açık olarak sunulması, saldırganlara hizmetlerden nasıl yararlanabilecekleri hakkında değerli içgörüler sağlayabilir. etiketi meta <serviceMetadata> veri yayımlama özelliğini etkinleştirir. Hizmet meta verileri genel olarak erişilmemesi gereken hassas bilgiler içerebilir. En azından, yalnızca güvenilen kullanıcıların meta verilere erişmesine izin verin ve gereksiz bilgilerin gösterilmediğinden emin olun. Daha da iyisi, meta veri yayımlama özelliğini tamamen devre dışı bırakın. Güvenli bir WCF yapılandırması <serviceMetadata> etiketi içermez.

ASP.NET Web API'de uygun özel durum işlemenin yapıldığından emin olun

Başlık Ayrıntılar
Bileşen Web API'si
SDL Aşaması İnşa et
Uygulanabilir Teknolojiler MVC 5, MVC 6
Öznitelikler N/A
Referanslar ASP.NET Web API'de İstisna Yönetimi, ASP.NET Web API'de Model Doğrulama
Adımlar Varsayılan olarak, ASP.NET Web API'daki çoğu yakalanmayan özel durum, durum kodu 500, Internal Server Error olan bir HTTP yanıtına çevrilir

Example

API tarafından döndürülen durum kodunu denetlemek için aşağıda HttpResponseException gösterildiği gibi kullanılabilir:

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

Example

Özel durum yanıtı üzerinde daha fazla denetim için sınıfı HttpResponseMessage aşağıda gösterildiği gibi kullanılabilir:

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;
}

türünde HttpResponseExceptionolmayan işlenmeyen özel durumları yakalamak için Özel Durum Filtreleri kullanılabilir. Özel durum filtreleri System.Web.Http.Filters.IExceptionFilter arabirimini uygular. Özel durum filtresi yazmanın en basit yolu sınıfından System.Web.Http.Filters.ExceptionFilterAttribute türemek ve OnException yöntemini geçersiz kılmaktır.

Example

Özel durumları HTTP durum koduna NotImplementedExceptiondönüştüren 501, Not Implemented bir filtre aşağıdadır:

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);
            }
        }
    }
}

Web API'sinde özel durum filtresi kaydetmenin birkaç yolu vardır:

  • Hareket bazında
  • Denetleyiciye göre
  • Genel

Example

Filtreyi belirli bir eyleme uygulamak için, filtreyi eyleme öznitelik olarak ekleyin:

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

Example

Filtreyi üzerindeki controllertüm eylemlere uygulamak için, filtreyi sınıfına controller öznitelik olarak ekleyin:

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

Example

Filtreyi tüm Web API denetleyicilerine genel olarak uygulamak için, filtrenin bir örneğini koleksiyona GlobalConfiguration.Configuration.Filters ekleyin. Bu koleksiyondaki özel durum filtreleri herhangi bir Web API denetleyicisi eylemi için geçerlidir.

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

Example

Model doğrulaması için model durumu aşağıda gösterildiği gibi CreateErrorResponse yöntemine geçirilebilir:

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

ASP.NET Web API'de olağanüstü işleme ve model doğrulama hakkında ek ayrıntılar için başvurular bölümündeki bağlantıları gözden geçirin

Hata iletilerinde güvenlik ayrıntılarını ifşa etme

Başlık Ayrıntılar
Bileşen Web uygulaması
SDL Aşaması İnşa et
Uygulanabilir Teknolojiler Genel
Öznitelikler N/A
Referanslar N/A
Adımlar

Genel hata iletileri, hassas uygulama verileri dahil edilmeden doğrudan kullanıcıya sağlanır. Hassas verilere örnek olarak şunlar verilebilir:

  • Sunucu adları
  • Bağlantı stringleri
  • Kullanıcı adları
  • Passwords
  • SQL yordamları
  • Dinamik SQL hatalarının ayrıntıları
  • Yığın izlemesi ve kod satırları
  • Bellekte depolanan değişkenler
  • Sürücü ve klasör konumları
  • Uygulama yükleme noktaları
  • Sunucu yapılandırma ayarları
  • Diğer iç uygulama ayrıntıları

Bir uygulama içindeki tüm hataları yakalamak ve genel hata iletileri sağlamanın yanı sıra IIS içinde özel hataların etkinleştirilmesi, bilgilerin açığa çıkmasını önlemeye yardımcı olur. SQL Server veritabanı ve .NET Özel durum işleme, diğer hata işleme mimarileri arasında özellikle ayrıntılıdır ve uygulamanızın profilini açan kötü amaçlı bir kullanıcı için son derece yararlıdır. .NET Exception sınıfından türetilen bir sınıfın içeriğini doğrudan görüntülemeyin ve beklenmeyen bir özel durumun doğrudan kullanıcıya yükseltilmemesi için uygun özel durum işlemeye sahip olduğunuzdan emin olun.

  • Kullanıcıya doğrudan özel durum/hata iletisinde bulunan belirli ayrıntıları soyutlayan genel hata iletileri sağlayın
  • .NET özel durum sınıfının içeriğini doğrudan kullanıcıya görüntülemeyin
  • Tüm hata iletilerini yakalayın ve uygunsa kullanıcıyı uygulama istemcisine gönderilen genel bir hata iletisi aracılığıyla bilgilendirin
  • Exception sınıfının içeriğini, özellikle .ToString() öğesinden döndürülen değeri veya Message ya da StackTrace özelliklerinin değerlerini doğrudan kullanıcıya göstermeyin. Bu bilgileri güvenli bir şekilde günlüğe kaydedin ve kullanıcıya daha zararsız bir ileti görüntüleyin.

Varsayılan hata işleme sayfasını uygulama

Başlık Ayrıntılar
Bileşen Web uygulaması
SDL Aşaması İnşa et
Uygulanabilir Teknolojiler Genel
Öznitelikler N/A
Referanslar ASP.NET Hata Sayfaları Ayarları İletişim Kutusunu Düzenleme
Adımlar

bir ASP.NET uygulaması başarısız olduğunda ve HTTP/1.x 500 İç Sunucu Hatasına neden olduğunda veya özellik yapılandırması (İstek Filtreleme gibi) bir sayfanın görüntülenmesini engellediğinde, bir hata iletisi oluşturulur. Yöneticiler, uygulamanın istemciye kolay bir ileti, istemciye ayrıntılı hata iletisi veya yalnızca localhost'a ayrıntılı hata iletisi görüntüleyip görüntülemeyeceğini seçebilir. <customErrors>web.config etiketi üç moda sahiptir:

  • Açık: Özel hata bildiriminin etkinleştirildiğini belirtir. DefaultRedirect özniteliği belirtilmezse, kullanıcılar genel bir hata görür. Özel hatalar uzak istemcilere ve yerel ana bilgisayara gösterilir
  • Kapalı: Özel hataların devre dışı bırakıldığını belirtir. Ayrıntılı ASP.NET hataları uzak istemcilere ve yerel ana bilgisayara gösterilir
  • RemoteOnly: Özel hataların yalnızca uzak istemcilere gösterileceğini ve yerel ana bilgisayara ASP.NET hataların gösterileceğini belirtir. Bu varsayılan değerdir

web.config dosyasını uygulama/site için açın ve etiketin ya <customErrors mode="RemoteOnly" /> ya da <customErrors mode="On" /> tanımlı olduğundan emin olun.

IIS’de Dağıtım Yöntemi’ni Perakende Olarak Ayarla

Başlık Ayrıntılar
Bileşen Web uygulaması
SDL Aşaması Dağıtım
Uygulanabilir Teknolojiler Genel
Öznitelikler N/A
Referanslar deployment Öğesi (ASP.NET Ayarlar Şeması)
Adımlar

Anahtar <deployment retail> , üretim IIS sunucuları tarafından kullanılmak üzere tasarlanmıştır. Bu anahtar, uygulamanın sayfada izleme çıkışı oluşturma yeteneğini devre dışı bırakarak, son kullanıcılara ayrıntılı hata iletileri görüntüleme özelliğini devre dışı bırakarak ve hata ayıklama anahtarını devre dışı bırakarak uygulamaların mümkün olan en iyi performans ve en az olası güvenlik bilgileri sızıntılarıyla çalışmasına yardımcı olmak için kullanılır.

Çoğu zaman, başarısız istek izleme ve hata ayıklama gibi geliştirici odaklı anahtarlar ve seçenekler etkin geliştirme sırasında etkinleştirilir. Herhangi bir üretim sunucusundaki dağıtım yönteminin perakende olarak ayarlanması önerilir. machine.config dosyasını açın ve <deployment retail="true" />'nin true olarak ayarlandığından emin olun.

Özel durumlar güvenli bir şekilde başarısız olmalıdır

Başlık Ayrıntılar
Bileşen Web uygulaması
SDL Aşaması İnşa et
Uygulanabilir Teknolojiler Genel
Öznitelikler N/A
Referanslar Güvenli bir şekilde başarısız olun
Adımlar Uygulama güvenli bir şekilde başarısız olmalıdır. Belirli bir kararın alınmasına bağlı olarak Boole değeri döndüren herhangi bir yöntemin dikkatle oluşturulmuş bir özel durum bloğu olmalıdır. Özel durum bloğu dikkatsizce yazıldığında, güvenlik sorunlarının fark edilmeden ortaya çıkmasına yol açan birçok mantıksal hata oluşur.

Example

        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;
            }
        }

Bir özel durum oluştuğunda yukarıdaki yöntem her zaman True döndürür. Son kullanıcı tarayıcı tarafından kabul edilen ancak Uri() oluşturucu tarafından kabul edilmeyen yanlış biçimlendirilmiş bir URL sağlarsa, bu bir istisna fırlatır ve kurban geçerli ancak hatalı biçimlendirilmiş URL'ye yönlendirilir.