Pergunta

Ao se inscrever para novas contas, Web Apps, muitas vezes pedir a resposta a uma 'questão de segurança', o nome de ou seja, Cão, etc.

Eu gostaria de ir através do nosso banco de dados e olhar para as instâncias onde os usuários simplesmente purê o teclado em vez de fornecer uma resposta legítima -. Este é um alto indicador de uma conta abusivo / fraudulenta

"nome de solteira da mãe?" lakdsjflkaj

Todas as sugestões de como eu deveria ir sobre como fazer isso?

Nota: Eu não estou usando apenas expressões regulares sobre estas 'questão respostas de segurança'

Os 'respostas' pode ser:

  1. selecionada a partir de um db usando alguns básica sql expressões regulares

  2. Analisados ??tantas vezes quanto necessário, usando python expressões regulares

  3. Em comparação / podada / marcado como necessário

Esta é uma questão técnica, não uma filosófica ; -)

Obrigado!

Foi útil?

Solução

Você é provavelmente melhor análise da distribuição n-gram, semelhante a detecção de idioma.

Este código é um exemplo de detecção de idioma usando trigramas. Meu palpite é que o teclado quebrando trigramas são bastante original e não aparecem em linguagem normal.

Outras dicas

Eu não faria isso - na minha opinião estas questões enfraquecer a segurança, assim como um usuário Eu sempre tentar dar outra semi-senha como uma resposta - para você que gostaria purê. Bem, ela é amassada, mas isso é exatamente o que eu quero fazer.

Btw. Eu não estou certo sobre o fato de que você pode consultar as respostas. Desde que superar sua senha de proteção que devem ser tratadas como senhas = armazenadas como um hash!

Editar:
Quando li este artigo hora lembrei estas questões; -)

Toda a abordagem de questões de segurança é bastante falho.

Eu sempre achei as pessoas colocam respostas de segurança mais fracas do que as senhas que eles usam .
questões de segurança são apenas mais um elo de uma cadeia de segurança - o elo mais fraco!

IMO, a melhor maneira de ir seria a permitir que o usuário solicitar uma nova senha enviada ao seu registrada id de e-mail . Isso tem duas vantagens.

  1. a tentativa de força bruta tem que localizar e quebrar o serviço de e-mail primeiro (e, você nunca irá ajudá-los lá - manter o ID de registro de e-mail muito protegida)
    • o usuário de seu serviço sempre terá uma indicação de quando alguém tenta uma força-bruta (que recebem um e-mail dizendo que eles tentaram regenerar sua senha)

Se você deve ter perguntas secretas, deixá-los disparar um re-gerado (nunca enviar a senha do usuário, regenerar um, de preferência de uma só vez forçada temporária) expedição senha para o ID de e-mail que eles registrado com - e, fazer não mostram que em tudo.

Outro truque é fazer a pergunta secreta SE seu registrada id de e-mail .
Se eles colocá-lo direito, você enviar um re-gerado senha temporária para esse ID de e-mail.

Não há nenhuma maneira de fazer isso com um regex. Na verdade, eu não posso pensar de uma forma razoável para fazer isso em tudo - onde você traçar a linha entre suspeito e insuspeito? I, por uma vez, muitas vezes responder as questões de segurança com uma resposta ofuscado. Afinal, o nome de solteira de minha mãe não é a coisa mais difícil de descobrir.

Se você pode encontrar uma lista de probabilidades carta de par em Inglês, você poderia construir uma probabilidade aproximada para a palavra não ser um "real" palavra em Inglês, usando os pares e pares possíveis menos que não estão na lista. Infelizmente, se você tem nomes ou outros "não-palavras", então você não pode forçá-los a ser palavras em inglês.

Talvez você possa verificar se há uma abundância de consoantes. Assim, por exemplo, no seu exemplo lakdsjflkaj existem 2 vogais (a) e 9 consoantes. Normalmente, a probabilidade de acertar uma vogal ao pressionar aleatoriamente chaves é muito mais baixa do que a de bater uma consoante.

Dejunk é uma biblioteca Ruby a partir do qual você pode tirar inspiração. Ele implementa algumas das sugestões em outras respostas. Considera entrada para ser esmagou teclado se a entrada:

  • Contém bigramas caracteres que não são susceptíveis de aparecer em texto real, mas que estão juntos em um teclado. (A biblioteca inclui uma lista de tais bigramas.)
  • Inicia um sinal de pontuação inesperado.
  • Tem muitas palavras muito curtas.
  • Não tem vogais.
  • Tem personagens que se repetem um número razoável de vezes.

Você pode verificar para uma letra maiúscula no início .... que você irá obter alguns falsos positivos, com certeza.

Uma rápida no google me deu este , você pode comparar cada um contra um nome nessa lista .

Obviamente só funciona para a pergunta de segurança você indicou.

Você também vi isso:

anatomia do ataque Twitter

Vou pensar muito próxima vez que eu implementar uma pergunta de segurança.

Se a sua pergunta é sempre algo relacionado a um nome real, humano, isso é impossível. Considere nomes asiáticos digitados com caracteres latinos; eles podem muito bem tropeçar tudo o filtro que você venha com, mas ainda são perfeitamente legítimas.

Você pode procurar por padrões que não fazem sentido foneticamente. Tais como:

'q' não seguido por um 'u'.

asdf

qwer

zxcv

asdlasd

Basicamente, tente triturar em seu próprio teclado, veja o que você tem, e plugue que no seu filtro. Também ligar várias regras gramaticais. No entanto, uma vez que é nomes você está lidando com, você sempre terá 'o cara' com o nome estranho que irá causar um falso positivo.

Em vez de expressões regulares, porque não basta comparar com uma lista de bons valores conhecidos? Por exemplo, compare o nome de solteira da mãe com dados do censo, ou nome do animal com qualquer das listas de nomes de animal de estimação que você pode encontrar online. Para uma versão mais simples deste, basta fazer uma pesquisa no Google por tudo o que é digitado. nomes legítimos deve ter a abundância de resultados, enquanto esmagou teclado deve resultar em muito poucos, se houver.

Tal como acontece com qualquer outro método, você ainda precisa lidar com falsos positivos.

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