Как включить https на страницах, созданных Django-auth? - PullRequest
8 голосов
/ 05 ноября 2011

Используя приложение Django-auth (Django версия 1.3), я хочу, чтобы моя страница входа в систему перешла на https://mysite.com/login/.В настоящее время я использую:

# urls.py
from django.contrib.auth.views import login
urlpatterns = patterns('', url(r'^login/$', login, name='login-view'),)

# navbar.html
<li id="nav-login"><a href="{% url login-view %}" ><b>Login</b></a></li>

, который хорошо работает, но переходит к http://mysite.com/login/.

Есть ли какой-нибудь способ сообщить Django-auth, какой префикс (https) использовать,когда он меняет имя представления?Я прочитал всю страницу руководства, и не нашел ничего, что покрывает это.Или, может быть, какой-нибудь способ указать тегу url перейти на https?

Или это единственный вариант указать весь URL вручную?Надеюсь, что нет :) И учитывая, насколько мощным был Джанго, я не могу поверить, что у него не было бы такой способности - я, должно быть, упускаю это из виду.:)

Ответы [ 2 ]

10 голосов
/ 20 мая 2012

Установите переменную среды ОС HTTPS на

Вам необходимо включить переменную среды ОС HTTPS на 'on', чтобы django добавлял https к полностью сгенерированным ссылкам (например, как с HttpRedirectRequest s),Если вы используете mod_wsgi, вы можете добавить строку:

os.environ['HTTPS'] = "on"

в ваш wsgi скрипт .Вы можете убедиться в этом, прочитав django/http/__init__.py:

def build_absolute_uri(self, location=None):
    """
    Builds an absolute URI from the location and the variables available in
    this request. If no location is specified, the absolute URI is built on
    ``request.get_full_path()``.
    """
    if not location:
        location = self.get_full_path()
    if not absolute_http_url_re.match(location):
        current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http',
                                     self.get_host(), self.path)
        location = urljoin(current_uri, location)
    return iri_to_uri(location)

def is_secure(self):
    return os.environ.get("HTTPS") == "on"

Защитите свои куки

В settings.py поместите строки

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

и куки будут отправляться только через HTTPS-соединения.Кроме того, вы, вероятно, также хотите SESSION_EXPIRE_AT_BROWSER_CLOSE=True.Обратите внимание, что если вы используете более старые версии django (менее 1.4), настройки для безопасных файлов cookie CSRF отсутствуют.В качестве быстрого исправления вы можете просто обеспечить безопасность файла cookie CSRF, когда файл cookie сеанса является безопасным (SESSION_COOKIE_SECURE=True), путем редактирования django/middleware/csrf.py:

class CsrfViewMiddleware(object):
   ...
   def process_response(self, request, response):
       ...
       response.set_cookie(settings.CSRF_COOKIE_NAME,
            request.META["CSRF_COOKIE"], max_age = 60 * 60 * 24 * 7 * 52,
            domain=settings.CSRF_COOKIE_DOMAIN,
            secure=settings.SESSION_COOKIE_SECURE or None)

Прямые HTTP-запросы к HTTPS на веб-сервере

Далее вам нужно правило перезаписи, которое перенаправляет запросы http на https, например, в nginx

server {
   listen 80;
   rewrite ^(.*) https://$host$1 permanent;
}

Функция reverse Django и теги шаблонов URL возвращают только относительные ссылки;поэтому, если вы находитесь на странице https, ваши ссылки будут держать вас на сайте https.

1 голос
/ 05 ноября 2011

Как видно из других вопросов StackOverflow, вы могли бы реализовать промежуточное ПО , которое бы автоматически перенаправляло страницу входа в защищенную версию.

Если вы действительно серьезно относитесь к безопасности, вам, вероятно, следует перевести весь сайт на SSL. Из EFF Как правильно развернуть HTTPS :

Вы должны обслуживать весь домен приложения через HTTPS. Перенаправьте HTTP-запросы с ответами HTTP 301 или 302 на эквивалентный ресурс HTTPS.

Некоторые операторы сайта предоставляют только страницу входа через HTTPS, исходя из теории, что чувствителен только пароль пользователя. Пользователи этих сайтов уязвимы для пассивной и активной атаки.

...