Foros del Web » Programando para Internet » Python »

Evitar Bots en formularios Django.

Estas en el tema de Evitar Bots en formularios Django. en el foro de Python en Foros del Web. Hola, actualmente tengo un problema hay un bot, que me esta llenando de Spam por medio de POST. Actualmente tengo implementado un Captcha, pero he ...
  #1 (permalink)  
Antiguo 10/08/2012, 22:08
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 12 años, 6 meses
Puntos: 7
Evitar Bots en formularios Django.

Hola, actualmente tengo un problema hay un bot, que me esta llenando de Spam por medio de POST. Actualmente tengo implementado un Captcha, pero he leído que se puede validar y evitar esto.

Estuve analizando otro sitio con la herramienta firebug y encontré que genera un aleatoriamente un codigo y lo envia a cada paramentro:

Código:
nombre	Juan
email 	[email protected]
mensaje	aqui mensaje

6653cf1e4700b14ff76d51cab...	bdc2b6f21b98dfa4dd71f564799071e7
enviar	send

Fuente
-----------------------------628810369648844896214207606 Content-Disposition: form-data; name="nombre" juan
De esta manera amenos no es posible facilmente que se haga spam.

En mi sitio cuando envio el formulario en firebug muestra lo siguiente:

Código:
csrfmiddlewaretoken=uBTKDWkf9AB5ryl8RWlBn9P0DuCkHFgq&nombre=juan&[email protected]&Mensaje=tumensaje&captcha_0=afe795ec5fa8601a46c3d293c7475e72335addc9&captcha_1=vwwi
Estuve mirando como hacer algo parecido y he encontrado algunas alternativas, que opinan, que me pueden recomendar, la idea sería evitar el captcha.

django-honeypot

Muchas Gracias,
Saludos.
  #2 (permalink)  
Antiguo 10/08/2012, 22:48
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Evitar Bots en formularios Django.

¿Tienes el crfs activo en tu vista del post? Si no es así es por eso, mismo.

Si lo tienes activo, entonces deberías de limitar el numero de peticiones post por IP.

Si esto tampoco funciona entonces puedes estar bajo un ataque DDoS, en el cual vas a necesitar ayuda de tu proveedor de hosting y de profesionales.
  #3 (permalink)  
Antiguo 11/08/2012, 01:21
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 12 años, 6 meses
Puntos: 7
Respuesta: Evitar Bots en formularios Django.

Hola, podemos descartar un Aataque de cualquier tipo al servidor, lo que sucede es que un sitio está usando el formulario de mi sitio para enviar datos, es decir, el recoge los datos a traves de su formulario y luego los procesa en mi formulario.

Te voy a dejar el pequeño codigo que uso, ya he tratado de varias formas y no lo he logrado:
Código Python:
Ver original
  1. def index_view(request):
  2.     configuracion = get_object_or_404(Configuracion, pk = 1)
  3.     info_enviado = False
  4.     nombre= ''
  5.     numero = ''
  6.     mensaje = ''
  7.     if request.method == 'POST':
  8.         formulario = SmsFree(request.POST)
  9.         if formulario.is_valid():
  10.             info_enviado = True
  11.             nombre = formulario.cleaned_data['nombre']
  12.             numero = formulario.cleaned_data['numero']
  13.             mensaje = smart_str(formulario.cleaned_data['mensaje'])
  14.             url =  'http://dominio.com'
  15.             headers = {'Referer':'http://dominio.com/index.php'}
  16.             valores = {'username': 'usuario', 'password': 'clave'}
  17.             r = requests.post(url, params=valores, headers=headers)
  18.     else:
  19.         formulario = EnviarForm()
  20.     ctx = {'ejemplo','ejemplo'}
  21.     ctx.update(csrf(request))
  22.     return render_to_response('home.html',  ctx, context_instance=RequestContext(request))

En el template lo tengo así:
Código:
{% csrf_token %}
{{ formulario.as_p }}
Estuve leyendo un poco en la documentación, me puedes ilustrar un poco :), tambien vi que el csrf es estatico, es decir, no cambiar el valor.

Documentación.

Muchas Gracias,
Saludos.

Última edición por MacintoshD; 11/08/2012 a las 04:52
  #4 (permalink)  
Antiguo 11/08/2012, 10:45
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Evitar Bots en formularios Django.

Mas o menos así deberías tener tu formulario.

