Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Produkt/usługa | Artykuł |
|---|---|
| WCF | |
| Internetowy interfejs API | |
| Aplikacja internetowa |
WCF — nie dołączaj węzła serviceDebug w pliku konfiguracji
| Tytuł | Szczegóły |
|---|---|
| Składnik | WCF |
| Faza SDL | Build |
| Zastosowalne technologie | Ogólne, NET Framework 3 |
| atrybutów | N/A |
| Dokumentacja | MSDN, Fortify Kingdom |
| Kroki | usługi Windows Communication Framework (WCF) można skonfigurować w celu uwidocznienia informacji debugowania. Informacje debugowania nie powinny być używane w środowiskach produkcyjnych. Tag <serviceDebug> określa, czy funkcja informacji debugowania jest włączona dla usługi WCF. Jeśli atrybut includeExceptionDetailInFaults ma wartość true, informacje o wyjątku z aplikacji zostaną zwrócone klientom. Osoby atakujące mogą wykorzystać dodatkowe informacje uzyskane z danych wyjściowych debugowania w celu zainstalowania ataków ukierunkowanych na platformę, bazę danych lub inne zasoby używane przez aplikację. |
Przykład
Następujący plik konfiguracji zawiera <serviceDebug> tag:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name=""MyServiceBehavior"">
<serviceDebug includeExceptionDetailInFaults=""True"" httpHelpPageEnabled=""True""/>
...
Wyłącz informacje debugowania w usłudze. Można to zrobić, usuwając <serviceDebug> tag z pliku konfiguracji aplikacji.
WCF — nie dołączaj węzła serviceMetadata do pliku konfiguracji
| Tytuł | Szczegóły |
|---|---|
| Składnik | WCF |
| Faza SDL | Build |
| Zastosowalne technologie | Generyczny |
| atrybutów | Ogólne, NET Framework 3 |
| Dokumentacja | MSDN, Fortify Kingdom |
| Kroki | Publiczne ujawnianie informacji o usłudze może zapewnić osobom atakującym cenny wgląd w sposób, w jaki mogą wykorzystać tę usługę. Tag <serviceMetadata> włącza funkcję publikowania metadanych. Metadane usługi mogą zawierać poufne informacje, które nie powinny być publicznie dostępne. Co najmniej zezwalaj zaufanym użytkownikom na dostęp do metadanych i upewnij się, że niepotrzebne informacje nie są uwidocznione. Jeszcze lepiej, całkowicie wyłącz możliwość publikowania metadanych. Bezpieczna konfiguracja programu WCF nie będzie zawierać tagu <serviceMetadata> . |
Upewnij się, że w ASP.NET Web API jest wykonywana właściwa obsługa wyjątków
| Tytuł | Szczegóły |
|---|---|
| Składnik | Internetowy interfejs API |
| Faza SDL | Build |
| Zastosowalne technologie | MVC 5, MVC 6 |
| atrybutów | N/A |
| Dokumentacja | Obsługa wyjątków w ASP.NET Web API, walidacja modelu w ASP.NET Web API |
| Kroki | Domyślnie większość nieuchwyconych wyjątków w ASP.NET Web API jest tłumaczona na odpowiedź HTTP z kodem stanu 500, Internal Server Error |
Przykład
Aby kontrolować kod stanu zwrócony przez interfejs API, można użyć HttpResponseException, jak pokazano poniżej:
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return item;
}
Przykład
Aby uzyskać dalszą kontrolę nad odpowiedzią wyjątku, można użyć klasy, HttpResponseMessage jak pokazano poniżej:
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;
}
Aby przechwycić nieobsługiwane wyjątki, które nie są typu HttpResponseException, można użyć filtrów wyjątków. Filtry wyjątków implementują System.Web.Http.Filters.IExceptionFilter interfejs. Najprostszym sposobem na napisanie filtru wyjątku jest wyprowadzenie z System.Web.Http.Filters.ExceptionFilterAttribute klasy i zastąpienie metody OnException.
Przykład
Oto filtr, który konwertuje NotImplementedException wyjątki na kod 501, Not Implementedstanu 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);
}
}
}
}
Istnieje kilka sposobów rejestrowania filtru wyjątków webowego interfejsu API:
- Sortowane według akcji
- Przez kontroler
- Globalnie
Przykład
Aby zastosować filtr do określonej akcji, dodaj filtr jako atrybut do akcji:
public class ProductsController : ApiController
{
[NotImplExceptionFilter]
public Contact GetContact(int id)
{
throw new NotImplementedException("This method is not implemented");
}
}
Przykład
Aby zastosować filtr do wszystkich akcji w obiekcie controller, dodaj filtr jako atrybut do controller klasy:
[NotImplExceptionFilter]
public class ProductsController : ApiController
{
// ...
}
Przykład
Aby zastosować filtr globalnie do wszystkich kontrolerów interfejsu Web API, dodaj instancję filtru do kolekcji GlobalConfiguration.Configuration.Filters. Filtry wyjątków w tej kolekcji mają zastosowanie do dowolnej akcji kontrolera internetowego interfejsu API.
GlobalConfiguration.Configuration.Filters.Add(
new ProductStore.NotImplExceptionFilterAttribute());
Przykład
W przypadku walidacji modelu można przekazać stan modelu do metody CreateErrorResponse, jak pokazano poniżej:
public HttpResponseMessage PostProduct(Product item)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
// Implementation not shown...
}
Zapoznaj się z linkami w sekcji dokumentacji, aby uzyskać dodatkowe informacje na temat wyjątkowej obsługi i weryfikacji modelu w ASP.NET Web API
Nie ujawniaj szczegółów zabezpieczeń w komunikatach o błędach
| Tytuł | Szczegóły |
|---|---|
| Składnik | Aplikacja internetowa |
| Faza SDL | Build |
| Zastosowalne technologie | Generyczny |
| atrybutów | N/A |
| Dokumentacja | N/A |
| Kroki | Ogólne komunikaty o błędach są udostępniane bezpośrednio użytkownikowi bez uwzględniania poufnych danych aplikacji. Przykłady poufnych danych to:
Przechwytywanie wszystkich błędów w aplikacji i wyświetlanie ogólnych komunikatów o błędach, a także włączanie błędów niestandardowych w IIS pomoże zapobiec ujawnieniu informacji. SQL Server jako baza danych oraz obsługa wyjątków .NET, jak i inne architektury obsługi błędów, są szczególnie szczegółowe i bardzo przydatne dla złośliwego użytkownika, który profiluje aplikację. Nie wyświetlaj bezpośrednio zawartości klasy pochodzącej z klasy .NET Exception i upewnij się, że masz odpowiednią obsługę wyjątków, aby nieoczekiwany wyjątek nie był przypadkowo zgłaszany bezpośrednio użytkownikowi.
|
Implementowanie domyślnej strony obsługi błędów
| Tytuł | Szczegóły |
|---|---|
| Składnik | Aplikacja internetowa |
| Faza SDL | Build |
| Zastosowalne technologie | Generyczny |
| atrybutów | N/A |
| Dokumentacja | Edytuj ustawienia okna dialogowego stron błędów ASP.NET |
| Kroki | W przypadku, gdy aplikacja ASP.NET kończy się niepowodzeniem i wywołuje błąd HTTP/1.x 500 Wewnętrzny błąd serwera, lub gdy konfiguracja funkcji (na przykład filtrowanie żądań) uniemożliwia wyświetlenie strony, zostanie wygenerowany komunikat o błędzie. Administratorzy mogą wybrać, czy aplikacja powinna wyświetlać przyjazny komunikat dla klienta, szczegółowy komunikat o błędzie do klienta, czy szczegółowy komunikat o błędzie tylko do hosta lokalnego. Tag
Otwórz plik |
Ustaw metodę wdrażania na Retail w usługach IIS
| Tytuł | Szczegóły |
|---|---|
| Składnik | Aplikacja internetowa |
| Faza SDL | Wdrożenie |
| Zastosowalne technologie | Generyczny |
| atrybutów | N/A |
| Dokumentacja | element deployment (schemat ustawień ASP.NET) |
| Kroki | Przełącznik Często przełączniki i ustawienia skoncentrowane na deweloperach, takie jak śledzenie nieudanych żądań i debugowanie, są włączane podczas aktywnego rozwoju. Zaleca się, aby metoda wdrażania na dowolnym serwerze produkcyjnym była ustawiona na sprzedaż detaliczną. otwórz plik machine.config i upewnij się, że |
Wyjątki powinny bezpiecznie zakończyć się niepowodzeniem
| Tytuł | Szczegóły |
|---|---|
| Składnik | Aplikacja internetowa |
| Faza SDL | Build |
| Zastosowalne technologie | Generyczny |
| atrybutów | N/A |
| Dokumentacja | Bezpieczne niepowodzenie |
| Kroki | Aplikacja powinna bezpiecznie zakończyć się niepowodzeniem. Każda metoda zwracająca wartość logiczną, na podstawie której podjęto pewną decyzję, powinna mieć starannie utworzony blok wyjątków. Gdy blok wyjątków jest pisany nieostrożnie, pojawia się wiele błędów logicznych, które mogą prowadzić do problemów z zabezpieczeniami. |
Przykład
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;
}
}
Powyższa metoda zawsze zwróci wartość True, jeśli wystąpi jakiś wyjątek. Jeśli użytkownik końcowy poda źle sformułowany adres URL, który przeglądarka akceptuje, ale Uri() konstruktor nie, zostanie zgłoszony wyjątek, a ofiara zostanie przeniesiona do prawidłowego, lecz źle sformułowanego adresu URL.