Sdílet prostřednictvím


Rámec zabezpečení: | správy výjimek Zmírnění rizik

Produkt nebo služba Článek
WCF
Webové rozhraní API
Webová aplikace

WCF – Nezahrnujte do konfiguračního souboru uzel serviceDebug.

Nadpis Podrobnosti
Komponenta WCF
Fáze SDL Sestavení
Použitelné technologie Obecné, NET Framework 3
Atributy
Reference MSDN, Fortify Kingdom
Kroky Služby Windows Communication Framework (WCF) je možné nakonfigurovat tak, aby zpřístupňují informace o ladění. Informace o ladění by se neměly používat v produkčních prostředích. Značka <serviceDebug> definuje, zda je pro službu WCF povolena funkce informací o ladění. Pokud je atribut includeExceptionDetailInFaults nastaven na hodnotu true, budou klientům vráceny informace o výjimce z aplikace. Útočníci můžou využít další informace, které získají z výstupu ladění, k připojení útoků cílených na architekturu, databázi nebo jiné prostředky používané aplikací.

Příklad

Následující konfigurační soubor obsahuje <serviceDebug> značku :

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

Zakažte informace o ladění ve službě. Toho lze dosáhnout odebráním značky <serviceDebug> z konfiguračního souboru aplikace.

WCF – Nezahrnujte do konfiguračního souboru uzel serviceMetadata.

Nadpis Podrobnosti
Komponenta WCF
Fáze SDL Sestavení
Použitelné technologie Obecné
Atributy Obecné, NET Framework 3
Reference MSDN, Fortify Kingdom
Kroky Zveřejnění informací o službě může útočníkům poskytnout cenný přehled o tom, jak by mohli službu zneužít. Značka <serviceMetadata> umožňuje funkci publikování metadat. Metadata služby můžou obsahovat citlivé informace, které by neměly být veřejně přístupné. Minimálně povolte přístup k metadatům jenom důvěryhodným uživatelům a zajistěte, aby se nezpřístupňovaly nepotřebné informace. Ještě lepší je úplně zakázat možnost publikování metadat. Bezpečná konfigurace WCF nebude obsahovat <serviceMetadata> značku .

Ujistěte se, že se ve webovém rozhraní API ASP.NET provádí správné zpracování výjimek.

Nadpis Podrobnosti
Komponenta Webové rozhraní API
Fáze SDL Sestavení
Použitelné technologie MVC 5, MVC 6
Atributy
Reference Zpracování výjimek ve webovém rozhraní API ASP.NET, ověřování modelu ve ASP.NET webovém rozhraní API
Kroky Ve výchozím nastavení se většina nezachycených výjimek ve webovém rozhraní API ASP.NET přeloží do odpovědi HTTP se stavovým kódem. 500, Internal Server Error

Příklad

K řízení stavového kódu vráceného rozhraním API HttpResponseException můžete použít následující příklad:

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

Příklad

Pro další kontrolu nad odpovědí HttpResponseMessage na výjimku je možné použít třídu, jak je znázorněno níže:

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

Chcete-li zachytit neošetřené výjimky, které nejsou typu HttpResponseException, lze použít filtry výjimek. Filtry výjimek implementují System.Web.Http.Filters.IExceptionFilter rozhraní . Nejjednodušší způsob, jak napsat filtr výjimek, je odvození z System.Web.Http.Filters.ExceptionFilterAttribute třídy a přepsání OnException metoda.

Příklad

Tady je filtr, který převádí NotImplementedException výjimky na stavový kód 501, Not ImplementedHTTP:

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

Filtr výjimek webového rozhraní API můžete zaregistrovat několika způsoby:

  • Podle akce
  • Podle kontroleru
  • Globálně

Příklad

Pokud chcete filtr použít na konkrétní akci, přidejte filtr jako atribut akce:

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

Příklad

Pokud chcete filtr použít na všechny akce na objektu controller, přidejte filtr jako atribut do controller třídy :

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

Příklad

Pokud chcete filtr použít globálně na všechny kontrolery webového rozhraní API, přidejte do GlobalConfiguration.Configuration.Filters kolekce instanci filtru. Filtry výjimek v této kolekci platí pro všechny akce kontroleru webového rozhraní API.

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

Příklad

Pro ověření modelu je možné předat stav modelu metodě CreateErrorResponse, jak je znázorněno níže:

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

Projděte si odkazy v části s referenčními informacemi, kde najdete další podrobnosti o výjimečném zpracování a ověřování modelu ve webovém rozhraní API ASP.NET.

Nezpřístupňujte podrobnosti o zabezpečení v chybových zprávách

Nadpis Podrobnosti
Komponenta Webová aplikace
Fáze SDL Sestavení
Použitelné technologie Obecné
Atributy
Reference
Kroky

Obecné chybové zprávy jsou poskytovány přímo uživateli bez zahrnutí citlivých dat aplikace. Mezi příklady citlivých dat patří:

  • Názvy serverů
  • Připojovací řetězce
  • Uživatelských jmen
  • Hesla
  • Postupy SQL
  • Podrobnosti o dynamických selháních SQL
  • Trasování zásobníku a řádky kódu
  • Proměnné uložené v paměti
  • Umístění jednotek a složek
  • Body instalace aplikace
  • Nastavení konfigurace hostitele
  • Další podrobnosti o interní aplikaci

