web-dev-qa-db-fra.com

Section de précharge HSTS sur .htaccess

Ayant récemment déplacé un site vers SSL, j'ai étudié la possibilité d'appliquer le pré-chargement à HSTS. La syntaxe est approuvée et la liste Chrome lui permet d'être OK. Cependant, n'étant pas du tout codeur, un léger problème se pose.

J'ai:

php_value upload_tmp_dir "/tmp"

# Force SSL

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

# Redirect to www
RewriteCond %{HTTP_Host} ^example.com\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L]

# Security header
Header set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

# End Force SSL'

Cela semble OK, mais certains sites sur le web - je ne vais pas encombrer cela avec des citations --- conseiller RewriteCond %{HTTPS} off et d'autres ont RewriteCond %{HTTPS} on

Logiquement, ON semble correct, mais j'ai besoin de savoir ce qui est correct. Ni donner des erreurs.

7
Claverhouse

... conseiller RewriteCond %{HTTPS} off et d'autres ont RewriteCond %{HTTPS} on

Cela n’aurait pas de sens dans le contexte donné, car il s’agit évidemment de contraires (je serais intéressé de voir tous les exemples que vous citez).

Cependant, vous voulez peut-être dire off vs !on? Celles-ci sont équivalentes dans ce contexte. Le préfixe ! annule l'expression régulière, ce qui signifie effectivement et non "activé" (c'est-à-dire qu'il doit être "désactivé").

Ainsi, dans le contexte des directives ci-dessus, où vous testez si HTTPS n'est pas actif, les éléments suivants sont équivalents:

# Does the HTTPS server variable contain "off"?
RewriteCond %{HTTPS} off

# Does the HTTPS server variable not contain "on"?
RewriteCond %{HTTPS} !on

La variable de serveur HTTPS est définie sur "on" ou "off". (Ou bien, cela n'est pas du tout défini - mais cela dépend de votre configuration serveur/SSL et vous l'aurez déjà découverte à ce moment-là.)

Ce que vous utilisez est vraiment juste une question de préférence.


Autres notes sur HSTS et .htaccess

# Redirect to www
RewriteCond %{HTTP_Host} ^example.com\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L]

# Security header
Header set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

(Je suppose que l'extrait .com dans ^example.com\.com n'est qu'une faute de frappe? Ce devrait être juste ^example\.com.)

E=HTTPS - Le réglage de la variable d'environnement HTTPS sur la RewriteRule redirect serait semble être nécessaire pour définir l'en-tête de réponse HTTP Strict-Transport-Security sur la redirection canonique (HTTPS uniquement) non www à www[*1] (c'est-à-dire https://example.com à https://www.example.com), qui est défini de manière conditionnelle en fonction de la vérification env=HTTPS de la directive Header. Toutefois, pour que cet en-tête soit défini sur la redirect , vous devez également utiliser le mot clé always sur la directive Header, comme suit:

Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

Comme indiqué dans Apache docs , concernant l'utilisation de always avec la directive Header lors de la définition d'en-têtes sur des redirections : :

  • Vous ajoutez un en-tête à une réponse sans succès (non 2xx) générée localement, telle qu'une redirection, auquel cas seule la table correspondant à always est utilisée dans la réponse finale.

[*1] Cet en-tête doit être défini sur la redirection afin de satisfaire au point 4.1 de la exigences de soumission de précharge du HSTS :

Si vous diffusez une redirection supplémentaire à partir de votre site HTTPS, cette redirection doit toujours avoir l'en-tête HSTS (plutôt que la page vers laquelle il redirige).


Juste un commentaire supplémentaire sur le article lié dans les commentaires ci-dessous, qui dit:

La variable d'environnement env=HTTPS ne fonctionnait pas comme prévu. J'ai donc utilisé le drapeau E=HTTPS sur la redirection www pour définir la variable d'environnement env=HTTPS à la demande suivante .

Le dernier bit relatif à la définition de "la variable d’environnement env=HTTPS à la demande suivante" n’est pas tout à fait correct. Définir la variable d'environnement HTTPS sur la réponse actuelle (redirection) . Au moment où la "requête suivante" survient (c'est-à-dire que le navigateur a répondu à la redirection), cette variable d'environnement (qui a été définie ci-dessus) est depuis longtemps oubliée. mais cela nécessite l'utilisation du mot clé always sur la directive Header (comme mentionné ci-dessus).


Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

Juste un petit point, et peut-être que ça n'a pas d'importance, mais ... j'inclurais la directive preload à la fin de la liste des directives. Par exemple:

 Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" env=HTTPS

La directive preload ne fait pas partie de la spécification HTTP Strict Transport Security (HSTS) . Il est seulement requis par la liste de préchargement. Les autres agents utilisateurs/navigateurs ne l'utilisent pas et peuvent même ne pas le comprendre. Il serait donc plus logique de le mettre à la fin de la liste. Certaines analyses peuvent s'arrêter dès qu'elles atteignent une directive "invalide"?

3
MrWhite
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Vérifiez si HTTPS N'EST PAS activé

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Vérifiez si HTTPS IS off

RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

Vérifier si la connexion ne fonctionne PAS sur le port sécurisé https 443

Mais tous font la même chose: vérifie s'il n'y a pas de https et redirige vers https.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=10886400; includeSubDomains; preload"
</IfModule>

Vous savez déjà ce que ça fait.

0
Evgeniy