Pergunta

Eu preciso implementar o login verificação de velocidade para um serviço web. O serviço é em Ruby e o banco de dados é MySql.

Eu posso imaginar maus maneiras de fazer isso. Por exemplo, tem uma tabela que tempo de lojas de todos os de tentativa de login e se é ou não foi bem sucedida, e cada vez que o usuário tenta fazer login, consulta que mesa para a última n tentativas de login e executar algumas simples algoritmo contra ela. Isso parece bastante claramente extremamente ineficiente, no entanto. Cada tentativa de login faz um seleto e uma inserção em uma muito grande mesa que vai abrandar o sistema como um todo.

Uma maneira melhor seria dizer que o valor de n é codificado para ser três ou algo assim, e na tabela de usuário (onde quer verificadores de senha são armazenados) adicionar n colunas que sustentam as mais recentes n tentativas de login. Isso remove a instrução select extra, e a tabela do usuário é provavelmente muito menor do que a mesa de tentativas de login seria. No entanto, ele perde uma grande quantidade de dados que poderia ser interessante se o algoritmo foram à mudança.

Neste momento eu estou inclinado para uma variação do que a estrutura que coloca um único campo de texto na tabela com os verificadores de senha, e esse campo de texto contém um objeto serializado que é uma matriz de registros tentativa de login. Em um login tentar esse campo seria analisado e reescrito. Isto resolve o fixo n problema, evitando ter que consultar uma tabela muito grande. No entanto, a leitura do texto campos do banco de dados, claro, tem características de acesso a discos pobres que pode acabar tornando-se uma solução pobre.

Finalmente, outra possibilidade é a utilização de banco de dados de log-lastreados em arquivo do MySQL (que o nome eu não sei), mas eu não sei quase nada sobre isso, exceto que ele é suposto ser eficiente na consultando arquivos de log.

A minha pergunta para Stack Overflow é:? Como são verificações de velocidade de login normalmente implementado na indústria

Update 1:

verificação de velocidade

Eu deveria ter definido. Uma verificação de velocidade para tentativas de login mantém controlar tanto do número de falhas consecutivas e o período de tempo em que ocorreu falhas consecutivas. A primeira resposta faz apontam para uma solução com essas propriedades. Pergunto-me, porém, se ele retém informações suficientes para permitir a flexibilidade na verificação de velocidade. Sem nunca ter construído esse sistema um, a minha preocupação é que eu estou com vista para aspectos importantes da verificação de velocidade que eu vou querer ter considerado quando comecei a construí-la ...

Foi útil?

Solução

No final, eu construído algo semelhante ao que John Boker sugeriu. A tabela usada para usuários autenticados tem duas novas colunas - failed_login_count e first_failed_login que é um objeto DateTime. Cada vez que o usuário fizer logon com êxito no, o failed_login_count é reposto a 0 eo first_failed_login é redefinido para null se não fossem já. Cada vez que há uma tentativa de login falhou, o failed_login_count é incrementado. Se fosse 0, first_failed_login obtém a hora atual. Cada vez que o usuário tenta fazer login, a verificação da velocidade acontece antes de verificar a senha. Se failed_login_count é maior que 0 é dividido pela diferença de tempo entre o momento atual e first_failed_login. Se esse valor for maior do que a velocidade máxima permitida, a verificação de velocidade de falha.

Além disso, eu agressivamente log tentativas de login e verificações de velocidade falharam para o futuro desligada processamento para que eu possa rastrear tentativas de contas de força bruta e desativar contas que têm muitas tentativas de login sem ter que rastrear os detalhes necessários para esses cálculos no próprio banco de dados.

Outras dicas

Eu acredito no provedor de associação asp.net padrão há uma coluna em uma das tabelas do usuário chamados FailedPasswordAttemptCount, IM certo de que apenas incrementos para cada tentativa falhou, em seguida, redefine a 0 quando o sucesso. Com essa coluna e uma coluna LastLoginAttemptTimestamp você pode bloquear usuários para um determinado período de tempo.

Eu posso imaginar maus maneiras de fazer isso. Para exemplo, tem uma tabela que armazena tempo de cada tentativa de login e se ou não foi bem sucedida, e cada vez que o usuário tenta efetuar login, consulta que a tabela para o último login n tentativas e executar algum algoritmo simples contra isso. Isso parece bastante clara extremamente ineficiente, no entanto. Cada tentativa de login faz um seleto e um inserir em uma muito grande mesa que vai abrandar o sistema como um todo.

Se você sabe o que a velocidade máxima é, em seguida, você poderia cargas fora facilmente limpas de entradas na tabela de "login falhou" em um regular (diária seria suficiente a menos que você está esperando dezenas de milhares de logins falhos por dia).

Seria bom considerar quantos logins e maus logins você espera ter por dia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top