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 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);
}
}
}
}
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ří:
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.
|
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
|
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č Č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 |
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.