web-dev-qa-db-fra.com

Que fait force_ssl dans Rails?

Dans une précédente question , j'ai découvert que je devais configurer nginx une terminaison ssl et ne pas avoir Rails traiter les données chiffrées.

Alors pourquoi existe-t-il?

config.force_ssl = true

Je vois ceci commenté dans le fichier de configuration de production. Mais si on s’attend à ce que nginx gère tout le matériel ssl de sorte que mon Rails ne traite pas les données cryptées, qu’est-ce que config.force_ssl = true faire?

Devrais-je laisser le commentaire en production si je sais que je vais toujours utiliser nginx?

77
user782220

Cela ne ne fait pas que forcer votre navigateur à rediriger HTTP vers HTTPS. Il configure également vos cookies pour qu'ils soient marqués "sécurisés", et permet HSTS , qui constituent chacun une très bonne protection contre la suppression de SSL.

Même si HTTPS protège votre application contre " https://example.com/yourapp " "contre les attaques MITM, si quelqu'un se met entre votre client et votre serveur, il peut facilement vous faire visiter" http://example.com/yourapp ". Avec aucune des protections ci-dessus, votre navigateur enverra volontiers le cookie de session à la personne qui effectue le MITM.

72
Dan Jameson

Réglage config.force_ssl comprend ActionDispatch::SSL. Le ActionDispatch::SSL La documentation décrit la fonctionnalité comme suit (soulignement ajouté pour plus de clarté):

Voir les includes here et la documentation pour ActionDispatch :: SSL here .

DOCS

Ce middleware est ajouté à la pile lorsque config.force_ssl = true, et les options définies dans config.ssl_options. Il effectue trois tâches pour appliquer des requêtes HTTP sécurisées:

  1. Redirection TLS: redirige en permanence les requêtes http: // vers https: // avec les mêmes URL Hôte, chemin, etc. Activé par défaut. Ensemble config.ssl_options pour modifier l’URL de destination (par exemple, redirect: { Host: "secure.widgets.com", port: 8080 }), ou définissez redirect: false pour désactiver cette fonctionnalité.

  2. Cookies sécurisés: Définit l'indicateur secure sur les cookies pour indiquer aux navigateurs qu'ils ne doivent pas être envoyés avec les requêtes http: //. Activé par défaut. Ensemble config.ssl_options avec secure_cookies: false pour désactiver cette fonctionnalité.

  3. HSTS (HTTP Strict Transport Security): indique au navigateur de se rappeler que ce site ne contient que du protocole TLS et de rediriger automatiquement les requêtes non-TLS . Activé par défaut. Configurer config.ssl_options avec hsts: false pour désactiver. Ensemble config.ssl_options avec hsts: { … } pour configurer HSTS:

    • expires: Combien de temps ces paramètres seront-ils conservés, en secondes? La valeur par défaut est 180.days (conseillé). Le minimum requis pour bénéficier des listes de préchargement du navigateur est de 18.weeks.
    • subdomains: défini sur true pour indiquer au navigateur d'appliquer ces paramètres à tous les sous-domaines. Cela protège vos cookies de l'interception par un site vulnérable sur un sous-domaine. La valeur par défaut est true.
    • preload: Annoncez que ce site peut être inclus dans les listes HSTS préchargées des navigateurs. HSTS protège votre site à chaque visite sauf la première visite puisqu'il n'a pas encore vu votre en-tête HSTS. Pour combler cette lacune, les éditeurs de navigateurs incluent une liste incorporée de sites compatibles HSTS. Allez à https://hstspreload.appspot.com pour soumettre votre site à l'inclusion. Pour désactiver HSTS, omettre l'en-tête ne suffit pas. Les navigateurs se souviendront de la directive HSTS originale jusqu'à son expiration. À la place, utilisez l'en-tête pour indiquer aux navigateurs d'expiration immédiate de HSTS. Réglage hsts: false est un raccourci pour hsts: { expires: 0 }.

Les demandes peuvent refuser la redirection avec exclude:

config.ssl_options = { redirect: { exclude: -> request { request.path =~ /healthcheck/ } } }
49
steel

Ce paramètre force HTTPS en redirigeant les demandes HTTP vers leurs homologues HTTPS. Donc, un navigateur visitant http://domain.com/path sera redirigé vers https://domain.com/path.

Laisser les paramètres commentés autoriserait les deux protocoles.

Vous devez toujours configurer votre serveur Web pour gérer les demandes HTTPS.

10
Stefan

Il force le cryptage de toutes les communications avec le serveur et l’utilisation de SSL, c’est-à-dire via HTTPS.

Lorsque vous l'incluez dans un contrôleur, ce dernier accepte uniquement les demandes HTTPS.

Liens utiles:

  1. http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html
  2. http://rubydoc.info/docs/Rails/ActionController/ForceSSL
  3. http://railscasts.com/episodes/270-authentication-in-Rails-3-1?view=comments
3
Richard Jordan