Eu tenho apenas uma página que quero forçar a ser acessada como uma página HTTPS (PHP no Apache). Como faço isso sem fazer com que o diretório inteiro exija HTTPS? Ou, se você envia um formulário para uma página HTTPS a partir de uma página HTTP, ele o envia por HTTPS em vez de HTTP?
Aqui está o meu exemplo:
http://www.example.com/some-page.php
Quero que ele seja acessado apenas através de:
https://www.example.com/some-page.php
Claro, eu posso colocar todos os links para esta página apontados para a versão HTTPS, mas isso não impede que algum tolo acesse-o por HTTP de propósito ...
Uma coisa que pensei foi colocar um redirecionamento no cabeçalho do arquivo PHP para verificar se eles estão 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 esse não pode ser o caminho certo, pode?
Respostas:
A maneira como eu fiz isso antes é basicamente como o que você escreveu, mas não tem nenhum valor codificado:
fonte
(empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] !== "on")
para corrigir os avisos do PHP.$_SERVER[]
variáveis não são mutáveis / vulneráveis à intervenção dos usuários?HTTP_X_FORWARDED
, e podem ser manipulados, mas outros gostamHTTPS
ouSERVER_PORT
são definidos diretamente no servidor da web e geralmente devem ser seguros.Você poderia fazer isso com uma diretiva e mod_rewrite no Apache:
Você pode tornar o local mais inteligente ao longo do tempo usando expressões regulares, se desejar.
fonte
Você deve forçar o cliente a solicitar HTTPS sempre com os cabeçalhos HTTP Strict Transport Security (HSTS):
Observe que o HSTS é suportado na maioria dos navegadores modernos, mas não universal. Portanto, a lógica acima redireciona manualmente o usuário, independentemente do suporte, se ele terminar em HTTP e, em seguida, define o cabeçalho HSTS para que outras solicitações do cliente sejam redirecionadas pelo navegador, se possível.
fonte
Acabei de criar um arquivo .htaccess e adicionei:
Simples!
fonte
fonte
Tinha que fazer algo assim ao executar atrás de um balanceador de carga. Dica para o chapéu https://stackoverflow.com/a/16076965/766172
fonte
A maneira PHP:
A maneira mod_rewrite do Apache:
fonte
http://www.besthostratings.com/articles/force-ssl-htaccess.html
Às vezes, pode ser necessário garantir que o usuário esteja navegando no site por uma conexão segura. Uma maneira fácil de redirecionar sempre o usuário para garantir a conexão (https: //) pode ser realizada com um arquivo .htaccess contendo as seguintes linhas:
Observe que o arquivo .htaccess deve estar localizado na pasta principal do site.
Caso deseje forçar o HTTPS para uma pasta específica, você pode usar:
O arquivo .htaccess deve ser colocado na pasta em que você precisa forçar o HTTPS.
fonte
Ok .. Agora, existem muitas coisas sobre isso agora, mas ninguém realmente completa a pergunta "Segura". Para mim, é ridículo usar algo que é inseguro.
A menos que você o use como isca.
A propagação do $ _SERVER pode ser alterada à vontade de alguém que sabe como.
Além disso, como Sazzad Tushar Khan e thebigjc declararam, você também pode usar oaccessaccess para fazer isso e há muitas respostas aqui contendo ele.
Basta adicionar:
até o final do que você tem no seu .httaccess e é isso.
Ainda não estamos tão seguros quanto possível com essas duas ferramentas.
O resto é simples. Se houver atributos ausentes, ou seja, ...
Diga também que você atualizou o seu arquivoaccessaccess e verifique:
Há muito mais variáveis que você pode verificar, isto é ..
HOST_URI
(Se houver atributos estáticos para verificar)HTTP_USER_AGENT
(Valores diferentes da mesma sessão)Então, tudo o que estou dizendo é que não se conforma com um ou outro quando a resposta está em uma combinação.
Para obter mais informações sobre a reescrita do updaccess, consulte os documentos-> http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
Algumas pilhas aqui -> Forçar SSL / https usando .htaccess e mod_rewrite
e
Obtendo o URL completo do página atual (PHP)
para citar alguns.
fonte
ERR_TOO_MANY_REDIRECTS
. Como faço para corrigir isso?Use
$_SERVER['HTTPS']
para saber se é SSL e, se não , redirecione para o local certo.E lembre-se, a página que exibe o formulário não precisa ser alimentada via HTTPS, é o URL de postagem que mais precisa.
Edit : yes, como é indicado 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 cuidar para que todos os cookies estejam configurados para serem seguros, para que sejam enviados apenas via SSL. A solução mod_rewrite também é muito bacana, usei-a para proteger muitos aplicativos em meu próprio site.
fonte
use
htaccess
:fonte
Não misture HTTP e HTTPS na mesma página. Se você tiver uma página de formulário exibida via HTTP, ficarei nervoso com o envio de dados - não consigo ver se o envio passa por HTTPS ou HTTP sem fazer uma fonte de exibição e procurá-la.
Servir o formulário por HTTPS junto com o link de envio não é uma mudança tão grande para a vantagem.
fonte
Se você usa o Apache ou algo como o LiteSpeed, que suporta arquivos .htaccess, você pode fazer o seguinte. Se você ainda não possui um arquivo .htaccess, deve criar um novo arquivo .htaccess no diretório raiz (geralmente onde o index.php está localizado). Agora adicione estas linhas como as primeiras regras de reescrita no seu .htaccess:
Você só precisa da instrução "RewriteEngine On" uma vez no seu .htaccess para todas as regras de reescrita; portanto, se você já a possui, copie a segunda e a terceira linha.
Eu espero que isso ajude.
fonte
Usar isso NÃO é suficiente:
Se você tiver algum conteúdo http (como uma fonte externa de imagem http), o navegador detectará uma possível ameaça. Portanto, verifique se todas as suas referências e src dentro do seu código são https
fonte
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 é ativado ou desativado, etc., causando o redirecionamento de loop interno do script.
Aqui está a solução mais confiável se o seu servidor suportar $ _SERVER [SCRIPT_URI]
Observe que, dependendo da sua instalação, seu servidor pode não suportar $ _SERVER [SCRIPT_URI], mas, se houver, esse é o melhor script a ser usado.
Você pode verificar aqui: Por que algumas instalações PHP têm $ _SERVER ['SCRIPT_URI'] e outras não
fonte
Para aqueles que usam o IIS, adicionar esta linha no web.config ajudará:
Um arquivo de exemplo completo
fonte
Você não deveria, por razões de segurança. Especialmente se houver cookies em jogo aqui. Isso 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, onde necessário.
Você deve redirecionar para a página de pagamento apenas usando um FORM POST (sem obtenção) e os acessos à página sem um POST devem ser direcionados de volta para as outras páginas. (Isso fará com que as pessoas peguem pulos.)
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 do SSL.
É superprotetor, mas pelo menos você tem menos preocupações.
fonte
talvez este possa ajudar você, é assim que eu fiz no meu site, funciona como um encanto:
fonte
Se você deseja usar o PHP para fazer isso, dessa maneira funcionou muito bem para mim:
Ele verifica a variável HTTPS no array superglobal $ _SERVER para ver se é igual a "on". Se a variável não for igual a on.
fonte
Eu usei esse script e funciona bem através do site.
fonte
Tão fácil.
fonte