En tu código tienes un pequeño error.
Código Python:
Ver original
  1. def index_view(request):
  2.     configuracion = get_object_or_404(Configuracion, pk = 1)
  3.     info_enviado = False
  4.     nombre= ''
  5.     numero = ''
  6.     mensaje = ''
  7.     if request.method == 'POST':
  8.         formulario = SmsFree(request.POST)
  9.         if formulario.is_valid():
  10.             info_enviado = True
  11.             nombre = formulario.cleaned_data['nombre']
  12.             numero = formulario.cleaned_data['numero']
  13.             mensaje = smart_str(formulario.cleaned_data['mensaje'])
  14.             url =  'http://dominio.com'
  15.             headers = {'Referer':'http://dominio.com/index.php'}
  16.             valores = {'username': 'usuario', 'password': 'clave'}
  17.             r = requests.post(url, params=valores, headers=headers)
  18.     else:
  19.         formulario = EnviarForm()
  20.     ctx = {'ejemplo': 'ejemplo'}
  21.     ctx.update(csrf(request))
  22.     return render_to_response('home.html',  ctx, context_instance=RequestContext(request))


Tambien asegurate que tengas django.middleware.csrf.CsrfViewMiddleware en el middleware instalado.
  #5 (permalink)  
Antiguo 12/08/2012, 03:45
Avatar de jhg
jhg
 
Fecha de Ingreso: marzo-2012
Mensajes: 96
Antigüedad: 12 años, 7 meses
Puntos: 1
Información Respuesta: Evitar Bots en formularios Django.

Como ya te han comentado asegurate de que la protección contra CSRF esta correctamente configurada y funcionando.

También, si aun con la protección frente a CSRF consiguen mandar spam (porque el spam podria ser enviado hasta por el propio usuario a proposito sin que suceda un CSRF) podrias, si e spam es mandando el mismo formulario igual muchas veces o almenos uno o varios campos del formulario son exactamente iguales en cada envio del bot, serializa el formulario y obten un hash, guarda en cache ese hash por un tiempo prudencial de varios segundos o minutos (mira cada cuanto manda el bot el formulario) y comprueba de este modo que un formulario no es enviado dos veces seguidas, obviamente si detectas que es enviado dos veces seguidas borra la cache y vuelvela a crear para reiniciar el tiempo de vida de la cache, porque elbot seguira mandando el formulario muy posiblemente. De este modo deberias almenos reducir la cantidad de spam de forma considerable.

EDITO: cuando hablo de cachear me refiero usando la cache a bajo nivel de Django, obviamente.
__________________
JHG

Última edición por jhg; 12/08/2012 a las 03:48 Razón: Aclaración
  #6 (permalink)  
Antiguo 12/08/2012, 08:29
 
Fecha de Ingreso: mayo-2012
Ubicación: Mexico
Mensajes: 82
Antigüedad: 12 años, 6 meses
Puntos: 7
Respuesta: Evitar Bots en formularios Django.

Hola muchachos gracias por responder, les cuento que el problema tiene que ver en que el csrf token no cambia hasta que se borra el cache del navegador, es por eso, que el bot entra y procesa el formulario tan fácilmente, voy a tratar de ver que puedo hacer, agradecería alguna opinión al respecto.


Muchas Gracias Amigos,
Saludos.
  #7 (permalink)  
Antiguo 12/08/2012, 09:00
Avatar de jhg
jhg
 
Fecha de Ingreso: marzo-2012
Mensajes: 96
Antigüedad: 12 años, 7 meses
Puntos: 1
Sonrisa Respuesta: Evitar Bots en formularios Django.

Revisa el oden de los midleware para asegurar que se cambia el CSRF y si es necesario desactiva la cache en esa vista.

Aun asi las caches fuera del servdor son incontrolables, unicamente se puede pedir, sugerir, etc; pero haran lo que les de la gana, incluso el bot podria hacer cache el mismo sin tener que ver el navegador segun como haya sido programado. En la documentación de Django tratan en la seccion sobre la cache el tema de las caches fuera del servidor (o en el Django book, no rcuerdo bien en cual de los dos o si en ambos).

En cualquier caso, si en la vista el CSRF lo cacheas o guardas en la base de datos para comprobar que no lleguen dos iguales en poco tiempo, o cacheas un hash el formulario completo, podrias evitarte que manden dos veces el mismo formulario y Django lo de por valid las dos veces.
__________________
JHG

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:20.