it-swarm-eu.dev

Wie kann ich Benutzer zwingen, über HTTPS statt über HTTP auf meine Seite zuzugreifen?

Ich habe nur eine Seite, die ich als HTTPS-Seite aufrufen möchte (PHP auf Apache). Wie mache ich das, ohne dass das gesamte Verzeichnis HTTPS erfordert? Wenn Sie ein Formular von einer HTTP-Seite an eine HTTPS-Seite senden, wird es dann statt über HTTP über HTTPS gesendet?

Hier ist mein Beispiel:

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

Ich möchte, dass es nur über Folgendes erreichbar ist:

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

Sicher, ich kann alle Links auf diese Seite setzen, die auf die HTTPS-Version verweisen, aber das hindert nicht einige Narren daran, absichtlich über HTTP darauf zuzugreifen ...

Eine Sache, die ich dachte, war eine Umleitung in den Header der Datei PHP, um zu überprüfen, ob sie auf die HTTPS-Version zugreifen:

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

Aber das kann nicht der richtige Weg sein, oder?

Übrigens, bitte beachte die URL nicht. Ich weiß, wenn es sich tatsächlich um eine Seite handelt, auf der sich ein Einkaufswagen usw. befindet, würden Sie es anders machen. Stellen Sie sich dies als eine Seite von einer Website vor, auf der ein Artikel zu einem Preis verkauft wird, auf der Sie Ihre Kreditkarteninformationen eingeben, die an ein Zahlungsportal auf einer externen Website übermittelt werden sollen, um Ihre Karte einmalig zu belasten.

123
Wiki

Die Art und Weise, wie ich es zuvor gemacht habe, ist im Wesentlichen wie das, was Sie geschrieben haben, hat aber keine fest codierten Werte:

if ($ _ SERVER ["HTTPS"]! = "on") 
 {
 header ("Location: https: //". $ _SERVER ["HTTP_Host"]. $ _SERVER ["REQUEST_URI"]); Ausfahrt();
}
163
Adam Rosenfield

Sie könnten dies mit einer Direktive und mod_rewrite für Apache tun:

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

Sie können den Standort im Laufe der Zeit intelligenter machen, indem Sie reguläre Ausdrücke verwenden, wenn Sie möchten. 

45
thebigjc

Sie sollten das client zwingen, HTTPS immer mit HTTP Strict Transport Security (HSTS) -Header anzufordern:

// 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();
}

Bitte beachten Sie, dass HSTS in den meisten modernen Browsern unterstützt wird, jedoch nicht universell. Daher leitet die obige Logik den Benutzer unabhängig von der Unterstützung manuell um, wenn er auf HTTP endet, und setzt den HSTS-Header so, dass weitere Clientanforderungen vom Browser umgeleitet werden, sofern dies möglich ist.

36
Jacob Swartwood

Ich habe gerade eine .htaccess-Datei erstellt und hinzugefügt:

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

Einfach!

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

Musste so etwas tun, wenn man hinter einem Load Balancer lief. Hutspitze 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

