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.
![]()
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


Comentarios
Añadir comentario