Práticas recomendadas para autenticação / segurança de aplicativos da web (qualquer plataforma)


12

Hoje, recebi uma pergunta do meu gerente, perguntando-me o que é considerado um design aceitável para autenticação de um aplicativo de formulário da web, especialmente no que diz respeito à natureza de muitos navegadores populares, para "Lembrar senha" nos campos de login típicos de senha de nome de usuário .

Estou tendo problemas para encontrar uma resposta que considero aceitável. À luz das falhas de segurança embaraçosas da Sony, eu realmente quero ter cuidado, mesmo que os dados armazenados nas pessoas sejam de menor sensibilidade. Não estamos armazenando números de segurança social nem endereços, no entanto, estamos armazenando números de telefone, endereços de e-mail e uma foto de um visitante.

Ele está preocupado com o fato de que um usuário possa simplesmente Lembrar Senha em um terminal público; então, alguém pode simplesmente pular nesse terminal e começar a visualizar ou modificar dados de maneira não autorizada. No entanto, estou bastante certo de que, pelo menos nas estações de trabalho do Windows, o navegador não "Lembrará senha" nas contas de usuário do Windows.

Além disso, estou implementando uma criptografia de senha unidirecional no servidor (armazene a senha criptografada no banco de dados, criptografe a senha fornecida pelo usuário no servidor, compare com a string criptografada do banco de dados). Não há planos imediatos para incorporar a criptografia SSL, mas isso ainda é uma opção.

Existem falhas importantes de segurança nessa abordagem? Você tem alguma sugestão melhor?


Ao armazenar a senha unidirecional criptografada (por exemplo, com hash), certifique-se de usar um hash forte (por exemplo, não MD5) ou salte a senha (consulte stackoverflow.com/questions/420843/… ) ou ambos.
Jordan Reiter

Confira o site da OWASP ( owasp.org ). Eles têm muitas informações de segurança muito úteis, incluindo "folhas de dicas" para vários protocolos.
24413 Ralph

Há algumas diretrizes para autenticação de site com base em formulários aqui stackoverflow.com/a/477578/463478
Only You

Respostas:


13

Algumas dicas de alto nível:

  1. Armazene apenas os dados necessários
  2. Sempre criptografe dados confidenciais (SSN, senha, número do cartão de crédito etc.) ao armazená-los
  3. Sempre criptografe o tráfego usando SSL ao transmitir / receber dados confidenciais
  4. Em caso de dúvida sobre a sensibilidade das informações, criptografe-as
  5. Não confie na entrada do usuário (alguém tentará inserir algo ruim)
  6. Não confie nos seus dados (alguém pode alterá-los no banco de dados - injetando scripts maliciosos, por exemplo)
  7. Não role sua própria criptografia
  8. Proteger os servidores que hospedam os aplicativos / bancos de dados
  9. Aumente a carga dos usuários finais por questões de segurança (restrições de senha, nunca exponha senhas, não envie URLs por email, reduza o tempo da sessão etc.)

Minha sugestão para você seria obter um livro sobre a proteção de aplicativos da Web. Há informações demais para transmitir em uma única resposta / blog / artigo. O tópico da criptografia sozinho é substancial.


Qual é o raciocínio por trás do uso do SSL em vez da rolagem da própria criptografia? Você consideraria usar algo como WS-Security lançando sua própria criptografia? Configurar o SSL pode ser um problema.
Sr. Jefferson

Esta é uma boa lista de verificação. Estou surpreso que não haja mais votos positivos.
91111 Kristoffer Hoch

2
@ Mr.Jefferson, eu diria 99.999999% das vezes que você NUNCA deseja "rolar sua própria criptografia".
Zach Leighton


1

Eu diria que você deveria ficar bem.

A maioria dos usuários será inteligente o suficiente para não salvar sua senha em um terminal público, e as senhas serão armazenadas por perfil. Lembre-se de que eles poderiam escrevê-lo com facilidade em um lembrete ou usar uma senha fraca.

Se a página de login não for criptografada por SSL, não seria muito difícil para um invasor farejar essa senha enquanto viaja pela rede. No entanto, é um bom trabalho colocar a senha no banco de dados, impedindo que um invasor em potencial veja as senhas de todos (que eles poderiam usar com o endereço de email para tentar fazer logon em outros sites nos quais o usuário possa estar).

Se você ainda quiser, existem maneiras de desativar o comportamento do navegador, como Chad apontou. Eu só vi isso no site do meu banco e no sistema Live da Microsoft.


Ótimo post, esqueci de acrescentar que o nome de usuário não será o endereço de email, no entanto, um usuário terá um endereço de email armazenado no sistema. Engraçado você mencionar isso, porque mesmo sites populares como o Facebook são suscetíveis a cheirar pacotes para addys e senhas.
maple_shaft

Também quero acrescentar que não estou apontando as falhas de segurança no Facebook como uma "desculpa" necessariamente para um modelo de segurança ruim no meu aplicativo. Só porque a mãe de Joey lhe permite assistir filmes se r avaliado não fazer o certo :)
maple_shaft

1

Em um determinado momento, você não pode (e não é obrigado legalmente) a proteger um usuário de si mesmo. A funcionalidade "Lembrar senha" pode ser arriscada, mas é um risco assumido pelo usuário. Da mesma forma, se o usuário decidir reutilizar sua senha para vários serviços, ele assumirá esse risco também. Também não é necessário avisá-los para não escreverem sua senha em um lembrete e colá-la no monitor, mesmo que os usuários também façam isso também.

Ou seja, até que alguém com êxito litigue e mude as regras. Consulte também: "Aviso: o conteúdo pode estar quente".


0

Não acho que você possa controlar com segurança se o navegador lembra ou não uma senha. Está simplesmente fora de suas mãos, independentemente de o navegador fazer isso ou não. Nem é necessariamente um enorme risco de segurança para você . Você sempre deve assumir que ataques podem ser feitos a partir de logins válidos. Não assuma, porque alguém tem um usuário / passe de login válido que não será bom. Afinal, existem muitas maneiras pelas quais as senhas podem cair nas mãos erradas.

Eu acho que o que você poderia fazer é aleatoriamente os nomes dos campos no seu formulário de login cada vez. Em vez de <input name="username", use algo como <input name="user658667587". Isso tornaria os nomes de usuário em cache bastante inúteis. Mas não sei se a sobrecarga valeria a pena. Sem mencionar usuários inconvenientes que não estão em máquinas públicas.

Se você estiver em uma situação extremamente sensível à segurança (bancos, investimentos), você pode simplesmente perguntar às pessoas durante o logon se é uma máquina pública. Você também pode armazenar em cache endereços IP conhecidos quando as pessoas fizerem login, e se elas fizerem login em um local diferente exigirem um número de PIN não digitado (por exemplo, clique nas imagens), além do passe / usuário normal. Meu banco faz algo parecido com isso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.