¿Cómo asegurar mi aplicación captcha?

1

¡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.

    
pregunta Nikolai Tschacher 30.10.2013 - 22:32
fuente

4 respuestas

3

El problema parece ser exponer la url de la imagen y alertar al usuario del posible captcha repetido.

¿Ha considerado usar un script php para servir la imagen? Tal vez usando la sesión para identificar a qué imagen captcha servir. Aunque es un poco más lento que el cliente que obtiene la imagen directamente, proporciona un medio para ocultar qué archivo está cargando el usuario.

    
respondido por el Kami 06.11.2013 - 11:37
fuente
2

En lugar de todo ese lío de almacenamiento. ¿Por qué no usar PHP GDI?

http://stackoverflow.com/questions/13267846/how-to-add-text-to-an-image-with-php-gd-library

Las imágenes pueden ser una buena idea. puedes dejarlos como están ... solo combina texto e imagen, y eso podría aumentar la dificultad para adivinar el captcha correcto.

Si desea más seguridad, haga una pregunta ... digan las palabras.

¿Qué día fue dentro de 4 días? o ¿Cómo se deletrea esta palabra al revés "stackexchange"?

    
respondido por el Kratos 31.10.2013 - 07:13
fuente
2

En primer lugar, felicitaciones por hacer esto solo por el simple hecho de que no hay suficientes personas que simplemente hagan algunas modificaciones hoy en día. ;)

Yo diría que el mejor enfoque es generar sobre la marcha, a menos que el tráfico a su sitio sea muy pesado, o su servidor ya esté particularmente sobrecargado. Elimina todos los problemas de hash del valor, y la descarga de la imagen y demás, y en la mayoría de los casos, no suponen demasiada carga para su servidor.

Generar sobre la marcha proporciona un desafío adicional, sin embargo, le brinda al usuario una dirección que puede cargar, lo que agrega una carga adicional al servidor, además de solo recargar una página promedio, por lo que la implementación de límites sobre la cantidad de IP puede Cargar estas imágenes puede ser una buena idea, nuevamente, dependiendo del tráfico a su sitio.

Por supuesto, la mejor respuesta real es utilizar uno de los sistemas de generación y servicio de captcha, pero eso está un poco fuera del espíritu experimental que parece haber adoptado.

    
respondido por el Owen 06.11.2013 - 13:24
fuente
2

Un mejor enfoque es 'probarlo'. Los CAPTCHA tienen que ver con una carrera, ya que en "¿quién puede hacer un rompecabezas que sea resistente a la IA pero que sea lo suficientemente simple como para no molestar a los usuarios legítimos?" Pero sin importar cuál sea su tecnología, un atacante dedicado eventualmente puede derrotarlo, si tiene suficiente motivación o recompensa por hacerlo. Por lo tanto, ningún CAPTCHA nunca será perfecto y permanecerá perfecto. Si puede aceptar eso, entonces puede aspirar a "lo suficientemente bueno".

Entonces, en su caso, ha establecido una ventana deslizante de dos horas. Si alguien te roba una docena de nombres de archivos ahora mismo, eso no los beneficiará dentro de dos horas. En serio consideraría que "lo suficientemente bueno para desplegar". Por supuesto, no lo despliegas en un vacío. Aún necesita monitorearlo por abuso, así que vigílelo. Si un spammer consigue, investigue un poco más para determinar si era un humano o un bot.

Comience a obtener valor de él hoy y aprenda algunas lecciones del mundo real a partir de él. Eso es mejor que dejarlo en un estante y preguntar a stackexchange "¿es bueno?"

    
respondido por el John Deters 06.11.2013 - 17:14
fuente

Lea otras preguntas en las etiquetas