Beveiligingsframe: uitzonderingsbeheer | Oplossingen
Product/service | Artikel |
---|---|
WCF | |
Web-API | |
Webtoepassing |
WCF- ServiceDebug-knooppunt niet opnemen in configuratiebestand
Titel | Details |
---|---|
Onderdeel | WCF |
SDL-fase | Build |
Toepasselijke technologieën | Algemeen, NET Framework 3 |
Kenmerken | N.v.t. |
Referenties | MSDN, Fortify Kingdom |
Stappen | WCF-services (Windows Communication Framework) kunnen worden geconfigureerd om foutopsporingsgegevens beschikbaar te maken. Foutopsporingsinformatie mag niet worden gebruikt in productieomgevingen. De <serviceDebug> tag definieert of de functie voor foutopsporingsinformatie is ingeschakeld voor een WCF-service. Als het kenmerk includeExceptionDetailInFaults is ingesteld op true, worden uitzonderingsgegevens van de toepassing geretourneerd naar clients. Aanvallers kunnen gebruikmaken van de aanvullende informatie die ze krijgen van foutopsporingsuitvoer om aanvallen te implementeren die zijn gericht op het framework, de database of andere resources die door de toepassing worden gebruikt. |
Voorbeeld
Het volgende configuratiebestand bevat de <serviceDebug>
tag:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name=""MyServiceBehavior"">
<serviceDebug includeExceptionDetailInFaults=""True"" httpHelpPageEnabled=""True""/>
...
Schakel foutopsporingsgegevens in de service uit. Dit kan worden bereikt door de tag te verwijderen uit het <serviceDebug>
configuratiebestand van uw toepassing.
WCF- Neem het serviceMetadata-knooppunt niet op in het configuratiebestand
Titel | Details |
---|---|
Onderdeel | WCF |
SDL-fase | Build |
Toepasselijke technologieën | Algemeen |
Kenmerken | Algemeen, NET Framework 3 |
Referenties | MSDN, Fortify Kingdom |
Stappen | Het openbaar maken van informatie over een service kan aanvallers waardevolle inzichten geven in hoe ze de service kunnen misbruiken. Met <serviceMetadata> de tag wordt de functie voor het publiceren van metagegevens ingeschakeld. Servicemetagegevens kunnen gevoelige informatie bevatten die niet openbaar toegankelijk mag zijn. Geef ten minste alleen vertrouwde gebruikers toegang tot de metagegevens en zorg ervoor dat onnodige informatie niet wordt weergegeven. Nog beter, schakel de mogelijkheid om metagegevens te publiceren volledig uit. Een veilige WCF-configuratie bevat de <serviceMetadata> tag niet. |
Zorg ervoor dat de juiste uitzonderingsafhandeling wordt uitgevoerd in ASP.NET web-API
Titel | Details |
---|---|
Onderdeel | Web-API |
SDL-fase | Build |
Toepasselijke technologieën | MVC 5, MVC 6 |
Kenmerken | N.v.t. |
Referenties | Uitzonderingsafhandeling in ASP.NET web-API, modelvalidatie in ASP.NET web-API |
Stappen | Standaard worden de meeste onondertekende uitzonderingen in ASP.NET web-API omgezet in een HTTP-antwoord met statuscode 500, Internal Server Error |
Voorbeeld
Voor het beheren van de statuscode die door de API wordt geretourneerd, HttpResponseException
kan worden gebruikt zoals hieronder wordt weergegeven:
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return item;
}
Voorbeeld
Voor meer controle over het uitzonderingsantwoord kan de HttpResponseMessage
klasse worden gebruikt zoals hieronder wordt weergegeven:
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;
}
Als u niet-verwerkte uitzonderingen wilt ondervangen die niet van het type HttpResponseException
zijn, kunnen uitzonderingsfilters worden gebruikt. Uitzonderingsfilters implementeren de System.Web.Http.Filters.IExceptionFilter
interface. De eenvoudigste manier om een uitzonderingsfilter te schrijven, is door af te leiden van de System.Web.Http.Filters.ExceptionFilterAttribute
klasse en de methode OnException te overschrijven.
Voorbeeld
Hier volgt een filter waarmee uitzonderingen worden geconverteerd NotImplementedException
naar HTTP-statuscode 501, Not Implemented
:
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);
}
}
}
}
Er zijn verschillende manieren om een web-API-uitzonderingsfilter te registreren:
- Op actie
- Per controller
- Wereldwijd
Voorbeeld
Als u het filter wilt toepassen op een specifieke actie, voegt u het filter als kenmerk toe aan de actie:
public class ProductsController : ApiController
{
[NotImplExceptionFilter]
public Contact GetContact(int id)
{
throw new NotImplementedException("This method is not implemented");
}
}
Voorbeeld
Als u het filter wilt toepassen op alle acties op een controller
, voegt u het filter als kenmerk toe aan de controller
klasse:
[NotImplExceptionFilter]
public class ProductsController : ApiController
{
// ...
}
Voorbeeld
Als u het filter globaal wilt toepassen op alle web-API-controllers, voegt u een exemplaar van het filter toe aan de GlobalConfiguration.Configuration.Filters
verzameling. Uitzonderingsfilters in deze verzameling zijn van toepassing op elke web-API-controlleractie.
GlobalConfiguration.Configuration.Filters.Add(
new ProductStore.NotImplExceptionFilterAttribute());
Voorbeeld
Voor modelvalidatie kan de modelstatus worden doorgegeven aan de methode CreateErrorResponse, zoals hieronder wordt weergegeven:
public HttpResponseMessage PostProduct(Product item)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
// Implementation not shown...
}
Raadpleeg de koppelingen in de sectie verwijzingen voor meer informatie over uitzonderlijke verwerking en modelvalidatie in ASP.NET Web API
Beveiligingsdetails niet weergeven in foutberichten
Titel | Details |
---|---|
Onderdeel | Webtoepassing |
SDL-fase | Build |
Toepasselijke technologieën | Algemeen |
Kenmerken | N.v.t. |
Referenties | N.v.t. |
Stappen | Algemene foutberichten worden rechtstreeks aan de gebruiker verstrekt zonder gevoelige toepassingsgegevens op te geven. Voorbeelden van gevoelige gegevens zijn:
Door alle fouten in een toepassing op te vangen en algemene foutberichten op te geven, en aangepaste fouten in IIS in te schakelen, wordt het vrijgeven van informatie voorkomen. SQL Server database- en .NET-uitzonderingsafhandeling, naast andere architecturen voor foutafhandeling, zijn vooral uitgebreid en uiterst nuttig voor kwaadwillende gebruikers die uw toepassing profileren. Geef de inhoud van een klasse die is afgeleid van de .NET-uitzonderingsklasse niet rechtstreeks weer en zorg ervoor dat u de juiste uitzonderingsafhandeling hebt, zodat een onverwachte uitzondering niet per ongeluk rechtstreeks aan de gebruiker wordt gemeld.
|
Pagina Standaard foutafhandeling implementeren
Titel | Details |
---|---|
Onderdeel | Webtoepassing |
SDL-fase | Build |
Toepasselijke technologieën | Algemeen |
Kenmerken | N.v.t. |
Referenties | Het dialoogvenster Instellingen voor ASP.NET-foutpagina's bewerken |
Stappen | Wanneer een ASP.NET toepassing mislukt en een http/1.x 500 interne serverfout veroorzaakt, of wanneer een functieconfiguratie (zoals Aanvraagfiltering) verhindert dat een pagina wordt weergegeven, wordt er een foutbericht gegenereerd. Beheerders kunnen kiezen of de toepassing een beschrijvend bericht voor de client, een gedetailleerd foutbericht aan de client of een gedetailleerd foutbericht alleen voor localhost moet weergeven. De
Open het |
Implementatiemethode instellen op Detailhandel in IIS
Titel | Details |
---|---|
Onderdeel | Webtoepassing |
SDL-fase | Implementatie |
Toepasselijke technologieën | Algemeen |
Kenmerken | N.v.t. |
Referenties | implementatie-element (ASP.NET-instellingenschema) |
Stappen | De Schakelopties en opties die op ontwikkelaars zijn gericht, zoals tracering van mislukte aanvragen en foutopsporing, worden vaak ingeschakeld tijdens actieve ontwikkeling. Het wordt aanbevolen om de implementatiemethode op een productieserver in te stellen op detailhandel. open het bestand machine.config en zorg ervoor dat deze |
Uitzonderingen moeten veilig mislukken
Titel | Details |
---|---|
Onderdeel | Webtoepassing |
SDL-fase | Build |
Toepasselijke technologieën | Algemeen |
Kenmerken | N.v.t. |
Referenties | Veilig mislukken |
Stappen | De toepassing moet veilig mislukken. Elke methode die een Booleaanse waarde retourneert, op basis waarvan een bepaalde beslissing wordt genomen, moet zorgvuldig een uitzonderingsblok hebben gemaakt. Er zijn veel logische fouten waardoor beveiligingsproblemen zich voordoen wanneer het uitzonderingsblok onzorgvuldig wordt geschreven. |
Voorbeeld
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;
}
}
De bovenstaande methode retourneert altijd Waar als er een uitzondering optreedt. Als de eindgebruiker een onjuiste URL opgeeft, die de browser respecteert, maar de Uri()
constructor niet, treedt er een uitzondering op en wordt het slachtoffer naar de geldige, maar onjuiste URL gebracht.