DjangoCMS: отключить логин через http, force https

Наш сайт DjangoCMS доступен через http и https.

Анонимное использование через http в порядке. Но я хочу отключить логины через http.

Есть ли способ принудительно использовать https, как только пользователь хочет войти в систему?

Даже страница входа (с полями имени пользователя и пароля) не должна быть доступна через http.

Фон: я не хочу, чтобы пароль проходил по незашифрованному проводу.

Обновление: сайт размещается на веб-сервере apache.

Ответы

Ответ 1

Как я уже упоминал в комментариях, я настоятельно рекомендую вам НЕ обслуживать страницу входа через https.

Это просто скрывает тот факт, что, например, информация о сеансе и данные аутентификации по-прежнему передаются по другим запросам, незашифрованным с помощью http. Ваш сайт не будет безопасным вообще.

Ты просто псевдонебезопасный материал, поэтому он причудливо смотрит в глаза. Это просто как с паролем 12345.

Поэтому, пожалуйста, откройте свой веб-сайт через https для пользователя. Небольшой путеводитель для nginx или apache2 о том, как перенаправить трафик от http до https, можно найти здесь:

Ответ 2

Как вы уже приняли в комментариях, нажатие всего трафика на HTTPS является лучшим решением в наши дни. Если вы только аутентифицируете через SSL, вам нужно будет рассмотреть шифрование/безопасность во всем, что вы пишете, двигаясь вперед, а не просто по умолчанию.

Итак, в конфигурации вашего сервера принудительно весь трафик до порта 443. Предполагая, что вы используете apache, вы это сделаете;

 <VirtualHost *:80>
     ServerName www.example.com
     Redirect / https://www.example.com/
 </VirtualHost>

 <VirtualHost *:443>
     ServerName www.example.com
     # ... SSL configuration goes here
 </VirtualHost>

Затем в настройках Django включите безопасные файлы cookie;

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

В качестве примечания стороны Django имеет параметр перенаправления HTTP-трафика на HTTPS, который является SECURE_SSL_REDIRECT, но если вы делаете это на уровне apache/nginx, вам не нужно беспокоиться. Для дальнейшего ознакомления с SSL/HTTPS смотрите здесь; https://docs.djangoproject.com/en/1.11/topics/security/#ssl-https

Ответ 3

В запросе Django есть is_secure()

Вы можете проверить его в представлении и перенаправить, если он не безопасен:

if not request.is_secure():
    return redirect("https://www.yourdomain.com/login")

Ответ 4

@user1 имеет правильную логику, и вы должны обслуживать свой сайт через https, чтобы обеспечить его безопасность.
Но чтобы ответить на ваш точный вопрос:

Как показано здесь: Как узнать, используя Django, если сервер защищен (использует https), и, как упоминает @Zartch в своем ответе, вы должны использовать is_secure() Метод HTTPRequest для проверки того, идет ли ваш запрос через https.

  • Чтобы использовать is_secure(), вам необходимо проверить входящий запрос на ваши взгляды:

    def my_login_view(request):
        if request.is_secure():
            Do loggin
        else:
            Don't login
    
  • Теперь вы можете защитить свои другие представления с помощью login_required decorator:

    @login_required(login_url='/your/login/url')
    def protected_view(request):
        ...
    

Личное предложение: я использую Django Rest Framework, и я бы предложил его в вашем случае, поскольку он имеет isAuthenticatedOrReadOnly класс разрешений, который вам понравится:

class MyLoginView(ObtainAuthToken):
    """
    Login view for token-based authentication
    """
    def post(self, request, *args, **kwargs):
        if request.is_secure():
            super().post(request, *args, **kwargs)
        else:
            Probably some redirect goes here...

Затем в любом другом представлении или представлении на основе класса:

class MyOtherView(generics.GenericAPIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    ...

Вышеприведенное будет гарантировать, что ваши пользователи могут войти только через https, и если они не вошли в систему, они будут видеть только просмотр только для чтения.

Попробуйте, если хотите.

Ответ 5

Вы еще не приняли ответ, поэтому я подумал, что ответы могут не соответствовать вашему вопросу достаточно хорошо.

Анонимное использование через http в порядке. Но я хочу отключить логины через http.

Как я понимаю, у вас есть следующий прецедент:

Кто-то посещает ваш сайт как анонимный пользователь, используемый протокол - http. Этот человек открывает форму входа и регистрируется, форма отправляется через https. Зарегистрированный пользователь продолжает просматривать ваш сайт через https.

Если форма входа направляется в защищенную версию, ваш пользователь продолжит просмотр вашего сайта в режиме https (пока все другие ссылки не зависят от используемого протокола).

<form action="https://your.domain/path/to/login/" method="post">

Если приложение, которое вы используете для аутентификации пользователей, написано правильно, вы можете настроить settings.LOGIN_URL, иначе вы, вероятно, необходимо сделать это в форме шаблона.

Я рекомендую отправлять файлы cookie сеанса только через https, используя settings.SESSION_COOKIE_SECURE. С помощью этого параметра пользователь все равно сможет обрабатывать HTTP-запросы, но cookie сеанса не будет отправлен (и пользователь будет рассматриваться как анонимный пользователь).

Пожалуйста, убедитесь, что ваше имя входа принимает только безопасные почтовые запросы (иначе пользователь может отправить пароль через протокол без https). Это может быть достигнуто либо в коде Django (например, Джон Мутафис предлагает с его MyLoginView), либо на уровне производственного сервера, отклонив не-https post-запросы для URL-адреса входа.

-

Не могли бы вы предоставить доступ к репозиторию с кодом?

Ответ 6

Вы можете использовать один или несколько комбинаций из: