在没有SSL连接的情况下如何防止访问网站?


11

我有一个安装了SSL证书的网站,因此,如果我使用https而不是访问该网站,http则可以使用安全连接进行连接。

但是,我注意到我仍然可以非安全地访问该网站,即。通过使用http代替https

如何防止人们以非安全方式使用网站?

如果我在网站上有目录,例如 samples/,是否可以仅阻止到此目录的非安全连接?

Answers:


12

不幸的是,解决此问题的唯一通用方法是为您的用户提供https://唯一的服务,并确保他们希望仅使用该服务。最终,用户有责任按照他们的期望检查是否正在使用SSL / TLS。

即使该网站仅接受SSL / TLS连接,其他解决方案也容易受到中间人攻击。攻击者可以拦截流量http://example.com(根据用户的请求,即使用户甚至example.com没有在该端口上侦听),并通过建立自己的连接来替代它,并将其https://example.com代理回用户。

因此,存在针对自动重定向的OWASP规则。它已被删除,可能是因为重定向不是减轻风险(特别是针对被动窃听者)的一种不错的方法,但是并不能解决根本问题。

您可以使用多种技术将用户引导到HTTPS站点,并且使用它们并不是一个坏主意(尽管它不会保护他们免受活跃的MITM攻击者的侵害)。

首先,如果您根本不需要在网络服务器上使用纯HTTP服务,请关闭端口80(例如,Listen 80在Apache Httpd的配置中删除)。用户将不得不一直使用https://,这可能很不方便。

其次,在您的Apache Httpd配置部分中的特定路径(LocationDirectory)中,使用SSLRequireSSL指令:它将要求使用SSL / TLS(即使您实际上已在备用端口上对其进行了配置)。其他Web服务器可能具有类似的指令。

第三,您可以mod_rewrite在代码中使用或在其中使用重定向(如果是应用程序)。对于特定的位置,应该执行类似的操作(请参见HTTPS特殊变量;您也可以使用302,但是如果要使其更永久,则使用301更好):

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(samples/.*)$ https://example.com/$1 [R=301,L]

更重要的是,确保所有指向该安全部分的链接都使用https://永远不要依靠自动重定向为您完成这项工作。因此,我建议在开发阶段完全不要使用它

但是,我注意到我仍然可以非安全地访问该网站,即。通过使用http代替https

这也听起来像你正在使用两个相同的配置httphttps。如果您使用的是Apache Httpd,我建议将配置分为两个不同的VirtualHosts:一个用于端口80,一个用于端口443。它们不必具有完全相同的配置:只是不要只使用HTTPS在HTTP虚拟主机中。


缓解上述问题的一种方法是对支持它的浏览器使用HTTP Strict Transport Security(据我所知,它适用于整个主机)。如果https://没有重定向就没有使用,那么第一个连接可能仍然会暴露,但是有可能已经预载了一些站点列表, https://无论如何它们都已启用(并已启用HSTS)。


好信息,gmail如何做到这一点?-从事物的外观来看,它们强制使用https。
toomanyairmiles 2012年

3
他们使用重定向。只要您如用户期望的那样,此方法就可以很好地工作https://mail.google.com。如果作为用户,您看到它可以使用http://mail.google.com,则可能是一个MITM将请求代理到authenticate https://mail.google.com。不幸的是,如果用户自己不检查,Gmail对此将无能为力。与现实生活中的原则相同:如果爱丽丝想与鲍勃交谈,但与查克(声称是鲍勃)交谈而没有验证ID,鲍勃将不知道这次对话,也将无法做关于它的任何事情。这是爱丽丝的责任。
布鲁诺

我已经看到一些PHP脚本,它将验证是否与HTTPS连接,如果不使用SSL则将重定向到HTTPS地址。当然,除非您现在正在构建网站,否则这绝非易事。
匿名企鹅

@AnnonomusPerson,这是完全相同的原理,这就是从HTTP到HTTPS的重写规则。无论您是以编程方式还是通过配置进行操作,都没有关系,它仍然是带有纯HTTP中初始请求的重定向,这也存在相同的问题。
布鲁诺

3

您所需要做的就是将HTTP流量重定向到https- 请参阅本文“将HTTP重定向到https Apache安全连接–强制HTTPS连接”

对于子目录,请将其放置在目录本身的htaccess文件中。

RewriteEngine on
RewriteCondition %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://www.maindomain.com/directory/$1 [R=301,L] 

您能否仅在某些子目录中执行此操作?
CJ7'4

@CraigJ对不起,错过了子目录部分,答案已更新。
toomanyairmiles 2012年

3
尽管这样做可以稍微降低风险,但对活动的MITM攻击者却无效。
布鲁诺

0

实际上,除了使站点具有MITM,snooper和PEBKAC防护所需的步骤外,实际上还可以通过HTTPS强制访问。这不应该是用户的责任,这是行不通的。鼓励您的用户改用安全的浏览器。

强制HTTPS是通过HSTS(HTTP Strict-Transport-Security)完成的。用户首次通过HTTPS(在所有支持的浏览器上;IE缺乏此功能)访问您的网站后,基本HSTS是安全的。 预加载的HSTS始终是安全的,并且涵盖了现代快速发布的浏览器(铬及其衍生版本,Firefox)。

有关HTTP安全性的更完整概述(寻址URL,重定向,Cookie和混合内容),请参阅此HTTPS迁移方法。HSTS是逐步迁移的最后一步。如果您的网站是全新的,则实际上不需要遵循该顺序。

相关标准:安全cookie(如果cookie的生存期比HSTS标头长,则很重要),HttpOnly cookie(在保护cookie的同时),HPKP(适用于现代浏览器和更灵活的攻击者)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.