Como Verificar e Forçar Redirecionamento HTTPS no PHP (Guia de Segurança)

<< Aula anterior | Sumário do Curso | Próxima aula >>



Fala, dev! Tudo sob controle no backend?

Se você já navegou pela internet nos últimos anos, com certeza já se deparou com o navegador gritando: "Este site não é seguro!" ao tentar acessar uma página HTTP comum. No mundo atual, não ter um cadeado verde (ou ícone de segurança) no seu site é praticamente assinar a sentença de morte para o seu tráfego e credibilidade.

Hoje vamos entender como o PHP lida com esse protocolo e como você pode escrever códigos para identificar e proteger o acesso dos seus usuários.



O que é HTTP vs HTTPS e por que o PHP precisa saber disso?

Resposta Direta: Para checar se o usuário está em uma conexão segura via PHP, verificamos se a chave HTTPS existe e não está vazia na variável superglobal $_SERVER. O HTTPS (Hypertext Transfer Protocol Secure) adiciona uma camada de criptografia (SSL/TLS) ao HTTP comum, protegendo os dados trafegados entre o cliente e o servidor contra interceptações.



Para deixar claro a diferença estrutural:

  • HTTP: A comunicação é feita em "texto plano". Se alguém interceptar a rede (um ataque Man-in-the-Middle), consegue ler senhas, e-mails e dados de cartão de crédito.
  • HTTPS: A comunicação é criptografada. Mesmo que o pacote de dados seja interceptado no meio do caminho, o atacante só verá um monte de caracteres ilegíveis e embaralhados.

Além da segurança vital, os motores de busca (como o Google) priorizam sites em HTTPS. Ou seja: ter um site HTTPS é fundamental para o seu SEO.



Script PHP: Verificando se a página é HTTPS

A estrutura nativa para descobrir o protocolo que está sendo utilizado naquele exato momento de acesso é bem simples e elegante. Basta perguntar ao servidor web se a flag HTTPS foi ativada na requisição.

<?php
/**
 * Script Progressivo: Verificador de Protocolo
 */

// Verifica se a chave 'HTTPS' existe, não está vazia e tem o valor 'on'
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') {
    echo "<h3 style='color: green;'>🔒 Segurança garantida: O HTTPS está ativo!</h3>";
} else {
    echo "<h3 style='color: red;'>⚠️ Cuidado: O HTTP padrão está ativo (Conexão não segura).</h3>";
}
?>


🛠️ Curiosidade de Arquitetura: A condição verifica se o valor é diferente de 'off' porque alguns servidores IIS (da Microsoft) costumam setar a variável $_SERVER['HTTPS'] com a string 'off' em conexões não seguras, em vez de simplesmente deixá-la vazia como o Apache faz. Prever esses cenários é o que te faz um programador à prova de falhas!


Quer ir além dos scripts básicos de internet?

Profissionais que escrevem códigos seguros e eficientes ganham as melhores vagas e fecham os contratos mais caros. Se você está cansado de ficar pescando dicas soltas e quer um material linear, didático e focado no seu crescimento profissional, a nossa Apostila Completa é o atalho perfeito. Estude offline, pratique com exercícios focados e acesse o gabarito.

Apostila PHP Progressivo
Baixar Apostila PHP Progressivo Agora 🚀


O Cenário Moderno: Proxies, Cloudflare e Load Balancers

Se você colocar o seu site atrás de uma CDN de performance como a Cloudflare ou em um balanceador de carga da AWS, o script acima pode falhar. Por quê?

Porque o usuário conecta via HTTPS na Cloudflare, mas a Cloudflare pode se conectar via HTTP com o seu servidor. Para o seu PHP, a conexão parecerá insegura, gerando loops de redirecionamento ou falsos positivos.

Para contornar isso em servidores corporativos, o padrão de mercado é checar um cabeçalho extra:

<?php
// Verificação Sênior: Lida com conexões diretas e proxies/Cloudflare
$isSecure = false;

if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
    $isSecure = true;
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' || !empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'on') {
    $isSecure = true;
}

echo $isSecure ? "Conexão Segura Ativa!" : "Atenção: Tráfego Inseguro.";
?>


Bônus: Como forçar o HTTPS no PHP (Redirecionamento 301)

Agora que você sabe detectar a conexão, de nada adianta apenas mostrar um aviso. O correto é proteger o usuário! Se ele acessar via HTTP, nós devemos pegá-lo pela mão e redirecioná-lo obrigatoriamente para a versão segura do site.

Coloque este trecho de código no topo do seu arquivo principal (antes de qualquer saída HTML):

<?php
// Se não for seguro...
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
    // Monta a nova URL forçando o "https://"
    $redirectURL = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    
    // Envia o cabeçalho de redirecionamento permanente (Bom para SEO)
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirectURL);
    exit(); // Encerra o script para garantir o salto
}
?>


Torne-se um Mestre da Programação

Segurança de redes, manipulação de servidores, linguagens de baixo nível e arquitetura web. Se você quer ter o arsenal completo de um Engenheiro de Software sempre à disposição no seu celular, tablet ou PC, nosso Mega Pack é o seu próximo passo.

Mega Pack 7 Apostilas de Programação



Consolide seu Conhecimento

Proteger aplicações web é um ciclo contínuo de estudos. Agora que você dominou a verificação de protocolo, que tal aprofundar suas habilidades em outras métricas de servidores e segurança?



<< Aula anterior | Sumário do Curso PHP | Próxima aula >>

Nenhum comentário: