11
votes

Comment forcer l'utilisation de SSL pour une URL de mon application Django?

Je veux être sûr que pour une URL de mon site Web, SSL sera utile. J'ai déjà vu beaucoup de réponse déjà.

Force rediriger vers SSL pour toutes les pages à part de un

donc je pense que je vais utiliser mod_rewrite .

Ma question est plus sur la façon de configurer l'hôte virtuel pour exécuter mon DJANGO Application sur http et sur https sans problèmes. J'utilise wsgi .

est-ce un problème pour simplement dupliquer la configuration sur *: 443 et sur *: 80 ? Que dois-je faire pour avoir la meilleure configuration?


3 commentaires

Je vous suggère de trouver la réponse sur serverfault.com.


Ok voilà, nous allons: ServerFault.com/Questtions/73257/...


Peut-être que ceci est associé: effabot.org/zone/django-multihost.htm


4 Réponses :


10
votes

En plus d'utiliser mod_rewrite, vous pouvez également utiliser Django pour contrôler les redirections SSL.

Voici une version modifiée d'un middleware à partir du Projet Satchmo . J'ai tendance à aimer cette méthode mieux que mod_rewrite car il est plus facile de gérer. P>

Pour l'utiliser, passez 'SSL': true dans votre URL Conf: p>

    from django.conf import settings
    from django.http import HttpResponseRedirect, get_host

    SSL = 'SSL'

    def request_is_secure(request):
        if request.is_secure():
            return True

        # Handle forwarded SSL (used at Webfaction)
        if 'HTTP_X_FORWARDED_SSL' in request.META:
            return request.META['HTTP_X_FORWARDED_SSL'] == 'on'

        if 'HTTP_X_SSL_REQUEST' in request.META:
            return request.META['HTTP_X_SSL_REQUEST'] == '1'

        return False

    class SSLRedirect:
        def process_request(self, request):
            if request_is_secure(request):
                request.IS_SECURE=True
            return None

        def process_view(self, request, view_func, view_args, view_kwargs):          
            if SSL in view_kwargs:
                secure = view_kwargs[SSL]
                del view_kwargs[SSL]
            else:
                secure = False

            if settings.DEBUG:
                return None

            if getattr(settings, "TESTMODE", False):
                return None

            if not secure == request_is_secure(request):
                return self._redirect(request, secure)

        def _redirect(self, request, secure):
            if settings.DEBUG and request.method == 'POST':
                raise RuntimeError(
                """Django can't perform a SSL redirect while maintaining POST data.
                    Please structure your views so that redirects only occur during GETs.""")

            protocol = secure and "https" or "http"

            newurl = "%s://%s%s" % (protocol,get_host(request),request.get_full_path())

            return HttpResponseRedirect(newurl)


6 commentaires

Ceci est utile aussi. Assurez-vous qu'il s'agit d'une connexion SSL. Pensez-vous qu'il est préférable de le gérer avec Django. Ou avec mod_rewrite?


Comme je l'ai mentionné, j'ai tendance à aimer le gérer à Django, car il est plus facile de voir quelles URL sont sécurisées via SSL. Si vous devez sécuriser une URL, mettez simplement à jour le fichier URLS.PY et vous avez terminé. Pas de règles Mod_rewrite non en désordre (puissant, Messier).


Je crois que le code ci-dessus manque la ligne finale de la fonction _redirect () ... La ligne finale de cette fonction doit être retour httpresponseredirect (newurl)


Je l'ai placé dans mon répertoire racine de projet dans un fichier appelé ssl_redirect.py et in paramètres.py Ajout d'une ligne sur middleware_classes pour 'ssl_redirect.ssLredirect' . Notez également que, dans Django 1.5, vous devez modifier l'appel get_host vers demande.get_host () et supprimer l'importation get_host en haut, ou vous obtiendrez une erreur sur Important get_host.


Ce code fait confiance aux en-têtes fournis par l'utilisateur, qui est insécurisé sauf si vous êtes derrière un proxy qui lance des en-têtes inattendus. Vous devriez simplement vérifier .is_secure et configurer secury_proxy_ssl_header de manière appropriée pour votre configuration.


Si vous utilisez Django et mettez uniquement des URL en tant que HTTPS, les données telles que votre session peuvent être divulguées. De plus, si vous le gérez par Django, vous devez utiliser le même décorateur partout et n'oubliez pas de l'utiliser lorsque vous créez une nouvelle vue. C'est beaucoup plus facile et plus sûr d'utiliser Apache / Nginx.



0
votes

Nous avons utilisé des middleware simples pour vérifier les URL sur une liste des URL de base que doivent être en mode HTTPS, tous les autres sont forcés au mode HTTP. La grande mise en garde ici est que toutes les données postes peuvent être perdues à moins que vous ne preniez pas de soin supplémentaire (cela n'avait pas d'importance dans notre cas). Nous faisions cela sur des pages de jointure qui nécessitaient des numéros de carte de crédit, ainsi que de la sorte dès qu'ils étaient dans ce pipeline, nous les avons forcés dans HTTPS.


0 commentaires

11
votes

Si par WSGI, vous voulez réellement dire Apache / Mod_WSGI, alors que les applications WSGI montées sont normalement exécutées dans leurs propres sous-interprètes, la division 80/443 est un cas particulier et même si dans différents virtualhost tant que le point de montage pour WSGIScriptalias, et le nom de serveur est identique, ils seront fusionnés. XXX

Cela se produira également pour le mode Daemon, mais avec le mode Daemon, vous devez définir uniquement un seul groupe de processus Daemon dans la première définition VirtualHost et ensuite simplement se référer à celui des deux avec wsgiprocessgroup. xxx

Le WSGIPROCESSGROUP ne peut toucher que sur ce VirtualHost pour le même nom de serveur.

Django fournit un IS_SECURE () Méthode de détermination Lorsque la demande est venue via HTTPS qui dérive de la variable WSGI avec demande appelée 'wsgi.url_scheme' qui est défini par mod_wsgi.

Donc, vous auriez un seul fichier de script et des paramètres Django WSGI. déposer. Vous avez juste besoin de dupliquer le montage d'applications comme DecSribé dans la configuration Apache / Mod_WSGI.


0 commentaires

3
votes

Voici un décorateur de vue que vous pouvez appliquer aux vues qui devraient avoir https. xxx


0 commentaires