Sdílet prostřednictvím


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

Produkt/služba Článek
WCF
Webové rozhraní API
  • Nebezpečte, že se v ASP.NET Web API
Webová aplikace

WCF – Nezahrnujte uzel ServiceDebug do konfiguračního souboru

Titul Podrobnosti
Součást WCF
Fáze SDL Build
Použitelné technologie Generický, NET Framework 3
Atributy N/A
Odkazy MSDN, Fortify Kingdom
Kroky služby Windows Communication Framework (WCF) je možné nakonfigurovat tak, aby zpřístupnily 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, jestli je pro službu WCF povolená funkce informací o ladění. Pokud je atribut includeExceptionDetailInFaults nastaven na hodnotu true, informace o výjimce z aplikace budou vráceny klientům. Útočníci můžou využít další informace, které získají z ladění výstupu, a připojit útoky cílené 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 vaší aplikace.

WCF – Nezahrnujte uzel ServiceMetadata do konfiguračního souboru

Titul Podrobnosti
Součást WCF
Fáze SDL Build
Použitelné technologie Obecná
Atributy Generický, NET Framework 3
Odkazy MSDN, Fortify Kingdom
Kroky Veřejné zveřejnění informací o službě může útočníkům poskytnout cenný přehled o tom, jak může službu zneužít. Značka <serviceMetadata> povolí 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 důvěryhodným uživatelům přístup k metadatům a zajistěte, aby se nepotřebné informace nebyly odhaleny. Ještě lepší, zcela zakažte možnost publikovat metadata. Bezpečná konfigurace WCF nebude obsahovat <serviceMetadata> značku.

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

Titul Podrobnosti
Součást Webové rozhraní API
Fáze SDL Build
Použitelné technologie MVC 5, MVC 6
Atributy N/A
Odkazy Zpracování výjimek v ASP.NET Web APIModel Validation in ASP.NET Web API
Kroky Ve výchozím nastavení se většina nezachycených výjimek v ASP.NET Web API přeloží do odpovědi HTTP se stavovým kódem 500, Internal Server Error

Příklad

Pokud chcete řídit stavový kód vrácený rozhraním API, HttpResponseException můžete ho použít, jak je znázorněno níže:

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 lze třídu použít, 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ýjimky, je odvodit z třídy System.Web.Http.Filters.ExceptionFilterAttribute a přepsat metodu OnException.

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

Existuje několik způsobů, jak zaregistrovat filtr výjimek webového rozhraní API:

  • Podle činnosti
  • 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

Chcete-li použít filtr na všechny akce na objektu controller, přidejte filtr jako atribut třídy controller :

[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 se vztahují na všechny akce kontroleru webového rozhraní API.

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

Příklad

Pro ověření modelu lze stav modelu předat 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...
}

Další podrobnosti o výjimečném zpracování a ověřování modelů v ASP.NET Web API najdete v odkazech v části reference.

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

Titul Podrobnosti
Součást Webová aplikace
Fáze SDL Build
Použitelné technologie Obecná
Atributy N/A
Odkazy N/A
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á jména
  • Passwords
  • Procedury SQL
  • Podrobnosti o dynamických selháních SQL
  • Výpis zásobníku a řádky zdrojového 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

Zachycení všech chyb v aplikaci a poskytnutí obecných chybových zpráv, stejně jako povolení vlastních chybových nastavení v IIS, pomůže zabránit zpřístupnění informací. Databáze SQL Serveru a zpracování výjimek v .NET, mezi dalšími architekturami zpracování chyb, jsou obzvláště podrobné a velmi užitečné pro škodlivého uživatele profilujícího 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.

  • Zadejte obecné chybové zprávy přímo uživateli, který abstrahuje konkrétní podrobnosti nalezené přímo v výjimce nebo chybové zprávě.
  • Nezobrazovat obsah třídy výjimek .NET přímo uživateli
  • Vychytejte všechny chybové zprávy 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 Výjimky přímo uživateli, zejména návratovou hodnotu z .ToString(), nebo hodnoty vlastnosti Message nebo StackTrace. Bezpečně zaznamte tyto informace a zobrazte uživateli více neškodnou zprávu.

Implementace výchozí stránky zpracování chyb

Titul Podrobnosti
Součást Webová aplikace
Fáze SDL Build
Použitelné technologie Obecná
Atributy N/A
Odkazy Upravit dialogové okno Nastavení chybových stránek ASP.NET
Kroky

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

  • Na: Určuje, že jsou povoleny vlastní chyby. Pokud není zadán žádný výchozí atributRedirect, 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 deaktivovány. Podrobné ASP.NET chyby se zobrazují vzdáleným klientům a místnímu hostiteli.
  • RemoteOnly: Určuje, že se vlastní chyby zobrazují jenom vzdáleným klientům a že ASP.NET chyby se zobrazují místnímu hostiteli. Toto je výchozí hodnota

web.config Otevřete soubor pro aplikaci nebo stránky a ujistěte se, že je ve značce definováno buď <customErrors mode="RemoteOnly" /> nebo <customErrors mode="On" />.

Nastavte metodu nasazení na Retail ve službě IIS

Titul Podrobnosti
Součást Webová aplikace
Fáze SDL Nasazení
Použitelné technologie Obecná
Atributy N/A
Odkazy element deployment (schéma nastavení ASP.NET)
Kroky

Přepínač <deployment retail> je určený pro použití produkčními servery IIS. Tento přepínač slouží k tomu, aby aplikace fungovaly s optimálním výkonem a minimálními bezpečnostními úniky informací zakázáním generování trasovacího výstupu na stránce aplikací, zakázáním možnosti zobrazovat podrobné chybové zprávy koncovým uživatelům a zakázáním ladicího režimu.

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

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

Titul Podrobnosti
Součást Webová aplikace
Fáze SDL Build
Použitelné technologie Obecná
Atributy N/A
Odkazy Bezpečně selhat
Kroky Aplikace by měla bezpečně selhat. Každá metoda, která vrací logickou hodnotu, na základě které se provádí určité rozhodnutí, by měla mít pečlivě vytvořený blok výjimky. Mnoho logických chyb způsobuje bezpečnostní problémy, když je blok výjimky psán nedbale.

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í true, pokud dojde k nějaké výjimce. Pokud koncový uživatel poskytne špatně formátovanou adresu URL, kterou prohlížeč respektuje, ale konstruktor nikoliv, dojde k vyvolání výjimky a oběť bude přesměrována na platnou, avšak nesprávně formátovanou adresu URL.