Malheureusement, la seule solution générale à ce problème est de donner à vos utilisateurs le https://
seul et de s'assurer qu'ils s'attendent à ne l'utiliser que. Il est en fin de compte de la responsabilité de l'utilisateur de vérifier qu'il utilise SSL / TLS, comme il s'y attend.
D'autres solutions sont vulnérables aux attaques de l'homme du milieu, même si le site Web n'accepte que les connexions SSL / TLS. Les attaquants pourraient intercepter le trafic vers http://example.com
(comme demandé par l'utilisateur, même s'il example.com
n'écoute même pas sur ce port) et le remplacer en établissant leur propre connexion https://example.com
, en le redirigeant par proxy vers l'utilisateur.
Il y avait une règle OWASP contre les redirections automatiques à cause de cela. Il a été supprimé, probablement parce que les redirections ne sont pas un mauvais moyen d'atténuer le risque (en particulier contre les écoutes clandestines passives), mais ne résolvent pas le problème fondamental.
Il existe différentes techniques que vous pouvez utiliser pour guider l'utilisateur vers le site HTTPS, et ce n'est pas une mauvaise idée de les utiliser (bien que cela ne les protège pas contre les attaquants MITM actifs).
Premièrement, si vous n'avez rien du tout qui devrait être servi en simple HTTP sur le serveur Web, désactivez le port 80 (par exemple, supprimez-le Listen 80
dans la configuration d'Apache Httpd). Les utilisateurs devront utiliser https://
à tout moment, ce qui peut être gênant.
Deuxièmement, dans votre section de configuration Apache Httpd pour un chemin particulier (soit Location
ou Directory
), utilisez la SSLRequireSSL
directive : elle nécessitera l'utilisation de SSL / TLS (même si vous l'avez configuré sur un autre port en fait). D'autres serveurs Web ont probablement des directives similaires.
Troisièmement, vous pouvez utiliser une redirection, en utilisant mod_rewrite
ou dans votre code (s'il s'agit d'une application). Quelque chose comme ça devrait faire, pour un emplacement spécifique ( voir la HTTPS
variable spéciale ; vous pouvez également utiliser 302, mais 301 est mieux si cela doit être plus permanent):
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(samples/.*)$ https://example.com/$1 [R=301,L]
Plus important encore, assurez-vous que tous les liens vers cette section sécurisée sont utilisés https://
. Ne comptez jamais sur la redirection automatique pour faire le travail à votre place. Pour cette raison, je recommande de ne pas l'utiliser du tout pendant la phase de développement .
Cependant, j'ai remarqué que je peux toujours accéder au site Web de manière non sécurisée, c'est-à-dire. en utilisant http
au lieu de https
.
Cela semble également que vous utilisez la même configuration pour les deux http
et https
. Si vous utilisez Apache Httpd, je suggérerais de diviser la configuration en deux VirtualHost
s distincts : un pour le port 80 et un pour le port 443. Ils n'ont pas besoin d'avoir exactement la même configuration: ne mettez pas ce qui est uniquement pour HTTPS dans l'hôte virtuel HTTP du tout.
Un moyen d'atténuer les problèmes mentionnés ci-dessus consiste à utiliser HTTP Strict Transport Security , pour les navigateurs qui le prennent en charge (il s'applique à l'ensemble de l'hôte pour autant que je sache). La toute première connexion peut toujours être exposée si elle https://
n'est pas utilisée sans la redirection, mais il est possible d'avoir une liste préchargée de sites attendus de https://
toute façon (et activée pour HSTS).