Zachytávání všech chyb v rámci aplikace a poskytování obecných chyb a povolení vlastních chyb ve službě IIS pomůže zabránit zpřístupnění informací. SQL Server databáze a zpracování výjimek rozhraní .NET jsou kromě dalších architektur zpracování chyb obzvláště podrobné a velmi užitečné pro uživatele se zlými úmysly profilující vaši aplikaci. Nezobrazovat přímo obsah třídy odvozené z třídy .NET Exception a ujistěte se, že máte správné zpracování výjimek, aby neočekávaná výjimka nebyla neúmyslně vyvolána přímo uživateli.

  • Poskytnutí obecných chybových zpráv přímo uživateli, které abstrahuje konkrétní podrobnosti nalezené přímo ve zprávě o výjimce nebo chybové zprávě
  • Nezobrazovat obsah třídy výjimek rozhraní .NET přímo uživateli
  • Zachytávání všech chybových zpráv a v případě potřeby informujte uživatele prostřednictvím obecné chybové zprávy odeslané klientovi aplikace.
  • Nezpřístupňujte obsah třídy Exception přímo uživateli, zejména hodnotu vrácenou z .ToString()nebo hodnoty Message nebo StackTrace vlastnosti. Bezpečně zaznamenejte tyto informace a zobrazte uživateli neškodnější zprávu.

ImplementOvat výchozí stránku pro zpracování chyb

Nadpis Podrobnosti
Komponenta Webová aplikace
Fáze SDL Sestavení
Použitelné technologie Obecné
Atributy
Reference Dialogové okno Upravit nastavení chybových stránek ASP.NET
Kroky

Pokud aplikace ASP.NET selže a způsobí vnitřní chybu serveru HTTP/1.x 500 nebo konfigurace funkce (například filtrování požadavků) zabrání zobrazení stránky, vygeneruje se chybová zpráva. Správci můžou zvolit, jestli má aplikace klientovi zobrazovat popisnou zprávu, podrobnou chybovou zprávu klientovi nebo podrobnou chybovou zprávu pouze pro localhost. Značka <customErrors> v web.config má tři režimy:

  • Na: Určuje, že jsou povoleny vlastní chyby. Pokud není zadaný žádný atribut defaultRedirect, zobrazí se uživatelům obecná chyba. Vlastní chyby se zobrazují vzdáleným klientům a místnímu hostiteli.
  • Vypnuto: Určuje, že vlastní chyby jsou zakázány. Podrobné ASP.NET chyby se zobrazují vzdáleným klientům a místnímu hostiteli.
  • Vzdáleně: Určuje, že vlastní chyby se zobrazí pouze vzdáleným klientům a že ASP.NET chyby se zobrazí místnímu hostiteli. Toto je výchozí hodnota.

web.config Otevřete soubor pro aplikaci nebo web a ujistěte se, že je definovaná značka nebo <customErrors mode="RemoteOnly" /><customErrors mode="On" /> .

Nastavení metody nasazení na Maloobchodní ve službě IIS

Nadpis Podrobnosti
Komponenta Webová aplikace
Fáze SDL Nasazení
Použitelné technologie Obecné
Atributy
Reference element deployment (ASP.NET schéma nastavení)
Kroky

Přepínač <deployment retail> je určen pro produkční servery SLUŽBY IIS. Tento přepínač pomáhá aplikacím běžet s nejlepším možným výkonem a nejmenším možným únikem informací o zabezpečení tím, že zakáže schopnost aplikace generovat výstup trasování na stránce, zakáže možnost zobrazovat koncovým uživatelům podrobné chybové zprávy a zakáže přepínač ladění.

Často se během aktivního vývoje povolí přepínače a možnosti zaměřené na vývojáře, jako je například neúspěšné trasování a ladění požadavků. Doporučuje se nastavit metodu nasazení na libovolném produkčním serveru na maloobchodní. otevřete soubor machine.config a ujistěte se, že <deployment retail="true" /> zůstane nastavený na hodnotu true.

Výjimky by měly bezpečně selhat

Nadpis Podrobnosti
Komponenta Webová aplikace
Fáze SDL Sestavení
Použitelné technologie Obecné
Atributy
Reference Bezpečné selhání
Kroky Aplikace by měla bezpečně selhat. Každá metoda, která vrací logickou hodnotu, na základě které je učiněno určité rozhodnutí, by měla mít pečlivě vytvořený blok výjimek. Existuje mnoho logických chyb, kvůli kterým se problémy se zabezpečením vloudí, když je blok výjimek zapsán neopatrně.

Příklad

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

Výše uvedená metoda vždy vrátí hodnotu True, pokud dojde k nějaké výjimce. Pokud koncový uživatel zadá špatnou adresu URL, kterou prohlížeč respektuje, ale Uri() konstruktor ne, vyvolá se tím výjimka a oběť bude přesměrována na platnou, ale poškozenou adresu URL.