¡Hola intercambio de pila de seguridad de la información!
Hice una aplicación captcha en PHP. Ciertamente no es una buena idea hacerlo, pero estaba aburrido y quería aprender sobre las curvas de Bézier y los algoritmos de línea de Bresenham. Por lo tanto, ignoremos que mi aplicación no es realmente segura contra intentos de craqueo serios que intentan descifrarla con métodos de OCR.
A mi pregunta: Mi aplicación básicamente escribe cada dos horas 10 nuevas imágenes captcha en un directorio (con un cronjob). Si hay más de 1000 imágenes en el directorio, reemplaza las 10 imágenes más antiguas por las nuevas generadas. Así que siempre hay un grupo de 1000 captchas que se refrescan de manera lenta pero constante. Todas las imágenes de captcha tienen un nombre de archivo aleatorio de 18 caracteres y tengo una matriz asociativa en mi base de datos que asigna los nombres de archivo como claves para el valor de captchas. La matriz se parece a esto:
Array
(
[captchas/6aab1bfa796ff02b48] => knfbb
[captchas/3f53d6eefb535233f0] => HnHnQ
[captchas/436e3567bdbb987b45] => HaEQS
[captchas/916ac5d684f17f1677] => aQnWE
[captchas/fb6267bfb72ff37fdb] => fHWya
[captchas/3fb748ba654b98088e] => WkSEG
[captchas/71ea9d1d88a245c1e3] => HkQXy
.
.
.
);
Cada vez que mi aplicación de captcha se engancha en un formulario de comentarios o inicio de sesión para inyectar una imagen de captcha, elige un captcha aleatorio del grupo y deja que el usuario intente resolverlo.
Ahora es posible que ya veas el inconveniente de seguridad: ¿Cómo puedo asegurarme de que un usuario no descargue todos los captchas y los asigne manualmente (Descifra el captcha manualmente y mapéalo a la suma md5 de la imagen-png) para ¿Es el valor de la cadena correspondiente y luego envía un correo electrónico a mi sitio con un script?
El atacante solo tendría que descargar alrededor del 20 por ciento de todas las imágenes y luego tuvo una tasa promedio de éxito, errhh, sí, el 20%, para hacer spam en mi sitio (el script solo actualizaría el formulario siempre que Sirve un captcha que sabe).
¿Cómo defenderías de tales ataques? (Bajo la condición de que la arquitectura de mi aplicación no cambie: no puedo generar captchas a pedido, sería demasiado lento).
Pensé en incluir en la lista negra las direcciones IP (análisis de las direcciones IP apache2 access_log) de mi sitio que visitan mi sitio más de 100 veces por 5 minutos, pero esto podría ser evitado fácilmente por proxies.