Как заблокировать пользователей, которые вводят неправильный пароль три раза за python django - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь написать страницу входа в систему, которая заблокирует пользователя, введя неправильный пароль три раза, и имя пользователя будет go в черном списке, так что оно будет заблокировано. Страница входа работает хорошо, и черный список работает хорошо. Одна проблема заключается в том, что l oop не работает, у меня вначале было while count < 3, но он дает пользователю только один шанс ввести пароль, затем я переписываю код в формате if ... elif..., чтобы проверить, что идет не так. Я обнаружил, что он застрял на «1 имя пользователя или пароль неверен 1», что означает, что он переходит только к первому, если и счет всегда равен 1, что означает, что счетчик каждый раз возвращается на 0.

Я думаю, что потому что после того, как пользователь нажимает кнопку входа в систему, страница обновляется sh и снова делает счет 0, поэтому как мне решить эту проблему?

@unauthenticated_user

def loginPage(request):

if request.method == "POST":
    username = request.POST.get('username')  # Get username input first
    password = request.POST.get('password')
    user = authenticate(request, username=username, password=password)
    BL = BlackList.objects.values_list('list', flat=True)  # Read all data into array
    if username in BL:  # Check if the username is in blacklist
        messages.info(request, 'Username in black list, please contact admin')
    else:  # Not in black list username can go to login
        count = 0
        if count == 0:  # User can try 3 times for each login in
            if user is not None:
                login(request, user)
                return redirect('home')
            else:
                count += 1
                messages.info(request, '1 Username or Password is incorrect' + str(count))

        elif count == 1:
            messages.info(request, 'testest' + str(count))
            request.method == "POST"
            username = request.POST.get('username')  # Get username input first
            password = request.POST.get('password')
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('home')
            else:
                count += 1
                messages.info(request, '2 Username or Password is incorrect' + str(count))
        elif count == 2:
            request.method == "POST"
            username = request.POST.get('username')  # Get username input first
            password = request.POST.get('password')
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('home')
            else:
                count += 1
                messages.info(request, '3 Username or Password is incorrect' + str(count))

        else:  # 3 times fail the username will go to the black list
            BlackList.objects.create(list=username)
            # Put the username in to BlackList
            messages.info(request, 'Username in black list, please contact admin')

context = {}
return render(request, 'accounts/login.html', context)

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Если ваш черный список не сохранен в базе данных или текстовом файле на сервере, пользователь сможет обойти вашу линию защиты, обновив Интернет. Следовательно, вы должны хранить свой черный список вне среды выполнения.

Самый эффективный способ сделать это - создать простой текстовый файл, в котором сохраняются имена пользователей из черного списка, и этот файл будет храниться на сервере. Это также препятствует тому, чтобы это имя пользователя входило в систему с другого устройства.

Попробуйте заменить свой код этим.

if request.method == "POST":
    username = request.POST.get('username')  # Get username input first
    password = request.POST.get('password')
    user = authenticate(request, username=username, password=password)
            
    with open("blacklist.txt", "a") as BlackL:
        pass


    with open("blacklist.txt") as BlackL:
        for BL in Black:
            if username == BL: #This one checks if username in blacklist
                return "User name in blacklist, contact admin."
    
            else:  # Not in black list username can go to login
                count = 0
                if count == 0:  # User can try 3 times for each login in
                    if user is not None:
                        login(request, user)
                        return redirect('home')
                    else:
                        count += 1
                        messages.info(request, '1 Username or Password is incorrect' + str(count))

                elif count == 1:
                    messages.info(request, 'testest' + str(count))
                    request.method == "POST"
                    username = request.POST.get('username')  # Get username input first
                    password = request.POST.get('password')
                    user = authenticate(request, username=username, password=password)
                    if user is not None:
                        login(request, user)
                        return redirect('home')
                    else:
                        count += 1
                        messages.info(request, '2 Username or Password is incorrect' + str(count))
                else count == 2:
                    request.method == "POST"
                    username = request.POST.get('username')  # Get username input first
                    password = request.POST.get('password')
                 user = authenticate(request, username=username, password=password)
                    if user is not None:
                        login(request, user)
                        return redirect('home')
                    else:
                        count += 1
                        with open("blacklist.txt", "a") as BlackL:
                            print(username, file=BlackL)
                        return "User name in blacklist, contact admin."


context = {}
return render(request, 'accounts/login.html', context)

Я не смог запустить код на моем компьютере, но я полагаю, что вы можете отладить его самостоятельно, если есть какие-либо ошибки.

0 голосов
/ 12 июля 2020

Вы можете сохранить количество в сеансе.

if request.session.get('count', 0) == 0:
   request.session['count'] = 1
else:
   request.session['count'] += 1

   if request.session['count'] == 3:
       pass       # ban him
...