it-swarm-pt.tech

Como posso forçar os usuários a acessarem minha página por HTTPS em vez de HTTP?

Eu tenho apenas uma página que eu quero forçar para ser acessado como uma página HTTPS (PHP no Apache). Como faço isso sem fazer todo o diretório exigir HTTPS? Ou, se você enviar um formulário para uma página HTTPS de uma página HTTP, ele será enviado por HTTPS em vez de HTTP?

Aqui está o meu exemplo:

http://www.example.com/some-page.php

Eu quero que seja acessado somente por:

https://www.example.com/some-page.php

Claro, eu posso colocar todos os links para esta página apontando para a versão HTTPS, mas isso não impede que algum idiota acesse o HTTP de propósito ...

Uma coisa que pensei foi colocar um redirecionamento no cabeçalho do arquivo PHP para verificar se eles estavam acessando a versão HTTPS:

if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
  header('Location: https://www.example.com/some-page.php');
}

Mas isso não pode ser o caminho certo, pode?

BTW, por favor, não preste atenção ao URL. Eu sei que se fosse uma página onde havia um carrinho de compras, etc., você faria de uma maneira diferente. Pense nisso como uma página de um site que vende um item por um preço no qual você digita as informações do cartão de crédito para ser enviado a um gateway de pagamento em um site externo com o objetivo expresso de cobrar seu cartão uma vez.

123
Wiki

A maneira como fiz isso antes é basicamente o que você escreveu, mas não possui nenhum valor codificado:

if ($ _ SERVER ["HTTPS"]! = "on") 
 {
 cabeçalho ("Localização: https: //". $ _SERVER ["HTTP_Host"]. $ _SERVER ["REQUEST_URI "]);
    Saída();
}
163
Adam Rosenfield

Você poderia fazer isso com uma diretiva e mod_rewrite no Apache:

<Location /buyCrap.php>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
</Location>

Você pode tornar a Localização mais inteligente ao longo do tempo usando expressões regulares se desejar. 

45
thebigjc

Você deve forçar o client a solicitar HTTPS sempre com os cabeçalhos HTTP Strict Transport Security (HSTS):

// Use HTTP Strict Transport Security to force client to use secure connections only
$use_sts = true;

// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}

Por favor, note que o HSTS é suportado na maioria dos navegadores modernos, mas não universal. Assim, a lógica acima redireciona manualmente o usuário, independentemente do suporte, se ele acabar em HTTP, e, em seguida, define o cabeçalho HSTS para que outras solicitações do cliente sejam redirecionadas pelo navegador, se possível.

36
Jacob Swartwood

Acabei de criar um arquivo .htaccess e adicionei:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

Simples!

14
MatHatrik
// Force HTTPS for security
if($_SERVER["HTTPS"] != "on") {
    $pageURL = "Location: https://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    header($pageURL);
}
9
Jeff

Teve que fazer algo assim ao correr atrás de um balanceador de carga. Dica do chapéu https://stackoverflow.com/a/16076965/766172

