Práticas de segurança básica para aplicativos da Web
O tópico de criar um aplicativo da Web seguro é abrangente.Ele requer estudos para compreender as vulnerabilidades de segurança.Você também precisa se familiarizar com os recursos de segurança do Windows, o .NET estrutura e ASP.NET.Por fim, é essencial para entender como usar esses recursos de segurança para ameaças de contador.
Mesmo se você não tiver experiência com segurança, existem medidas básicas que você deve tomar para proteger o aplicativo da Web.A lista a seguir fornece diretrizes minimum-security que se aplicam a todos os aplicativos da Web e que você deve seguir:
Recomendações Gerais para Aplicativos de segurança Web
Executar aplicativos com privilégios mínimos.
Conheça seus usuários
Proteção contra entrada de usuários maliciosos
Acessar bancos de dados de forma segura
Criar mensagens de erro de segurança
Manter segredos com segurança
Use cookies de modo seguro
Proteção contra Ameaças de Negação de Serviço
Observação: Para orientação de segurança abrangente e detalhada que irá ajudá-lo a projetar, desenvolver, configurar e implantar aplicativos ASP.NET mais seguros, consulte os módulos de segurança fornecidos sobre o Padrões e práticas da Microsoft Site da Web.
Recomendações Gerais para Aplicativos de segurança Web
Mesmo a segurança de aplicações mais elaborados podem falhar se um usuário mal-intencionado usar maneiras simples para obter acesso a seus computadores.Siga estas diretrizes:
Backup dos dados com frequência e manter os backups fisicamente seguros.
Mantenha seu computador servidor da Web fisicamente seguro para que os usuários não autorizados não sejam capazes de acessá-lo, desativá-lo ou levá-lo.
Usar o sistema de arquivos NTFS do Windows, não FAT32.NTFS oferece substancialmente mais segurança do que o FAT32.Para obter detalhes, consulte a documentação de ajuda do Windows
Proteger o servidor Web e todos os computadores na mesma rede com senhas de alta segurança.
Proteger o IIS.Para obter detalhes, consulte o Microsoft TechNet segurança centralizar Site da Web.
Fechar quaisquer portas não usadas e desativar serviços não utilizados.
Execute um verificador de vírus que monitora o tráfego de entrada e saída.
Estabelecer e impor uma diretiva que proibe os usuários de manter suas senhas escritas em um local fácil para localizar.
Use um firewall.Para obter recomendações, consulte Microsoft Firewall Guidelines no site de segurança da Microsoft.
Instale os patches de segurança mais recentes da Microsoft e outros fornecedores.Por exemplo, consulte o Microsoft TechNet Security centralizar Site da Web possui uma lista dos boletins de segurança mais recentes para todos os produtos da Microsoft.Outros fornecedores tem sites semelhantes.
Use o log de eventos do Windows e examine os logs com frequência para atividades suspeitas.Isso inclui repetidas tentativas para fazer logon no seu sistema e um número extremamente alto de solicitações contra seu servidor Web.
Executar aplicativos com privilégios mínimos.
Quando seu aplicativo é executado, ele executa em um contexto que tenha privilégios específicos no computador local e possivelmente em computadores remotos.Para obter informações sobre a configuração da identidade do aplicativo, consulte Configurando Identidade de Processo do ASP.NET.Para executar com menos privilégios, siga estas diretrizes:
Não execute o aplicativo com a identidade de um usuário do sistema (administrador).
Execute o aplicativo no contexto de um usuário com o mínimo de privilégios práticos.
Defina permissões (ACLs, ou Listas de Controle de Acesso) em todos os recursos necessários para seu aplicativo.Use a configuração menos permissiva.Por exemplo, se for prático em seu aplicativo, defina arquivos para serem somente leitura.Para obter uma lista das permissões ACL mínimas necessárias para a identidade de seu aplicativo ASP.NET, consulte ASP.NET Required Access Control Lists (ACLs).
Mantenha arquivos para seu aplicativo da Web em uma pasta abaixo da raiz do aplicativo.Não permita aos usuários a opção de especificar um caminho para qualquer acesso ao arquivo em seu aplicativo.Isso evita que usuários obtenham acesso à raiz do seu servidor.
Conheça seus usuários
Em muitos aplicativos, os usuários acessam o site de forma anônima (sem ter que fornecer credenciais).Nesse caso, o aplicativo acessa recursos, executando em um contexto de um usuário predefinido.Por padrão, este contexto é o usuário ASPNET local (Windows 2000 ou Windows XP) ou usuário NETWORK SERVICE (Windows Server 2003) no servidor Web.Para restringir o acesso a usuários que são autenticados, siga estas diretrizes:
Se seu aplicativo for um aplicativo intranet, configure-o para usar segurança integrada do Windows.Dessa maneira, as credenciais de logon do usuário podem ser usadas para acessar recursos.Para obter mais informações, consulte ASP.NET Impersonation.
Se você necessitar obter credenciais do usuário, utilize uma das estratégias de autenticação ASP.NET.Para um exemplo, consulte Gerenciando usuários usando Associação.
Proteção contra entrada de usuários maliciosos
Como uma regra geral, nunca suponha que a entrada que você obteve de um usuários é segura.É fácil para os usuários mal-intencionados enviar informações potencialmente perigosas a partir do cliente para seu aplicativo.Para ajudar na proteção contra entradas mal-intencionadas, siga estas diretrizes:
Em páginas da Web ASP.NET, filtre entrada do usuário para procurar marcas HTML, que podem conter script.Para obter detalhes, consulte:Como: Proteger contra exploits script em um aplicativo Web da Web, Applying HTML Encoding to Strings.
Nunca ecoe a entrada do usuário não filtrada.Antes de exibir informações não confiáveis, codifique em HTML para transformar o script potencialmente prejudicial em caracteres visíveis.
Nunca armazene entrada não filtrada do usuário em um banco de dados.
Se você desejar aceitar alguns HTML de um usuário, filtre-o manualmente.Em seu filtro, defina explicitamente o que você aceitará.Não crie um filtro que tenta filtrar a entrada mal-intencionada; é muito difícil antecipar todos as possíveis entradas mal-intencionadas.
Não assuma que as informações obtidas de um cabeçalho de solicitação HTTP (no objeto HttpRequest) são seguras.Use proteções para sequências de consulta, cookies, e assim por diante.Esteja ciente de que as informações que o navegador comunica ao servidor (informações do agente de usuário) podem ser falsificadas, no caso de ser importante em seu aplicativo.
Se possível, não armazene informações sigilosas em um local que seja acessível a partir do navegador, como campos ocultos ou cookies.Por exemplo, não armazene uma senha em um cookie.
Observação: O estado de exibição é armazenado em um campo oculto em um formato codificado.Por padrão, ele inclui um código de autenticação de mensagem (MAC) para que a página possa determinar se o estado de exibição foi violado.Se informações sigilosas estiverem armazenados em estado de exibição, criptografe ao definir a propriedade ViewStateEncryptionMode da página para true.
Acessar bancos de dados de forma segura
Bancos de dados normalmente têm sua própria segurança.Um aspecto importante da segurança de aplicativo da Web está em criar uma maneira que o aplicativo acesse o banco de dados com segurança.Siga estas diretrizes:
Use a segurança inerente do seu banco de dados para limitar quem pode acessar os recursos do banco de dados.A estratégia exata depende do seu banco de dados e de seu aplicativo:
Se for prático em seu aplicativo, use segurança integrada do Windows para que apenas os usuários Windows autenticados possam acessar o banco de dados.Segurança integrada é mais segura que transmissão de credenciais explícitas para o banco de dados.
Se seu aplicativo usar o acesso anônimo, crie um único usuário com permissões muito limitadas e execute consultas ao conectar-se como este usuário.
Não crie instruções SQL concatenando sequências que envolvem entrada do usuário.Em vez disso, crie uma consulta com parâmetros e use a entrada do usuário para definir valores de parâmetro.
Se você deve armazenar um nome de usuário e a senha em algum lugar para usar como as credenciais de logon do banco de dados, armazene-os no arquivo web.config e proteja o arquivo com a configuração protegida.Para obter detalhes, consulte:Criptografando informações de configuração usando configuração protegida.
Para obter mais informações sobre acesso a dados com segurança, consulte Proteção de acesso a dados e Protegendo aplicativos do ADO.NET.
Criar mensagens de erro de segurança
Se você não for cauteloso, um usuário mal-intencionado pode deduzir informações importantes sobre o aplicativo a partir das mensagens de erro que ele exibe.Siga estas diretrizes:
Não redija mensagens de erro que propaguem informações que podem ser úteis para os usuários mal-intencionados, tais como um nome de usuário.
Configure o aplicativo não para mostrar erros detalhados aos usuários.Se você quiser exibir as mensagens de erro detalhadas para depuração, verifique primeiro se o usuário é local para o servidor Web.Para obter detalhes, consulte:Como: Exibição Safe erro Messages.
Use o elemento de configuração customErrors para controlar quem pode visualizar as exceções do servidor.
Crie tratamento de erro personalizado para situações que são propensas a erro, tais como acesso a banco de dados.Para obter mais informações, consulte Tratamento de erro em páginas e aplicativos ASP.NET.
Manter Seguras Informações Sigilosas
Informações confidenciais são quaisquer informações que você precisa manter privativas.Um pedaço típico de informações sigilosas é uma senha ou uma chave de criptografia.Se um usuário mal-intencionado pode obter informações sigilosas, os dados protegidos pelo segredo estarão comprometidos.Siga estas diretrizes:
Se seu aplicativo transmitir informações sigilosas entre o navegador e o servidor, considere o uso de Secure Sockets Layer (SSL).Para obter detalhes sobre como proteger um site com SSL, consulte o artigo Q307267, "HOW TO: Proteger Serviços Web XML com Secure Socket camada no Windows 2000 "na Base de Dados de Conhecimento Microsoft da Microsoft em http://suporte.microsoft.com.
Use configuração protegida para proteger informações sigilosas em arquivos de configuração como os arquivos Web.config ou Machine.config.Para obter mais informações, consulte Criptografando informações de configuração usando configuração protegida.
Se você deve armazenar informações sigilosas, não as mantenha em uma página da Web, nem mesmo em um formulário que você acha que pessoas não serão capazes de ver (tais como em código servidor).
Use os algoritmos de criptografia eficientes fornecidos em System.Security.Cryptography.
Use cookies de modo seguro
Cookies são uma maneira fácil e útil de manter informações específicas de usuário disponíveis.Entretanto, como os cookies são enviados para o navegador do computador, eles são vulneráveis a falsificação ou outro uso mal-intencionado.Siga estas diretrizes:
Não armazene quaisquer informações críticas em cookies.Por exemplo, não armazene a senha do usuário em um cookie, mesmo temporariamente.Como regra, não manter tudo em um cookie que, se falsificados, pode comprometer seu aplicativo.Em vez disso, mantenha uma referência no cookie para uma localidade no servidor onde as informações estão localizadas.
Defina datas de expiração em cookies para o menor tempo prático possível.Evite cookies permanentes, se possível.
Considere criptografar informações em cookies.
Considere definir as propriedades Secure e HttpOnly de cookie para true.
Proteção contra Ameaças de Negação de Serviço
Uma maneira indireta que um usuário mal-intencionado pode comprometer seu aplicativo é tornando-o indisponível.O usuário mal-intencionado pode manter o aplicativo muito ocupado para atender outros usuários, ou senão pode simplesmente travar o aplicativo.Siga estas diretrizes:
Use o tratamento de erros (por exemplo, blocos try/catch).Incluir um bloco finally no qual você libera recursos no caso de falha.
Configure o IIS para usar o estreitamento, que impede um aplicativo de usar uma quantidade desproporcional de CPU.
Teste limites de tamanho de entrada do usuário antes de usá-la ou armazená-la.
Coloque proteções de tamanho em consultas de banco de dados.Por exemplo, antes de exibir resultados da consulta em um página da Web ASP.NET, certifique se não há um número excessivo de vários registros.
Colocar um limite de tamanho em carregamentos de arquivos, se estes fizerem parte de seu aplicativo.Você pode definir um limite no arquivo Web.config usando sintaxe como a seguir, onde o valor maxRequestLength está em kilobytes:
<configuration> <system.web> <httpRuntime maxRequestLength="4096" /> </system.web> </configuration>
Você também pode usar a propriedade RequestLengthDiskThreshold para reduzir a sobrecarga de memória de grandes carregamentos de postbacks de formulário.