Esta tradução fornecida pelo StrongLoop / IBM.
Este documento pode estar desatualizado em relação à documentação em Inglês. Para obter as atualizações mais recentes, consulte a documentação em Inglês.O termo “produção” refere-se ao estágio no ciclo de vida do software onde um aplicativo ou API está geralmente disponível para os seus usuários finais ou consumidores. Em contrapartida, no estágio de “desenvolvimento”, você ainda está ativamente escrevendo e testando o código, e o aplicativo não está aberto para acesso externo. Os ambiente de sistema correspondentes são conhecidos como ambientes de produção e desenvolvimento, respectivamente.
Os ambientes de desenvolvimento e produção são geralmente configurados de forma diferente e possuem requisitos completamente diferentes. O que é bom em desenvolvimento pode não ser aceitável na produção. Por exemplo, em um ambiente de desenvolvimento você pode desejar registros detalhados de erros para depuração, enquanto o mesmo comportamento pode se tornar um risco de segurança em um ambiente de produção. E em desenvolvimento, você não precisa se preocupar com a escalabilidade, confiabilidade, e desempenho, enquanto estas preocupações se tornam críticas na produção.
Este artigo discute algumas melhores práticas de segurança para aplicativos do Express implementadas na produção.
Os Express 2.x e 3.x não são mais mantidos. Problemas de segurança e desempenho nestas versões não serão corrigidos. Não use-as! Se não tiver migrado para a versão 4, siga o guia de migração.
Assegure-se também de que não esteja usando nenhuma das versões vulneráveis do Express listadas na Página de atualizações de segurança. Se estiver, atualize para uma das liberações estáveis, preferivelmente a mais recente.
Se o seu aplicativo negocia com ou transmite dados sensíveis, use a Segurança da Camada de Transporte (TLS) para proteger a conexão e os dados. Esta tecnologia criptografa os dados antes deles serem enviados do cliente para o servidor, assim evitando alguns ataques comuns (e fáceis). Apesar de solicitações Ajax e POST não parecerem visivelmente óbvias e parecerem “ocultas” em navegadores, o seu tráfego de rede é vulnerável a sniffing de pacotes e ataques man-in-the-middle .
Você pode estar familiarizado com a criptografia Secure Sockets Layer(SSL). O TLS é simplesmente a próxima progressão do. Em outras palavras, se você estava usando o SSL antes, considere fazer o upgrade para o TLS. Em geral, recomendamos o Nginx para lidar com o TLS. Para obter uma boa referência para configurar o TLS no Nginx (e outros servidores), consulte Configurações Recomendadas de Servidores (Mozilla Wiki).
Além disso, uma ferramenta útil para obter um certificado TLS gratuito é a Let’s Encrypt, uma autoridade de certificação (CA) gratuita, automatizada, e aberta fornecida pelo Grupo de Pesquisas de Segurança da Internet (ISRG).
O Helmet pode ajudar a proteger o seu aplicativo de algumas vulnerabilidades da web bastante conhecidas configurando os cabeçalhos HTTP adequadamente.
O Helmet é na realidade apenas uma coleção de nove funções de middlewares menores que configuram cabeçalhos HTTP relacionados à segurança:
Content-Security-Policy
para ajudar a evitar ataques de cross-site scripting e outras injeções cross-site.X-Powered-By
.Strict-Transport-Security
que impinge conexões seguras (HTTP sobre SSL/TLS) com o servidor.X-Download-Options
para o IE8+.Cache-Control
e Pragma
para desativar o armazenamento em cache no lado do cliente.X-Content-Type-Options
para evitar que os navegadores procurem por MIME uma resposta a partir do
content-type declarado.X-Frame-Options
para fornecer proteção clickjacking.X-XSS-Protection
para ativar o filtro
de Cross-site scripting (XSS) nos navegadores da web mais recentes.Instale o Helmet como qualquer outro módulo:
$ npm install --save helmet
Em seguida use-o no seu código:
...
var helmet = require('helmet');
app.use(helmet());
...
Se não desejar usar o Helmet, então pelo menos desative o
cabeçalho X-Powered-By
. Invasores podem utilizar
este cabeçalho (que fica ativado por padrão) para detectar
aplicativos executando o Express e então iniciar ataques
especificamente direcionados a eles.
Portanto, a melhor prática é desligar o cabeçalho com o método
app.disable()
:
app.disable('x-powered-by');
Se usar o helmet.js
, ele cuida disso por você.
Para assegurar que os cookies não deixem o seu aplicativo aberto a ataques, não use o cookie de sessão padrão e configure as opções de segurança de cookies adequadamente.
Existem dois módulos de middleware principais para sessão de cookies:
express.session
integrado no Express 3.x.express.cookieSession
integrado no Express 3.x.A principal diferença entre esses dois módulos é como eles salvam os dados de cookies de sessão. O middleware express-session armazena os dados da sessão no servidor; ele salva apenas o ID da sessão no cookie, não os dados da sessão. Por padrão, ele usa armazenamento em memória e não é projetado para um ambiente de produção. Em produção, será necessário configurar um armazenamento de sessão escalável; consulte a lista de armazenamentos de sessão compatíveis.
Em contrapartida, o middleware cookie-session implementa um armazenamento apoiado em cookies: ele serializa a sessão inteira para o cookie, ao invés de apenas a chave da sessão. Use apenas quando os dados da sessão são relativamente pequenos e facilmente codificados como números primitivos(ao invés de objetos). Apesar de navegadores supostamente suportarem pelo menos 4096 bytes por cookie, para assegurar que você não exceda o limite, não exceda um tamanho de 4093 bytes por domínio. Além disso, esteja ciente de que os dados do cookie serão visíveis para o cliente, portanto se houver razão para mantê-los seguros ou obscuros, então o express-session pode ser uma escolha melhor.
Usando o nome do cookie da sessão padrão pode deixar o seu
aplicativo aberto a ataques. O problema de segurança levantado é
parecido ao do X-Powered-By
: um invasor em
potencial poderia usá-lo para identificar o servidor e direcionar
ataques de acordo com ele.
Para evitar este problema, use nomes de cookie genéricos; por exemplo usando o middleware express-session:
var session = require('express-session');
app.set('trust proxy', 1) // trust first proxy
app.use( session({
secret : 's3Cur3',
name : 'sessionId',
})
);
Configure as seguintes opções de cookie para aprimorar a segurança:
secure
- Assegura que o navegador só envie o cookie por HTTPS.httpOnly
- Assegura que o cookie seja enviado apenas por HTTP(S), não por cliente JavaScript, ajudando
assim a se proteger contra ataques de cross-site scripting.domain
- indica o domínio do cookie; use-o para comparação contra o domínio do servidor em que a URL está
sendo solicitada. Se elas corresponderem, verifique o atributo de caminho em seguida.path
- indica o caminho do cookie; use-o para comparação contra o caminho da solicitação. Se este e o domínio corresponderem, então envie o cookie na solicitação.expires
- use para configurar uma data de
expiração para cookies persistentes.Aqui está um exemplo usando o middleware cookie-session:
var session = require('cookie-session');
var express = require('express');
var app = express();
var expiryDate = new Date( Date.now() + 60 * 60 * 1000 ); // 1 hour
app.use(session({
name: 'session',
keys: ['key1', 'key2'],
cookie: { secure: true,
httpOnly: true,
domain: 'example.com',
path: 'foo/bar',
expires: expiryDate
}
})
);
Aqui estão algumas recomendações adicionais da excelente Lista de Verificação de Segurança do Node.js. Refira-se a esta postagem do blog para obter todos os detalhes destas recomendações:
Fique atento às recomendações do Node Security Project que podem afetar o Express ou outros módulos usados pelo seu aplicativo. Em geral, o Node Security Project é um excelente recurso para conhecimento e ferramentas sobre segurança do Node.
Finalmente, os aplicativos do Express - como outros aplicativos web - podem estar vulneráveis a uma variedade de ataques baseados na web. Familiarize-se com vulnerabilidades web conhecidas e tome precauções para evitá-las.