it-swarm-eu.dev

Jak mohu přinutit uživatele k přístupu na stránku přes protokol HTTPS namísto protokolu HTTP?

Mám jen jednu stránku, kterou chci vynutit, aby byla zpřístupněna jako stránka HTTPS (PHP na Apache). Jak to udělat, aniž by celý adresář vyžadoval HTTPS? Nebo pokud odešlete formulář na stránku HTTPS ze stránky HTTP, odešle ji pomocí protokolu HTTPS namísto protokolu HTTP?

Zde je můj příklad:

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

Chci, aby k ní bylo přistupováno pouze prostřednictvím:

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

Jasně, mohu dát všechny odkazy na tuto stránku na HTTPS verzi, ale to nezastaví nějaký blázen v přístupu k němu přes HTTP na účel ...

Jedna věc, kterou jsem si myslel, bylo umístění přesměrování do záhlaví souboru PHP, abyste se ujistili, že mají přístup k verzi HTTPS:

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

Ale to nemůže být správná cesta, že?

BTW, prosím, věnujte pozornost URL. Vím, že kdyby to byla vlastně stránka, kde byl nákupní košík, atd., Udělali byste to jinak. Přemýšlejte o tom jako o stránce z webu, který prodává jednu položku za jednu cenu, kde zadáte informace o kreditní kartě, které mají být odeslány platební bráně na externí stránce, za účelem jednorázového jednorázového účtování karty.

123
Wiki

Způsob, jakým jsem to udělal dříve, je v podstatě jako to, co jste napsali, ale nemá žádné hodnoty v pevném kódu:

if ($ _ SERVER ["HTTPS"]! = "on") 
 {
 header ("Umístění: https: //". $ _SERVER ["HTTP_Host"]. $ _SERVER ["REQUEST_URI "]); 
 exit (); 
}
163
Adam Rosenfield

Můžete to udělat s direktivou a mod_rewrite na Apache:

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

Místo by bylo možné časem chytřeji pomocí regulárních výrazů pokud chcete. 

45
thebigjc

Měli byste přinutit client požádat HTTPS vždy s záhlavími 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();
}

Upozorňujeme, že HSTS je podporován ve většině moderních prohlížečů, ale není univerzální. Logika výše manuálně přesměruje uživatele bez ohledu na podporu, pokud skončí na HTTP, a pak nastaví záhlaví HSTS tak, aby prohlížeč mohl podle potřeby přesměrovat další požadavky klienta.

36
Jacob Swartwood

Právě jsem vytvořil soubor .htaccess a přidal:

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

Jednoduché!

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

Musel udělat něco takového, když běží za balancerem. Hat tip 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

