Pergunta

Eu administro um site de jogo para que muitos usuários fizessem login e eles possam fazer certas coisas uma vez a cada dois minutos.

Eu tenho um sistema CAPTCHA em alguns lugares e, para algumas coisas, ele sempre pedirá um código e, para outras coisas, ele pedirá a cada 10 minutos.

Alguns jogadores usem o recurso de envio automático na Opera, e meu sistema CAPTCHA os interrompe.

Minha pergunta é: como posso minimizar a quantidade de vezes que estou pedindo um código, mas ainda assim para que as pessoas usem esse submitido automático?

Foi útil?

Solução

Se eu entendo corretamente, essa tarefa não requer um captcha. Suponho que você queira ver se o usuário clicou em si mesmo, sentado em frente ao seu PC.

nova ideia

Coloque vários envios de imagem em seu formulário:

<input type="image" name="send1" src="buttons.php?i=1" />
...
<input type="image" name="send8" src="buttons.php?i=8" />

Ao gerar um formulário, obtenha um número aleatório entre 1 e 8 e salvá -lo em $_SESSION['submitnumber']. Crie duas imagens do mesmo tamanho - uma em vazio preenchida com o seu plano de fundo padrão, o outro parecendo um botão de envio. Crie botões.php que produza imagens com este código:

header("Content-Type: image/jpeg");
flush();
readfile($filename);

e devolver a imagem vazia se o $_GET[i]!=$_SESSION['submitnumber'] caso contrário, retorne a imagem de envio.

Aceite o formulário se o ImagesBMIT correto foi clicado (o navegador enviará coordenados como send1x quando o usuário clicar no botão)

É um tipo de captcha, mas as pessoas não sabem;)

Ideia velha

Você precisa de duas coisas:

1 Gere tokens para formas que são únicas.

colocar <input type="hidden" name="timertoken" value="someweirdstring" />e gerar o "algum tipo de primeiro lugar" para ser um hash do MD5 de alguma coisa de dependente (nome de usuário e tempo). Eu posso elaborar isso, mas este é um token básico para segurança e ataques de CSRF. O token é verificado após a postagem.

exemplo:

Isto é não Uma implementação típica do mecanismo de token, mas será suficiente.

$token=generatesomerandomtext();
$_SESSION['token']=$token; 

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if($_POST['token']==$_SESSION['token']) {
   //it's ok
   }

E isso é tudo que você precisa. Este exemplo simples cria um token exclusivo para cada página e coloca em formas. Não depende do tempo e não usa o MD5, mas armazena o token em sessão. Para enviar automaticamente um formulário que seria aceito, a pessoa precisa usar o formulário que você gerou ou copiar o token.

O exemplo de token de forma real seria mais assim: $ token = md5 ($ nome de usuário.

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if(
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes)) ||
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes-10minutes)) ) {
   //it's ok
   }

Por que nomes de usuário? Porque remove a possibilidade de usar os tokens de um usuário para invadir outro usuário, por que o texto secreto (chamado de 'sal')? Porque alguém poderia manter o nome de outro usuário com o tempo e fazer o MD5, mas sem adivinhar o sal que ele não pode. Por que as duas comparações? Porque se agora for 22:44:59 - o token é gerado com 22:40 e se o usuário enviar, são 22:45:30, para que ele seja arredondado para 22:50 e corresponde ao token apenas se você o retirar 10 minutos .

É isso para um exemplo básico. Para referência, consulte isto pergunta.

2 Altere seu botão Enviar para <input type="image" ... Ao publicar as coordenadas X e Y de onde o botão foi clicado. Não tenho idéia de quem inventou isso em especificação, mas é a primeira vez que pode ser usada! :)

Agora, para ver se o usuário clicou em si, você só precisa ver se as coordenadas estão presentes (o envio clássico não as enviará) e, para bloquear o hacking simples, você também pode se lembrar do último X e Y na sessão do jogador e comparar. É muito mais difícil invadir o envio de coordenados diferentes a cada vez.

Os tokens do formulário estão lá para impedir que os usuários preparem uma cópia do seu formulário com campos aleatórios que simulariam as coordenadas de cliques. Se o token mudar cada vez que for difícil substituir os campos de forma.

Isso ainda é hackeable pela funcionalidade do Usuárioscript, mas é muito mais difícil. E se você adicionasse um Captcha uma vez em uma hora, ninguém se incomodaria em escrever scripts que ajudassem apenas por uma hora e quebrariam depois disso (e exigiriam algum esforço e conhecimento).

Outras dicas

Dependendo dos dados que você recebe, você pode reunir evidentes que o chamador é um usuário. Peça apenas o captcha, se o chamador parece ser um bot.

Evidentes podem ser:

  • O agente do usuário (não é confiável, porque a ópera pode fingir isso)
  • o intervalo em que o envio é acionado (mais exata a chamada atinge o IE a cada 2 minutos, maior a probabilidade de ser um bot)
  • Se seus dados permitirem verificar os padrões de retorno, pode ser evidente também
  • ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top