Reforzando Django Simple Captcha

0

Visto 1311 veces | Publicado el 10/01/2010 | captcha


Cuando nos planteamos integrar en la nueva versión de Hacktimes una solución de Captcha para evitar el envío de mensajes automáticos en los foros, y que diera soporte a la tecnología que usamos en la actualidad, nos decidimos por django-simple-captcha, y sí lo de "simple" fue un factor decisivo.

 

HackTimes Captcha

 

Entre las alternativas existentes para el desarrollo esta Recaptcha es mucho más potente y fácil de integrar en Django, no obstante nos resistimos al cambio (como humanos que somos) y hemos hecho ciertas modificaciones para reforzar la configuración por defecto.

La solución actual de Google, Recaptcha, tiene muchas ventajas por no hablar de que la carga en el servidor correspondiente a la generación de las imágenes se hará fuera de nuestros sistemas.

Algunos datos respecto a django-simple-captcha:

 

La web del proyecto es: http://code.google.com/p/django-simple-captcha/

 

Información sobre la configuración inicial puede consultarse en:

 

http://code.google.com/p/django-simple-captcha/wiki/CaptchaConfiguration

 

Información sobre los retos que se pueden generar:

 

http://code.google.com/p/django-simple-captcha/wiki/CaptchaGenerators

 

Los cambios para hacer un poco más robusto y funcional django-simple-captcha son los siguientes:

 

Fichero helpers.py

Modificaremos la función noise_arcs para conseguir lo siguiente:

- Que la curvatura de los arcos se genere de forma pseudo-aleatoria y que el color de dichos arcos sea diferente en cada Captcha.

Nota: Para Hacktimes.com hemos eliminado la linea que se generaba en esta función ya que dificulta en exceso la lectura del Captcha.

#La función resultante sería la siguiente:

 

def noise_arcs(draw,image):
    aux = {}
    color = {}
    for j in range(0,2):
        for i in range(0,3):
        aux[i] = hex(random.randrange(0,255)).replace("0x","").upper()
        if len(aux[i])<2: aux[i]= "0" + aux[i]
        color[j] = "#" + str(aux[0]) + str(aux[1]) + str(aux[2])
    size = image.size
    pos = int(random.randrange(-20,-5))
    pos1 = int(random.randrange(10,20))
    pos2 = int(random.randrange(-20,-5))
    pos3 = int(random.randrange(10,20))
    draw.arc([pos,pos, size[0],pos1], 0, 295, fill=str(color[0]))
    draw.arc([pos2,pos2, size[0],pos3], 0, 295, fill=str(color[1]))
    return draw

 

Modificaremos también la función random_char_challenge con el siguiente objetivo:

 

0- Que la función que usamos para generar el Captcha utilice números además de letras cambiaremos la linea donde se especifica el Charset por:

 

Original: chars,ret = u'abcdefghijklmnopqrstuvwxyz', u''

Modificada: chars,ret = u'abcdefghijklmnopqrstuvwxyz1234567890', u''

 

Que la longitud del Captcha no sea siempre la misma, para ello modificaremos la función incluyendo la linea:

settings.CAPTCHA_LENGTH = random.randint(7,12)

 

# La función resultante será:

def random_char_challenge():
    chars,ret = u'abcdefghijklmnopqrstuvwxyz1234567890', u''
    settings.CAPTCHA_LENGTH = random.randint(7,12)
    for i in range(settings.CAPTCHA_LENGTH):
        ret += chars[random.randint(0,len(chars)-1)]
    return ret.upper(),ret

 

Fichero de vistas views.py

Modificaremos el fichero views.py para que se genere un color de fondo distinto en cada Captcha de la Web de Hacktimes, para ello en la función captcha_image añadiremos:

.............................

size = (size[0]*2,size[1])

.............................

   # New code
    aux = {}
    color = ''
    for j in range(0,2):
        for i in range(0,3):
        aux[i] = hex(random.randrange(0,255)).replace("0x","").upper()
        if len(aux[i])<2: aux[i]= "0" + aux[i]
        color = "#" + str(aux[0]) + str(aux[1]) + str(aux[2])

    settings.CAPTCHA_BACKGROUND_COLOR = color

   # End of new code

.............................

    image = Image.new('RGB', size , settings.CAPTCHA_BACKGROUND_COLOR)

.............................

 

Hemos jugado con otras opciones como cambiar el color de cada letra pero al final los captchas eran prácticamente ilegibles.

 

Fichero conf/settings.py

Por último modificaremos el fichero principal de configuración conf/settings.py

 

Podemos aumentar la rotación de las letras de los valores por defecto a los siguientes:

CAPTCHA_LETTER_ROTATION = getattr(settings, 'CAPTCHA_LETTER_ROTATION', (-55,55))

Configuraremos el timeout del Captcha a 2 Minutos:

CAPTCHA_TIMEOUT = getattr(settings, 'CAPTCHA_TIMEOUT', 2) # Minutes

 

El resultado final es una mejora en la complejidad para resolver el Captcha aunque algunas de las imágenes resultarán ilegibles.

Para evaluar los parámetros que permitén medir la calidad de un sistema Captcha, os dejamos un interesante enlace de la mano de SecurityByDefault http://www.slideshare.net/aramosf/crapcha-sv10-slide-share



Añadir comentario










captcha


Búsqueda

Síguenos


El staff de Hacktimes ruega a cualquier persona interesada en la distribución y/o publicación de estos artículos que lo haga sin alterar su contenido y cite a su autor y/o la fuente original. Muchas gracias.

Todos los artículos publicados se encuentran bajo la licencia Creative Commons