Někdy budete muset zajistit, aby uživatel procházel vaše stránky přes zabezpečené připojení. Snadný způsob, jak vždy přesměrovat uživatele na zabezpečené připojení (https: //), lze provést pomocí souboru .htaccess, který obsahuje následující řádky:

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

Mějte prosím na paměti, že soubor .htaccess by měl být umístěn v hlavní složce webu.

V případě, že chcete použít HTTPS pro konkrétní složku, můžete použít:

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

Soubor .htaccess by měl být umístěn ve složce, kde je třeba vynutit HTTPS.

5
itsazzad

Ok .. Teď je tu teď spoustu věcí, ale nikdo ve skutečnosti nedokončí otázku "Secure". Pro mě je směšné používat něco, co je nejisté.

Pokud ji nepoužijete jako návnadu. 

Propagace $ _SERVER může být změněna podle přání někoho, kdo ví.

Také jako Sazzad Tušar Khan a thebigjc uvedli, můžete to také použít httaccess a existuje mnoho odpovědí, které ho obsahují.

Jen Přidej:

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

na konec toho, co máte ve svém .httaccess a to je to.

S těmito dvěma nástroji však stále nejsme tak bezpečné, jak jen můžeme.

Zbytek je jednoduchý. Pokud chybí atributy, tj.

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

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


Řekněte také, že jste aktualizovali soubor httaccess a zkontrolujete:

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

Existuje mnohem více proměnných, které můžete zkontrolovat. 

Host_URI(Pokud existují statické atributy, které chcete zkontrolovat)

HTTP_USER_AGENT(Stejné hodnoty různých relací)

Takže všechny Im říká, že není jen spokojit s jedním nebo druhým, když odpověď spočívá v kombinaci.

Pro více informací o přepisu httaccess viz dokument docs-> http://httpd.Apache.org/docs/2.0/misc/rewriteguide.html

Některé hromady zde -> Vynutit SSL/https pomocí .htaccess a mod_rewrite
a
Získání plné adresy URL aktuální stránky (PHP)
pojmenovat pár.

5
JSG

Pomocí $_SERVER['HTTPS'] zjistíte, zda je SSL , a přesměrujte na správné místo, pokud ne.

A nezapomeňte, že stránka, která zobrazuje formulář, nemusí být podána prostřednictvím protokolu HTTPS, je to adresa URL, která je zpětná.

Edit: ano, jak je uvedeno níže, je nejlepší mít celý proces v HTTPS. Je to mnohem více uklidňující - poukazoval jsem na to, že post je nejkritičtější částí. Musíte se také postarat o to, aby všechny soubory cookie byly nastaveny tak, aby byly bezpečné, takže budou odeslány pouze prostřednictvím protokolu SSL. Řešení mod_rewrite je také velmi šikovné, používám ho k zabezpečení mnoha aplikací na svých vlastních webových stránkách.

3
DGM

použít 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

Pokud používáte Apache nebo něco jako LiteSpeed, který podporuje soubory .htaccess, můžete provést následující: Pokud ještě nemáte soubor .htaccess, měli byste v kořenovém adresáři vytvořit nový soubor .htaccess (obvykle tam, kde se nachází vaše index.php). Nyní přidejte tyto řádky jako první pravidla pro přepsání v souboru .htaccess:

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

Pro všechny pravidla pro přepsání potřebujete pouze instrukci "RewriteEngine On" jednou ve vašem .htaccess, takže pokud ji již máte, stačí zkopírovat druhý a třetí řádek.

Doufám, že to pomůže.

1
Antonio

Použití tohoto NENÍ dostatečné:

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

Pokud máte jakýkoliv obsah http (jako externí zdroj obrazu http), prohlížeč zjistí možnou hrozbu. Takže se ujistěte, že všechny vaše ref a src uvnitř vašeho kódu jsou https

1
bourax webmaster

Pro ty, kteří používají IIS přidávání tohoto řádku do web.config, pomůže:

<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>

Úplný ukázkový soubor

<?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

Na stejné stránce nemíchejte protokoly HTTP a HTTPS. Pokud máte formulářovou stránku, která se podává prostřednictvím protokolu HTTP, budu nervózní, pokud jde o odesílání dat - nemohu vidět, zda se odesílání přesouvá přes protokol HTTPS nebo HTTP, aniž by to provedlo zobrazení zdroje a lovu.

Doručování formuláře přes HTTPS spolu s odkazem na odeslání není tak velká změna pro výhodu.

1
JBB

Byl jsem v mnoha řešeních s kontrolou stavu $ _SERVER [HTTPS], ale zdá se, že to není spolehlivé, protože někdy není nastaveno nebo zapnuto, vypnuto atd. přesměrování.

Zde je nejspolehlivější řešení, pokud váš server podporuje $ _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;
}

Vezměte prosím na vědomí, že v závislosti na vaší instalaci nemusí váš server podporovat $ _SERVER [SCRIPT_URI], ale pokud ano, je to lepší skript.

Zde se můžete podívat zde: Proč mají některé instalace PHP $ _SERVER ['SCRIPT_URI'] a jiné ne

0
Tarik

Způsob 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);
}

Způsob mod_rewrite Apache:

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

Neměl byste z bezpečnostních důvodů. Zejména pokud jsou zde soubory cookie. Ponechává vám široké možnosti útoků založených na cookies. 

Ať tak či onak, měli byste použít pravidla pro řízení Apache k vyladění.

V případě potřeby můžete otestovat, zda je povoleno HTTPS a přesměrování. 

Měli byste přesměrovat na stránku s placením pouze pomocí formuláře POST (no get), A přístupy na stránku bez POST by měly být směrovány zpět na jiné stránky. (Tím se chytí lidé jen hot-jumping.) 

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

Je dobré začít, omlouvám se za to, že neposkytuje více. Ale opravdu should shove všechno přes SSL.

Je to přehnaná ochrana, ale přinejmenším máte méně starostí. 

0
Kent Fredric

možná, že tohle může pomoci, to je to, co jsem udělal pro své webové stránky, funguje to jako kouzlo:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

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