Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| Produto/Serviço | Artigo |
|---|---|
| WCF |
|
| API Web | |
| Aplicação Web |
WCF - Não incluir o nó serviceDebug no ficheiro de configuração
| Título | Detalhes |
|---|---|
| Componente | WCF |
| Fase SDL | Construir |
| Tecnologias aplicáveis | Genérico, NET Framework 3 |
| Atributos | N/A |
| Referências | |
| Passos | Os serviços do Windows Communication Framework (WCF) podem ser configurados para expor informações de depuração. A informação de depuração não deve ser usada em ambientes de produção. A <serviceDebug> etiqueta define se a funcionalidade de informação de depuração está ativada para um serviço WCF. Se o atributo includeExceptionDetailInFaults estiver definido como true, a informação de exceção da aplicação será devolvida aos clientes. Os atacantes podem aproveitar a informação adicional obtida com a depuração para realizar ataques direcionados ao framework, base de dados ou outros recursos utilizados pela aplicação. |
Exemplo
O ficheiro de configuração seguinte inclui a <serviceDebug> etiqueta:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name=""MyServiceBehavior"">
<serviceDebug includeExceptionDetailInFaults=""True"" httpHelpPageEnabled=""True""/>
...
Desativar a depuração de informações no serviço. Isto pode ser conseguido removendo a <serviceDebug> tag do ficheiro de configuração da sua aplicação.
WCF - Não inclua o nó serviceMetadata no ficheiro de configuração
| Título | Detalhes |
|---|---|
| Componente | WCF |
| Fase SDL | Construir |
| Tecnologias aplicáveis | Genérico |
| Atributos | Genérico, NET Framework 3 |
| Referências | MSDN, Fortify Kingdom |
| Passos | Expor publicamente informações sobre um serviço pode fornecer aos atacantes informações valiosas sobre como podem explorar o serviço. A <serviceMetadata> etiqueta permite a funcionalidade de publicação de metadados. Os metadados do serviço podem conter informações sensíveis que não deveriam ser acessíveis publicamente. No mínimo, permitir apenas que utilizadores de confiança acedam aos metadados e garantir que informações desnecessárias não sejam expostas. Melhor ainda, desative completamente a capacidade de publicar metadados. Uma configuração WCF segura não conterá a <serviceMetadata> etiqueta. |
Garantir que o tratamento adequado das exceções é feito na ASP.NET Web API
| Título | Detalhes |
|---|---|
| Componente | API Web |
| Fase SDL | Construir |
| Tecnologias aplicáveis | MVC 5, MVC 6 |
| Atributos | N/A |
| Referências | Tratamento de exceções em ASP.NET Web API, Validação de Modelos em ASP.NET Web API |
| Passos | Por padrão, a maioria das exceções não capturadas em ASP.NET Web API são convertidas numa resposta HTTP com código de estado 500, Internal Server Error |
Exemplo
Para controlar o código de estado devolvido pela API, HttpResponseException pode ser usado como mostrado abaixo:
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return item;
}
Exemplo
Para um controlo adicional sobre a resposta de exceção, a HttpResponseMessage classe pode ser usada conforme mostrado abaixo:
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;
}
Para detetar exceções não tratadas que não são do tipo HttpResponseException, podem ser usados Filtros de Exceção. Filtros de exceção implementam a System.Web.Http.Filters.IExceptionFilter interface. A forma mais simples de escrever um filtro de exceção é derivar da System.Web.Http.Filters.ExceptionFilterAttribute classe e sobrescrever o método OnException.
Exemplo
Aqui está um filtro que converte NotImplementedException exceções em código 501, Not Implementedde estado 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);
}
}
}
}
Existem várias formas de registar um filtro de exceções da Web API:
- Por meio de uma ação
- Por controlador
- A nível global
Exemplo
Para aplicar o filtro a uma ação específica, adicione o filtro como um atributo à ação:
public class ProductsController : ApiController
{
[NotImplExceptionFilter]
public Contact GetContact(int id)
{
throw new NotImplementedException("This method is not implemented");
}
}
Exemplo
Para aplicar o filtro a todas as ações sobre um controller, adicione o filtro como um atributo à controller classe:
[NotImplExceptionFilter]
public class ProductsController : ApiController
{
// ...
}
Exemplo
Para aplicar o filtro globalmente a todos os controladores Web API, adicione uma instância do filtro à GlobalConfiguration.Configuration.Filters coleção. Filtros de exceção nesta coleção aplicam-se a qualquer ação do controlador da Web API.
GlobalConfiguration.Configuration.Filters.Add(
new ProductStore.NotImplExceptionFilterAttribute());
Exemplo
Para validação do modelo, o estado do modelo pode ser passado para o método CreateErrorResponse, conforme mostrado abaixo:
public HttpResponseMessage PostProduct(Product item)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
// Implementation not shown...
}
Consulte os links na secção de referências para mais detalhes sobre manuseamento excecional e validação de modelos na ASP.NET Web API
Não exponha detalhes de segurança em mensagens de erro
| Título | Detalhes |
|---|---|
| Componente | Aplicação Web |
| Fase SDL | Construir |
| Tecnologias aplicáveis | Genérico |
| Atributos | N/A |
| Referências | N/A |
| Passos | Mensagens de erro genéricas são fornecidas diretamente ao utilizador sem incluir dados sensíveis da aplicação. Exemplos de dados sensíveis incluem:
Capturar todos os erros dentro de uma aplicação e fornecer mensagens de erro genéricas, bem como ativar erros personalizados no IIS, ajudará a prevenir a divulgação de informação. O tratamento de exceções nas bases de dados SQL Server e em .NET, entre outras arquiteturas de tratamento de erros, são especialmente verbosas e extremamente úteis para um utilizador malicioso que analise a sua aplicação. Não mostre diretamente o conteúdo de uma classe derivada da classe de exceção .NET e certifique-se de que tem um tratamento adequado das exceções para que uma exceção inesperada não seja inadvertidamente elevada diretamente ao utilizador.
|
Implementar a página de tratamento de erros padrão
| Título | Detalhes |
|---|---|
| Componente | Aplicação Web |
| Fase SDL | Construir |
| Tecnologias aplicáveis | Genérico |
| Atributos | N/A |
| Referências | Editar Caixa de Diálogo de Configurações de Páginas de Erro do ASP.NET |
| Passos | Quando uma aplicação ASP.NET falha e causa um Erro de Servidor Interno HTTP/1.x 500, ou uma configuração de funcionalidades (como Filter de Pedidos) impede que uma página seja exibida, será gerada uma mensagem de erro. Os administradores podem escolher se a aplicação deve mostrar uma mensagem amiga ao cliente, uma mensagem de erro detalhada ao cliente ou uma mensagem de erro detalhada apenas ao localhost. A
Abra o ficheiro |
Defina o método de distribuição para Retalho no IIS
| Título | Detalhes |
|---|---|
| Componente | Aplicação Web |
| Fase SDL | Implementação |
| Tecnologias aplicáveis | Genérico |
| Atributos | N/A |
| Referências | Elemento implementação (Esquema de Definições ASP.NET) |
| Passos | O Muitas vezes, switches e opções focados no programador, como rastreamento de pedidos falhados e depuração, são ativados durante o desenvolvimento ativo. Recomenda-se que o método de implementação em qualquer servidor de produção seja definido como retalho. Abra o ficheiro machine.config e certifique-se de que permanece |
As exceções devem falhar de forma segura
| Título | Detalhes |
|---|---|
| Componente | Aplicação Web |
| Fase SDL | Construir |
| Tecnologias aplicáveis | Genérico |
| Atributos | N/A |
| Referências | Falhe de forma segura |
| Passos | A aplicação deve falhar em segurança. Qualquer método que devolva um valor booleano, com base no qual determinada decisão é tomada, deve ter um bloco de exceção cuidadosamente criado. Existem muitos erros lógicos devido a problemas de segurança que surgem quando o bloco de exceção é escrito de forma descuidada. |
Exemplo
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;
}
}
O método acima devolverá sempre Verdadeiro, caso ocorra alguma exceção. Se o utilizador final fornecer um URL mal formado, que o navegador respeita, mas o Uri() construtor não, isto lançará uma exceção, e a vítima será levada para o URL válido mas malformado.