Этот вопрос касается стандарта UserCreationForm в Django и способа хранения, извлечения и использования паролей через request object. В частности, тот факт, что я, кажется, могу печатать сырые пароли через print(request.POST). Содержимое файла будет предоставлено в конце этого поста.

Я создал страницу регистрации. Я настроил очень простой class-based view, который аутентифицирует и регистрирует вновь созданного пользователя. Фактически HTML этой страницы отображается автоматически в этом случае, через {{ form.as_p }}, где форма является экземпляром из UserCreationForm.

Почему, когда я выполняю print (request.POST), я получаю что-то вроде этого:

<QueryDict: {'csrfmiddlewaretoken': ['keeping_this_private'], 'username': ['William'], 'password1': ['ACTUALPASSWORD'], 'password2': ['ACTUALPASSWORD'], 'button': ['']}>

Это действительно безопасно? Поскольку я программировал всего пару месяцев, я все еще учусь.

< Сильный > Views.py :

class RegisterView(View):
    def get(self, request):
        form = UserCreationForm()
        return render(request, 'authentication/registration.html', {'form': form})

    def post(self, request):
        form = UserCreationForm(request.POST)
        if form.is_valid():
            print(request.POST)
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('home')

        else:
            return render(request, 'authentication/registration.html', {'form': form})

< Сильный > Registration.html

{% extends 'base.html' %}

{% block body %}
<body class="text-center">
  <form method="post">
    {% csrf_token %}

    {{ form.as_p }}
    <button type="submit" name="button"></button>

  </form>
</body>
{% endblock %}

< Сильный > Urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^register/$', RegisterView.as_view(), name='register'),
    ...
3
William Karlsson 13 Мар 2018 в 13:44

2 ответа

Лучший ответ

Да, это абсолютно ожидаемо. Когда пользователь отправляет пароль в форме, он представляется как есть (ясно). Другого выбора нет, вам нужен четкий пароль, чтобы проверить его действительность. Однако передача данных POST должна быть защищена протоколом HTTPS.

У вас может возникнуть желание хэшировать его на стороне клиента перед отправкой на ваш сервер. Однако это вовсе не повышает безопасность, так как в этом случае хешированная версия пароля становится действительным паролем. Это общее ложное чувство безопасности.

Я приглашаю вас прочитать это сообщение на security.stackexchange, чтобы узнать подробности.

5
Antoine Pinsard 13 Мар 2018 в 11:03

Это хороший вопрос, особенно от новичка в программировании. Дело в том, что это, в основном, совершенно небезопасно - но неизбежно. Передача хешированного пароля на самом деле была бы столь же небезопасной, поскольку любой (ну, любой, кто может прочитать пакет, по крайней мере) все еще мог прочитать содержимое сообщения, и вам необходимо отправить пароль от клиента пользователя на ваш сервер так или иначе , Обратите внимание, что у вас будет та же проблема с любой конфиденциальной информацией, а не только с паролями.

Решение здесь - использовать https вместо http, чтобы тело запроса было зашифровано. Это все еще не на 100% безопасно и надежно (на самом деле нет ничего безопасного и надежного на 100%), но грубая силовая атака потребует либо слишком много ресурсов, либо слишком много времени.

3
bruno desthuilliers 13 Мар 2018 в 11:05