Manchmal müssen Sie möglicherweise sicherstellen, dass der Benutzer Ihre Website über eine sichere Verbindung durchsucht. Eine einfache Möglichkeit, den Benutzer immer auf eine sichere Verbindung (https: //) umzuleiten, kann mit einer .htaccess-Datei mit den folgenden Zeilen ausgeführt werden:

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

Bitte beachten Sie, dass sich .htaccess im Hauptordner der Website befinden sollte.

Wenn Sie HTTPS für einen bestimmten Ordner erzwingen möchten, können Sie Folgendes verwenden:

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

Die .htaccess-Datei sollte sich in dem Ordner befinden, in dem Sie HTTPS erzwingen müssen.

5
itsazzad

Ok .. Jetzt gibt es eine Menge Zeug dazu, aber niemand beendet wirklich die .__- "Sichere" Frage. Für mich ist es lächerlich, etwas zu verwenden, das unsicher ist.

Es sei denn, Sie verwenden es als Köder. 

Die Ausbreitung von $ _SERVER kann von jemandem geändert werden, der weiß, wie.

Wie auch Sazzad Tushar Khan und der thebigjc angegeben haben, können Sie dies auch mit httaccess tun, und es gibt viele Antworten, die dies enthalten.

Einfach hinzufügen:

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

bis zum Ende dessen, was Sie in Ihrem .httaccess haben und das ist das.

Dennoch sind wir mit diesen beiden Tools nicht so sicher, wie wir nur können.

Der Rest ist einfach. Wenn Attribute fehlen, dh ...

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

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


Angenommen, Sie haben Ihre httaccess-Datei aktualisiert und prüfen:

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

Es gibt viele weitere Variablen, die Sie überprüfen können, dh .. 

Host_URI(Wenn statische Attribute zum Überprüfen vorhanden sind)

HTTP_USER_AGENT(Gleiche Sitzung, unterschiedliche Werte)

Alles, was ich sage, ist also nicht nur mit dem einen oder dem anderen zufrieden, wenn die Antwort in einer Kombination liegt.

Weitere Informationen zum Umschreiben von httaccess finden Sie unter docs-> http://httpd.Apache.org/docs/2.0/misc/rewriteguide.html

Einige Stacks hier -> Erzwingen Sie SSL/https mit .htaccess und mod_rewrite
und
Den vollständigen URL der aktuellen Seite abrufen (PHP)
um ein paar zu nennen.

5
JSG

Verwenden Sie $_SERVER['HTTPS'], um festzustellen, ob es sich um SSL handelt, und leiten Sie ihn an die richtige Stelle, falls dies nicht der Fall ist.

Denken Sie daran, dass die Seite, auf der das Formular angezeigt wird, nicht über HTTPS zugeführt werden muss, sondern die Post-Back-URL.

Edit: Ja, wie unten ausgeführt, ist es am besten, den gesamten Prozess in HTTPS zu haben. Es ist viel beruhigender - ich habe darauf hingewiesen, dass der Beitrag der kritischste Teil ist. Sie müssen außerdem darauf achten, dass Cookies als sicher eingestuft werden, sodass sie nur über SSL gesendet werden. Die mod_rewrite-Lösung ist auch sehr schick. Ich habe sie verwendet, um viele Anwendungen auf meiner eigenen Website zu sichern.

3
DGM

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

Wenn Sie Apache oder etwas ähnliches wie LiteSpeed ​​verwenden, das .htaccess-Dateien unterstützt, können Sie Folgendes tun .. __ Wenn Sie noch keine .htaccess-Datei haben, sollten Sie eine neue .htaccess-Datei in Ihrem Stammverzeichnis erstellen (normalerweise wo sich Ihre index.php befindet). Fügen Sie nun diese Zeilen als erste Umschreibungsregeln in Ihrem .htaccess hinzu:

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

Sie benötigen die Anweisung "RewriteEngine On" nur einmal in Ihrem .htaccess für alle Umschreiberegeln. Wenn Sie also bereits über diese Regeln verfügen, kopieren Sie einfach die zweite und dritte Zeile.

Ich hoffe das hilft.

1
Antonio

Dies ist NICHT genug:

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

Wenn Sie über einen http-Inhalt verfügen (wie eine externe http-Bildquelle), erkennt der Browser eine mögliche Bedrohung. Stellen Sie also sicher, dass alle Ref und Src in Ihrem Code https sind

1

Für diejenigen, die mit IIS diese Zeile in der web.config hinzufügen, hilft das

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

Eine vollständige Beispieldatei

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

Mischen Sie nicht HTTP und HTTPS auf derselben Seite. Wenn Sie über eine Formularseite verfügen, die über HTTP bereitgestellt wird, bin ich nervös beim Senden von Daten. Ich kann nicht sehen, ob das Senden über HTTPS oder HTTP erfolgt, ohne eine View-Quelle zu verwenden und danach zu suchen.

Das Senden des Formulars über HTTPS zusammen mit dem Weiterleitungslink ist keine so große Änderung für den Vorteil.

1
JBB

Ich habe viele Lösungen durchlaufen, um den Status von $ _SERVER [HTTPS] zu überprüfen, aber es scheint nicht zuverlässig zu sein, da es manchmal nicht aktiviert oder deaktiviert ist umleiten.

Hier ist die zuverlässigste Lösung, wenn Ihr Server $ _SERVER [SCRIPT_URI] unterstützt.

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

Beachten Sie, dass Ihr Server je nach Ihrer Installation möglicherweise $ _SERVER [SCRIPT_URI] nicht unterstützt. Wenn dies jedoch der Fall ist, ist dies das bessere Skript.

Sie können hier nachlesen: Warum haben einige PHP -Installationen $ _SERVER ['SCRIPT_URI'] und andere nicht

0
Tarik

Der PHP Weg:

$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);
}

Der Apache mod_rewrite Weg:

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

Sie sollten aus Sicherheitsgründen nicht. Vor allem, wenn hier Cookies im Spiel sind. Sie sind offen für Wiederholungsangriffe auf Cookie-Basis.

In jedem Fall sollten Sie die Apache-Steuerungsregeln verwenden, um sie zu optimieren.

Anschließend können Sie testen, ob HTTPS aktiviert ist, und bei Bedarf nach Bedarf umleiten.

Sie sollten nur mit FORM POST (no get) auf die Bezahlseite umleiten, und Zugriffe auf die Seite ohne POST sollten auf die anderen Seiten zurückgeleitet werden. (Dies wird die Leute fangen, die nur heiß springen.)

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

Ist ein guter Ort, um zu beginnen, entschuldigt sich dafür, nicht mehr zu liefern. Aber Sie sollten wirklich alles durch SSL schieben .

Es ist übermäßig schützend, aber zumindest haben Sie weniger Sorgen.

0
Kent Fredric

vielleicht kann Ihnen dies helfen, so habe ich es für meine Website gemacht, es funktioniert wie ein Zauber:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

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