Pergunta

Eu tenho um sistema de login que exige um nome de usuário e uma senha. Eu quero mostrar um captcha depois de uma certa quantidade de tentativas de login. O que é a maneira correta de implementar isso? Eu li em torno neste site e algumas soluções de sugerir ter um '-tentativas fracassadas' número adicionado à tabela de usuários. No entanto, eu preciso as tentativas fracassadas de não estar vinculado a um determinado usuário - ou seja, eu gostaria que o captcha a ser exibido independentemente de haver ou não o nome de usuário que foi digitado existe no sistema. Seria armazenar isso em uma variável de sessão ser ok (estou usando PHP)? Se assim for, há nenhuma desvantagem para apenas jogando dados, conforme necessário para as variáveis ??de sessão? Já tenho qualquer um ID de sessão para todos os visitantes no site (ou logado ou não) para que eu pudesse criar uma tabela que relaciona de login-tentativas para esta sessão id ... alguma idéia sobre qual é a melhor abordagem / mais seguro é? Obrigado.

Update: a partir das respostas, até agora, parece que ID da sessão não é a melhor idéia desde o hacker poderia simplesmente limpar seu / sua cache (mas isso é realmente um problema porque não tomaria esta desaceleração a força bruta ataque o suficiente para torná-lo inútil?). A outra opção é por IP ... mas estou hesitante para usuários com menos de uma intranet ou proxy desde tentativas fracassadas serão compartilhadas .... Eu realmente não posso pensar em qualquer outra methods..can você?

Foi útil?

Solução

O perigo de usar um ID da sessão é que alguém que escreve um ataque de força bruta pode apenas limpar seus biscoitos com cada tentativa e, assim, dando-lhe uma nova sessão.

Tenha em mente que um ataque automatizado força bruta pode ser escrito em uma linguagem de script do lado de fora de um navegador que poderia manipular os cookies enviados para cada solicitação.

Outra maneira de fazer isso seria criar uma tabela com origem de usuário IP do e adicionar o contador lá. Isso vai incomodar usuários usando um servidor proxy embora. Mas pelo menos você vai pegar aqueles tentando adivinhar repetidamente senhas a partir do mesmo local.

UPDATE: Ter de apagar cookies durante sucessivas tentativas de força bruta não iria abrandar o ataque como esse processo será automatizado e acontecem quase que instantaneamente. manipulação de cookies no esses tipos de ataques é bastante comum. Modificação de um cookie não é o mesmo que limpar o cache do seu navegador (o que normalmente leva um tempo porque ele precisa excluir um monte de arquivos). Todos as necessidades atacante a fazer é evitar que um cookie está sendo enviado.

Outras dicas

A abordagem sessão não vai funcionar se o hacker fecha seu navegador e reabre-lo cada tentativa, então uma tabela armazenar o número de tentativas falhadas eo tempo da última tentativa (assim você pode verificar se dizer uma hora se passou para que você pode repor o contador) por usuário seria a forma mais segura.

Você pode registrar todas as tentativas falhadas com um IP e hora. tentativas fracassadas antigos são apagados após um certo tempo, e se houver mais do que uma certa quantidade de tentativas falhadas para um determinado IP exibir o captcha.

http://www.php.net/apc ou cache de memória (d) < a href = "http://www.php.net/memcache" rel = "nofollow noreferrer"> http://www.php.net/memcache ou aqui http://www.php.net/memcached (memcache também precisa de um servidor memcached para ser instalado, veja aqui http://www.danga.com/memcached/ ), em seguida, usar os comandos de incremento apropriadas para tentativas de login errados de um endereço IP com um tempo limite de tudo o que você suites (5 minutos, 30 minutos, etc ...). isso permitirá que você para determinar rapidamente se uma tentativa de força bruta está acontecendo (sem preocupações de condições de corrida) e expiram automaticamente o bloco após um período determinado de tempo.

APC exemplo:

$max_attempts = 5;  // max attempts before captcha
$attempts = apc_fetch('login_attempts_'.$ip));
if($attempts and $attempts>$max_attempts){
    // block code here or redirect, captcha etc... also suggest a short sleep time to delay answer, slow down bot
}else{
    // check login here, run next code if login fails
    if($login_failed){
        if(!$attempts){
            apc_store('login_attempts_'.$ip,1,$timeout);
        }else{
            // function NOT currently documented on php.net, increments number stored in key
            apc_inc('login_attempts_'.$ip);
        }
    }
}

é claro que é um exemplo muito áspera ... mas você começa a idéia

As informações mais precisas você pode obter é o seu endereço IP. Não use cookies de sessão se você quer que ele seja exato, uma vez que o usuário pode simplesmente ignorar o seu cookie de sessão (isto é. Utilizando curl). Mas se você está preocupado com ips compartilhados, você poderia tentar incluir informações adicionais, como o agente de navegador ou usar AJAX para passar de volta outra informação que você é incapaz de obter de outra forma. Mas, tudo o mais que não seja o endereço IP pode ser falsificado (mesmo assim, você pode usar proxies).

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