2010-04-08 17 views
8

Tengo un sitio web de juegos, así que tengo muchos usuarios conectados y pueden hacer ciertas cosas una vez cada dos minutos.Códigos de verificación PHP CAPTCHA

Tengo un sistema CAPTCHA en algunos lugares, y para algunas cosas siempre pedirá un código, y para otras cosas, preguntará una vez cada 10 minutos.

He tenido algunos jugadores que usan la función de envío automático en Opera, y mi sistema CAPTCHA los detiene.

Mi pregunta es, ¿cómo puedo minimizar la cantidad de veces que estoy pidiendo un código, pero aún así evitar que las personas usen este envío automático?

+0

Creo que tengo una idea para una solución que no sea captcha, pero necesito más detalles. ¿Cómo usan el envío automático? ¿De qué quieres evitarlos? ¿Presentar demasiado rápido y con demasiada frecuencia, o enviar cuando está lejos del teclado? – naugtur

+0

Decidí publicar mi idea ahora, pero todavía puede responder – naugtur

Respuesta

6

Si entiendo correctamente esta tarea no requiere un captcha. Supongo que desea ver si el usuario hizo clic en sí mismo, sentado frente a su PC.

nueva idea

poner una imagen múltiple presenta en su formulario:

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

cuando se genera un formulario de obtener un número aleatorio entre 1 y 8 y guardarla en $_SESSION['submitnumber']. crea dos imágenes del mismo tamaño: una vacía con el fondo por defecto en el formulario y la otra con el aspecto de un botón de envío. crear buttons.php que las imágenes de salida voluntad con este código:

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

y regresar imagen vacía si el $_GET[i]!=$_SESSION['submitnumber'] demás retornar la imagen someterse.

aceptar la forma si se hace clic en el imagesubmit correcta (el navegador le enviará coords como send1X cuando el usuario hace clic en el botón)

Es un tipo de código de imagen, pero la gente no sabe;)

vieja idea

se necesitan dos cosas:

generar señales de formas que son bastante único.

poner <input type="hidden" name="timertoken" value="someweirdstring" /> y generar el "someweirdstring" para ser un hash MD5 de algunos (nombre de usuario y la hora) -dependant cosa.Puedo profundizar en esto, pero este es un token de forma básica para la seguridad y el bloqueo de ataques CSRF. El token se verifica después de la publicación.

ejemplo:

Ésta es no una implementación típica del mecanismo manera, pero 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 
    } 

y eso es todo lo que necesita. este sencillo ejemplo crea un token único para cada página y lo coloca en formularios. No depende del tiempo y no usa md5, pero almacena el token en sesión. Para enviar automáticamente un formulario que sería aceptado, la persona tiene que usar el formulario que generó o copiar el token.

El ejemplo del token de la forma real sería más como esto: $ token = md5 ($ username.'some secret text '. $ Date. $ TimeRoundedTo10Minutes);

//... 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 qué los nombres de usuario? Porque elimina la posibilidad de usar tokens de un usuario para hackear a otro usuario ¿Por qué el texto secreto (llamado 'sal')? Porque alguien podría juntar el nombre de otros usuarios con el tiempo y hacer md5, pero sin adivinar la sal no puede. ¿Por qué las dos comparaciones? Porque si ahora es 22:44:59 - el token se genera con 22:40 y si el usuario lo envía son las 22:45:30, por lo que se redondea a 22:50 y coincide con el token solo si lo recuperas 10 minutos .

Eso es todo por un ejemplo básico. Para referencia, vea this pregunta.

Cambie el botón Enviar al <input type="image" ..., ya que muestra las coordenadas xey de donde se hizo clic con el botón. No tengo idea de a quién se le ocurrió esto en las especificaciones, ¡pero es la primera vez que se puede usar! :)

Ahora para ver si el usuario hizo clic en sí mismo Solo tienes que ver si las coordenadas están presentes (la presentación clásica no las enviará) y bloquear el pirateo simple Esto también puedes recordar la última xey en el jugador sesión y comparar Es mucho más difícil piratearlo para enviar diferentes coords cada vez.

Los tokens de formulario están ahí para evitar que los usuarios preparen una copia de Su formulario con campos aleatorios que simularían las coordenadas del clic. Si el token cambia cada vez, es difícil anular los campos de formulario.

Esto sigue siendo pirateable por la funcionalidad userscript, pero es mucho más difícil. Y si agregaste un captcha una vez en una hora, nadie se molestaría en escribir guiones que solo te ayudarían durante una hora y luego se interrumpirían (y requerirían un poco de esfuerzo y conocimiento).

+0

No todo el mundo usa el mouse ... – ntd

+0

Es mejor esperar eso, que no hacer nada, ¿no es así? Si usan el teclado, verán el mismo captcha que tienen ahora. Y si escribes una línea de javascript que deja de enviar al ingresar, deja solo lynx-alikes. Ya no son compatibles si Hinek usa captcha, ¿verdad? – naugtur

+0

¿Podría escribir más sobre estos tokens? A veces tengo formularios múltiples en una página, ¿esto podría causar un problema? ¿Y quiere decir generar el token y almacenarlo en mi base de datos, y agregarlo a un formulario y luego compararlos entre sí? o simplemente almacena la última ficha recibida y comprueba si publican la misma ficha dos veces? – Juddling

3

Dependiendo de los datos que reciba, puede reunir evidencia de que la persona que llama es un usuario. Solo solicite el CAPTCHA, si la persona que llama parece ser un bot.

evidents pueden ser:

  • el agente de usuario (no fiable, ya que Opera puede falso esto)
  • se activa el intervalo de la submit (la más exacta la llamada golpea el ejemplo, cada 2 minutos más es la probabilidad de un bot)
  • si sus datos permite la comprobación de regresar patrones puede ser una evidente, también
  • ...