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).
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
Decidí publicar mi idea ahora, pero todavía puede responder – naugtur