function isSecure() {
    return (
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
     || $_SERVER['SERVER_PORT'] == 443
     || (
            (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL'])   && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        )
    );
}

function requireHTTPS() {
    if (!isSecure()) {
        header('Location: https://' . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'], TRUE, 301);
        exit;
    }
}
7
syvex

http://www.besthostratings.com/articles/force-ssl-htaccess.html

Às vezes, você pode precisar se certificar de que o usuário está navegando em seu site sobre a conexão de segurança. Uma maneira fácil de sempre redirecionar o usuário para a conexão segura (https: //) pode ser realizada com um arquivo .htaccess contendo as seguintes linhas:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Por favor, note que o .htaccess deve estar localizado na pasta principal do site.

Caso você queira forçar HTTPS para uma pasta específica, você pode usar:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]

O arquivo .htaccess deve ser colocado na pasta onde você precisa forçar o HTTPS.

5
itsazzad

Ok .. Agora há toneladas de coisas sobre isso agora, mas ninguém realmente completa a questão "Segura". Para mim, é ridículo usar algo inseguro.

A menos que você use como isca. 

A propagação de $ _SERVER pode ser alterada à vontade de alguém que saiba como.

Também como Sazzad Tushar Khan e thebigjc afirmaram que você também pode usar o httaccess para fazer isto e há muitas respostas aqui contendo isto.

Basta adicionar:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

até o fim do que você tem em seu .httaccess e é isso.

Ainda assim, não estamos tão seguros quanto possível com essas duas ferramentas.

O resto é simples. Se houver atributos ausentes, ou seja ...

if(empty($_SERVER["HTTPS"])){ // SOMETHING IS FISHY
}

if(strstr($_SERVER['HTTP_Host'],"mywebsite.com") === FALSE){// Something is FISHY
}


Também diga que você atualizou seu arquivo httaccess e checou:

if($_SERVER["HTTPS"] !== "on"){// Something is fishy
}

Existem muito mais variáveis ​​que você pode verificar, por exemplo. 

Host_URI(Se houver atributos estáticos para verificar)

HTTP_USER_AGENT(valores diferentes da mesma sessão)

Então, tudo que eu estou dizendo não é apenas se contentar com um ou outro quando a resposta está em uma combinação.

Para mais informações sobre reescrita do httaccess, consulte os docs-> http://httpd.Apache.org/docs/2.0/misc/rewriteguide.html

Algumas pilhas aqui -> Force SSL/https usando .htaccess e mod_rewrite
e
Obtendo o URL completo da página atual (PHP)
para nomear um casal.

5
JSG

Use $_SERVER['HTTPS'] para dizer se é SSL e redirecione para o lugar certo, se não.

E lembre-se de que a página que exibe o formulário não precisa ser alimentada via HTTPS, é o URL de postagem posterior que mais precisa dele.

Editar: sim, como é apontado abaixo, é melhor ter todo o processo em HTTPS. É muito mais reconfortante - eu estava apontando que o post é a parte mais crítica. Além disso, você precisa tomar cuidado para que os cookies sejam definidos como seguros, para que eles sejam enviados somente via SSL. A solução mod_rewrite também é muito bacana, eu usei para proteger muitos aplicativos em meu próprio site.

3
DGM

use htaccess:

#if domain has www. and not https://
  RewriteCond %{HTTPS} =off [NC]
  RewriteCond %{HTTP_Host} ^(?i:www+\.+[^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [QSA,L,R=307]

#if domain has not www.
  RewriteCond %{HTTP_Host} ^([^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://www.%{HTTP_Host}%{REQUEST_URI} [QSA,L,R=307]
3
siavash bagheri

Se você usa Apache ou algo como LiteSpeed, que suporta arquivos .htaccess, você pode fazer o seguinte: Se você ainda não tem um arquivo .htaccess, você deve criar um novo arquivo .htaccess em seu diretório raiz. (geralmente onde seu index.php está localizado). Agora adicione estas linhas como as primeiras regras de reescrita no seu .htaccess:

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

Você só precisa da instrução "RewriteEngine On" uma vez no seu .htaccess para todas as regras de reescrita, então se você já a tiver, apenas copie a segunda e terceira linha.

Eu espero que isso ajude.

1
Antonio

Usando isso não é suficiente:

if($_SERVER["HTTPS"] != "on")
{
    header("Location: https://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
    exit();
}

Se você tiver algum conteúdo http (como uma fonte de imagem http externa), o navegador detectará uma possível ameaça. Então, tenha certeza que todos os seus ref e src dentro do seu código são https

1
bourax webmaster

Para aqueles que usam IIS, adicionar esta linha no web.config ajudará:

<httpProtocol>
    <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000"/>
    </customHeaders>
</httpProtocol>
<rewrite>
    <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                 <add input="{HTTPS}" pattern="off" ignoreCase="true" />
              </conditions>
              <action type="Redirect" redirectType="Found" url="https://{HTTP_Host}/{R:1}" />
         </rule>
    </rules>
</rewrite>

Um arquivo de exemplo completo

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000"/>
             </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                      <match url="(.*)" />
                      <conditions>
                         <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                      </conditions>
                      <action type="Redirect" redirectType="Found" url="https://{HTTP_Host}/{R:1}" />
                 </rule>
            </rules>
       </rewrite>
   </system.webServer>
</configuration>
1
Tschallacka

Não misture HTTP e HTTPS na mesma página. Se você tem uma página de formulário que é servida via HTTP, eu ficarei nervoso com o envio de dados - não consigo ver se o envio passa por HTTPS ou HTTP sem fazer um View Source e procurá-lo.

A exibição do formulário por HTTPS junto com o link de envio não é uma alteração pesada para a vantagem.

1
JBB

Já passei por muitas soluções com a verificação do status de $ _SERVER [HTTPS] mas parece que não é confiável porque às vezes ele não define ou define como ativado, desativado, etc., fazendo com que o script faça um loop interno redirecionar.

Aqui está a solução mais confiável se o seu servidor suportar $ _SERVER [SCRIPT_URI]

if (stripos(substr($_SERVER[SCRIPT_URI], 0, 5), "https") === false) {
    header("location:https://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]");
    echo "<meta http-equiv='refresh' content='0; url=https://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]'>";
    exit;
}

Por favor, note que, dependendo da sua instalação, o seu servidor pode não suportar $ _SERVER [SCRIPT_URI], mas se isso acontecer, este é o melhor script para usar.

Você pode conferir aqui: Por que algumas instalações PHP possuem $ _SERVER ['SCRIPT_URI'] e outras não

0
Tarik

O caminho PHP:

$is_https=false;
if (isset($_SERVER['HTTPS'])) $is_https=$_SERVER['HTTPS'];
if ($is_https !== "on")
{
    header("Location: https://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI']);
    exit(1);
}

O caminho do mod_rewrite do Apache:

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
0
Jay

Você não deveria por razões de segurança. Especialmente se os cookies estão em jogo aqui. Ele deixa você aberto a ataques de repetição baseados em cookies. 

De qualquer forma, você deve usar as regras de controle do Apache para ajustá-lo.

Em seguida, você pode testar se o HTTPS está ativado e redirecionar conforme necessário, quando necessário. 

Você deve redirecionar para a página de pagamento usando apenas um FORMULÁRIO POST (sem get), E os acessos à página sem um POST devem ser direcionados de volta para as outras páginas. (Isso vai pegar as pessoas apenas saltando quente.) 

http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/

É um bom lugar para começar, desculpas por não fornecer mais. Mas você realmente deve empurrar tudo através de SSL.

É super protetor, mas pelo menos você tem menos preocupações. 

0
Kent Fredric

talvez este possa ajudar, você, é assim que eu fiz para o meu site, funciona como um encanto:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

if (!strstr($protocol, 'https')){
    header("Location: https://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
    exit();
}
0
Héouais Mongars