ASP.NET Core - 10 práticas para segurança em aplicações MVC - II


Hoje vou apresentar 10 dicas úteis que podemos usar para tornar mais seguras as aplicações ASP .NET Core MVC.

Continuando a primeira parte do artigo veremos mais 5 dicas para melhorar a segurança da sua aplicação web.

6- Aplicar SSL (Secure Sockets Layer) e HSTS

O que é SSL?

A sigla SSL significa Secure Sockets Layer e estabelece uma conexão segura ou criptografada entre o cliente e o servidor. Com SSL, as requisições passadas entre o navegador do cliente e o servidor, e as respostas do servidor para o navegador do cliente, serão criptografadas para manter a integridade dos dados.

Portanto devemos usar HTTPS (HyperText Transfer Protocol Secure) para proteger seu aplicativo ASP.NET Core.

Na ASP.NET Core , podemos criar facilmente um aplicativo configurado por HTTPS.  

Uma opção para configurar o HTTPS está disponível ao selecionar o modelo de aplicativo web no Visual Studio bastando marcar a opção :  Configure for HTTPS

O que é HSTS (HTTP Strict Transport Security)?

HSTS é uma política de segurança da web que protege seu aplicativo da web contra ataques de protocolo de downgrade e sequestro de cookies. Ele força o servidor da web a se comunicar por meio de uma conexão HTTPS e sempre rejeita conexões HTTP inseguras.

O template ASP.NET Core, por padrão, adiciona o middleware HSTS. Ele não é recomendado para uso no ambiente de desenvolvimento, pois o navegador armazena em cache o cabeçalho HSTS.

Podemos substituir algumas opções ao configurar o HSTS.

Exemplo:

 services.AddHsts(options =>
 {
       options.IncludeSubDomains = true;
       options.Preload = true;
       options.MaxAge = TimeSpan.FromHours(100);
       options.ExcludedHosts.Add("testedomain.com");
 });;

7- Ataque XXE (XML External Entity)

Se seu aplicativo usa lógica para analisar um arquivo XML carregado por um usuário final, você corre o risco de um ataque XXE (XML External Entity).

Nesse tipo de ataque, um parse XML com configuração fraca processa uma entrada XML que contém código XML malicioso ou uma referência a uma entidade externa. Esse tipo de ataque pode causar um ataque de negação de serviço ao injetar entidades dentro de entidades, o que torna a utilização do servidor muito alta, resultando no desligamento do servidor. Esse tipo de ataque também é conhecido como “ataque de um bilhão de risadas”.

Para prevenir este ataque podemos adotar as seguintes práticas:

- Se usarmos XmlTextReader para analisar arquivos XML, devemos definir a propriedade DtdProcessing como Prohibit ou Ignore.
- Se for definido como Prohibit, uma exceção será lançada se um DTD (Definição de Tipo de Documento) for identificado.
- Se for definido como Ignore, qualquer especificação de DTD no documento será ignorada e o processamento do documento continuará.
- Se definirmos como Parse, ele analisará todas as especificações DTD no documento. DtdProcessing é definido como Parse por padrão sendo potencialmente vulnerável.

8- Autenticação imprópria e gerenciamento de sessão

A maioria das aplicações web tem um módulo de autenticação e devemos ter cuidado ao escrever o código para ele. Podemos cometer erros, como não remover os cookies de autenticação após um logout bem-sucedido. Esse tipo de erro permite que os invasores roubem as credenciais do usuário, como cookies e valores de sessão, e pode fazer com que os invasores consigam acessar o aplicativo e causar grandes impactos negativos.

Os seguintes erros podem ajudar os invasores a roubar dados:

Para evitar esses erros faça o seguinte :

A seguir um exemplo de código para remover valores da sessão e os cookies de autenticação (.AspNetCore.Session) após o logout do usuário :

//Remove a session
HttpContext.Session.Clear();

//Remove os cookies

CookieOptions option = new CookieOptions();
if(Request.Cookies[".AspNetCore.Session"] != null)
{
  option.Expires = System.DateTime.Now.AddDays(-1);
  Response.Cookies.Append("MyApplication.Session", "", option);
}

Para definir HttpOnly nos cookies use o seguinte código:

CookieOptions option = new CookieOptions {Expires = DateTime.Now.AddHours(24), HttpOnly = true};

O sinalizador HttpOnly é usado para definir qualquer cookie e não pode ser acessado a partir de scripts do lado do cliente.

Para configurar HttpOnly globalmente, configure o método UseCookiePolicy em Startup.cs conforme o código a seguir:

 app.UseCookiePolicy(new CookiePolicyOptions
 {
   HttpOnly = HttpOnlyPolicy.Always,
   Secure = CookieSecurePolicy.Always,
   MinimumSameSitePolicy = SameSiteMode.None
 });

9- Exposição de dados confidenciais e trilha de auditoria

Sempre gerenciamos os dados pessoais importantes de um usuário em aplicativos da web, e , existem muitos lugares em uma aplicação onde podemos expor e armazenar dados confidenciais como se fossem informações comuns, ou proteger adequadamente algumas, mas não todas as informações confidenciais sem perceber. Se os invasores puderem acessar dados confidenciais que ignoramos, eles os usarão de maneira indevida.

Podemos adotar os seguintes procedimentos para evitar isso:

Trilha de auditoria

É uma prática recomendada manter o monitoramento dos registros de atividade de sua aplicação web em produção em intervalos regulares. Podemos configurar os logs a serem coletados usando logs do IIS ou podemos armazenar nossos logs em arquivos de texto ou bancos de dados.

Com base nos logs, podemos reunir insights sobre quaisquer erros ou problemas de desempenho na aplicação de produção e, também, se alguém tentar atacar o aplicativo, podemos identificar suas tentativas.

10- Validação no Upload de arquivos

Se a sua aplicação web tiver um controle de upload de arquivos, os invasores terão a chance de fazer upload de arquivos de script mal-intencionados que causam problemas. Portanto, a validação adequada do arquivo é sempre necessária.

A principal validação que fazemos em arquivos é validar a extensão do arquivo. No entanto, os invasores podem alterar a extensão de seu arquivo e enviá-lo de qualquer maneira.

Por exemplo, se você permitir apenas arquivos de imagem, um invasor pode salvar seu arquivo de script com uma extensão .jpeg e  enviá-lo. Neste caso, a validação da extensão do arquivo aceita o arquivo porque o considera um arquivo de imagem, embora seja realmente um arquivo de script malicioso.

Como fazer a validação adequada ?

Concluímos assim as dez dicas para ajudar a tornar a sua aplicação ASP .NET Core MVC mais segura.

"Se o SENHOR não edificar a casa, em vão trabalham os que a edificam; se o SENHOR não guardar a cidade, em vão vigia a sentinela."
Salmos 127:1


Referências:


José Carlos Macoratti