Como impedir o acesso ao site sem conexão SSL?

11

Eu tenho um site que possui um certificado SSL instalado; portanto, se eu acessar o site usando em httpsvez de http, poderei conectar-me usando uma conexão segura.

No entanto, notei que ainda posso acessar o site de forma não segura, ou seja. usando em httpvez de https.

Como impedir que as pessoas usem o site de maneira não segura?

Se eu tiver um diretório no site, por exemplo. samples/, posso impedir conexões não seguras com apenas esse diretório?

CJ7
fonte

Respostas:

12

Infelizmente, a única solução geral para esse problema é oferecer aos usuários o https://único e garantir que eles esperem usá-lo apenas. Em última análise, é responsabilidade do usuário verificar se está usando SSL / TLS, conforme o esperado.

Outras soluções são vulneráveis ​​a ataques do tipo intermediário, mesmo que o site aceite apenas conexões SSL / TLS. Os invasores podem interceptar o tráfego http://example.com(conforme solicitado pelo usuário, mesmo que example.comnão esteja escutando nessa porta) e substituí-lo fazendo sua própria conexão https://example.com, fazendo o proxy de volta para o usuário.

Havia uma regra do OWASP contra redirecionamentos automáticos por causa disso. Foi removido, provavelmente porque os redirecionamentos não são uma maneira ruim de atenuar o risco (especialmente contra bisbilhoteiros passivos), mas não resolvem o problema fundamental.

Existem várias técnicas que você pode usar para guiar o usuário ao site HTTPS, e não é uma má idéia usá-las (embora não as proteja contra invasores ativos do MITM).

Primeiramente, se você não possui nada que deva ser servido em HTTP simples no servidor da Web, desative a porta 80 (por exemplo, remova Listen 80na configuração do Apache Httpd). Os usuários terão que usar o https://tempo todo, o que pode ser inconveniente.

Em segundo lugar, na seção de configuração do Apache Httpd para um caminho específico ( Locationou Directory), use a SSLRequireSSLdiretiva : exigirá o uso de SSL / TLS (mesmo que você tenha configurado de fato uma porta alternativa). Outros servidores da web provavelmente têm diretivas semelhantes.

Em terceiro lugar, você pode usar um redirecionamento, usando mod_rewriteou dentro do seu código (se for um aplicativo). Algo assim deve ser feito, para um local específico ( consulte a HTTPSvariável especial ; você também pode usar o 302, mas o 301 é melhor se for para ser mais permanente):

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

Mais importante, verifique se todos os links para essa seção segura são usados https://. Nunca confie no redirecionamento automático para fazer o trabalho por você. Por esse motivo, eu recomendo não usá-lo durante a fase de desenvolvimento .

No entanto, notei que ainda posso acessar o site de forma não segura, ou seja. usando em httpvez de https.

Isso também parece que você está usando a mesma configuração para ambos httpe https. Se você estiver usando o Apache Httpd, sugiro dividir a configuração em dois VirtualHosts distintos : um para a porta 80 e outro para a porta 443. Eles não precisam ter exatamente a mesma configuração: apenas não coloque apenas o HTTPS no host virtual HTTP.


Uma maneira de atenuar os problemas mencionados acima é usar o HTTP Strict Transport Security , para navegadores que o suportam (ele se aplica a todo o host, tanto quanto eu sei). A primeira conexão ainda pode ser exposta se https://não for usada sem o redirecionamento, mas é possível ter uma lista pré-carregada de sites esperando de https:// qualquer maneira (e ativada para HSTS).

Bruno
fonte
Boas informações, como o Gmail faz isso? - pela aparência das coisas que forçam https.
toomanyairmiles
3
Eles usam um redirecionamento. Isso funciona bem, desde que você, como o usuário espera que seja https://mail.google.com. Se, como usuário, você vê que ele funciona http://mail.google.com, provavelmente existe um MITM proxyizando as solicitações ao original https://mail.google.com. Infelizmente, o Gmail não pode fazer muito sobre isso se os próprios usuários não verificarem. Mesmo princípio que na vida real: se Alice quiser conversar com Bob, mas conversar com Chuck (que afirma ser Bob) sem verificar o ID, Bob não saberá sobre essa conversa e não poderá fazer isso. nada sobre isso. É responsabilidade de Alice.
de Bruno
Eu já vi alguns scripts PHP em torno do qual ele verificará se está conectado ao HTTPS e redirecionará se não estiver usando SSL para um endereço HTTPS. Obviamente, essa não é uma tarefa fácil, a menos que você esteja construindo seu site agora.
Anonymous Penguin
@AnnonomusPerson, é exatamente o mesmo princípio e é o que a regra de reescrita de HTTP para HTTPS faz. Se você faz isso programaticamente ou por configuração, não importa, ainda é um redirecionamento com uma solicitação inicial em HTTP simples, que apresenta o mesmo problema.
253 Bruno
3

Tudo o que você precisa é redirecionar o tráfego http para https - consulte este artigo 'Redirecionar http para https conexão segura Apache - forçar conexões HTTPS' .

Para um subdiretório, coloque-o em um arquivo htaccess no próprio diretório.

RewriteEngine on
RewriteCondition %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://www.maindomain.com/directory/$1 [R=301,L] 
toomanyairmiles
fonte
Você pode fazer isso acontecer apenas para determinados subdiretórios?
CJ7
@ CraigJ desculpe, perdi a parte do subdiretório, resposta atualizada.
toomanyairmiles
3
Embora isso reduz ligeiramente os riscos, isso não funciona contra atacantes ativos do MITM.
de Bruno
0

Forçar o acesso através de HTTPS é de fato possível, além de ser uma etapa necessária para tornar seu site à prova de MITM, bisbilhoteiro e PEBKAC. Não deve ser de responsabilidade do usuário, isso não funciona . Incentive seus usuários a usar navegadores seguros.

Forçar HTTPS é feito através do HSTS ( HTTP Strict-Transport-Security ). O HSTS básico é seguro após a primeira vez que o usuário acessa seu site por HTTPS (em todos os navegadores de suporte; o IE não possui a capacidade ). O HSTS pré-carregado é sempre seguro e abrange os navegadores modernos de lançamento rápido (Chromium e derivados, Firefox).

Para uma visão geral mais completa da segurança HTTP (endereçamento de URLs, redirecionamentos, cookies e conteúdo misto), consulte este tutorial sobre migração de HTTPS . O HSTS é o último passo em uma migração progressiva. Você realmente não precisa seguir a ordem se o seu site é novo em folha.

Padrões relacionados: cookies seguros (importantes se seus cookies durarem mais que o cabeçalho HSTS), cookies HttpOnly (enquanto você protege seus cookies), HPKP (para navegadores modernos e atacantes mais engenhosos).

Tobu
fonte