2010-06-10 26 views
5

Estoy tratando de obtener un formulario de acceso que tengo en django para permitir solo tres intentos de inicio de sesión antes de redirigir a una página de "ayuda para el inicio de sesión". Actualmente estoy usando la vista "django.contrib.auth.views.login" incorporada con una plantilla personalizada. ¿Cómo lo obligo a redirigir a otra página después de n intentos fallidos de inicio de sesión?Cómo limito la cantidad de intentos de inicio de sesión en Django

Respuesta

-8

Puede guardar una sesión si el usuario no ha podido iniciar sesión.

request.SESSION['login_tries'] = 1 

y si no logran conectarse de nuevo

request.SESSioN['login_tries'] = 2 

Si la sesión se hace igual a la cantidad de inicio de sesión intenta usted quiere que aunque tienen, a continuación, hacer algo.

+8

La sesión sólo existirá si el cliente está enviando encabezados de las cookies, que un atacante fuerza bruta no va a hacer. Sería mejor vincular los intentos de inicio de sesión con una cuenta de usuario específica, o un cliente específico (o ambos). –

10

En realidad, existe un proyecto que proporciona un middleware de Django para hacer esto, llamado django-axes. Simplemente instálelo con las instrucciones provistas y luego configure AXES_LOGIN_FAILURE_LIMIT con la cantidad de intentos de inicio de sesión que desee antes de crear un registro para los inicios de sesión fallidos. Sin embargo, aún tendrá que verificar este registro cuando quiera bloquear a alguien.

+0

Gracias Daniel. Escogí la respuesta de dotty porque estaba más cerca del método que terminé usando. Parte del problema era mi propia inexperiencia con Python y Django y, como tal, no tenía los conocimientos suficientes para formular la pregunta correcta. Creo que tu respuesta hubiera sido igual de buena o incluso mejor si hubiera deseado algo con tantas características, y es posible que termine usándolo cuando esté más familiarizado con el framework. –

+1

No se preocupe, solo quería hacerle saber que ya había una solución que potencialmente podría funcionar. ¡Yo tampoco sabía que existía, así que aprendí algo en el proceso también! –

0

yo uso django-brake y memcached

@ratelimit(field='email', method='POST', rate='5/m') 
@ratelimit(field='email', method='POST', rate='10/h') 
@ratelimit(field='email', method='POST', rate='20/d') 
def login_failure(request, login_form): 
    """ 
    Increment cache counters, 403 if over limit. 
    """ 
    was_limited = getattr(request, 'limited', False) 
    if was_limited: 
     limits = getattr(request, 'limits', []) 
     login_form.full_clean() 
     login_form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())\ 
      .append('accout locked, try '+ str(limits[0]['period']) + ' seconds later') 
     return render(request, 'user/login.html', {'form': login_form}) 


def login(request): 

    if request.method == 'GET': 
     next = request.GET.get('next', '') 
     return render(request, 'user/login.html', {'next': next}) 
    elif request.method == 'POST': 
     login_form = LoginForm(request.POST) 

     # check first 
     from brake.utils import get_limits 
     limits = get_limits(request, 'login_failure', 'email', [60, 3600, 86400]) 
     if limits: 
      login_form.full_clean() 
      login_form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())\ 
       .append('accout locked, try '+ str(limits[0]['period']) + ' seconds later') 
      return render(request, 'user/login.html', {'form': login_form}) 

     if login_form.is_valid(): 

       email = login_form.cleaned_data['email'] 
       submit_pwd = login_form.cleaned_data['password'] 

       user = authenticate(username=email, password=submit_pwd) 

       if user is None: 
        # 
        res = login_failure(request, login_form) 
        if res is None: 
         login_form._errors.setdefault(NON_FIELD_ERRORS, ErrorList()).append('password wrong') 
         res = render(request, 'user/login.html', {'form': login_form}) 
        return res 

       ... 
       login etc... 
     else: 

     ... 
Cuestiones relacionadas