it-swarm.com.ru

Как я могу заставить пользователей получать доступ к моей странице через HTTPS вместо HTTP?

У меня есть только одна страница, которую я хочу заставить быть доступной как страница HTTPS (PHP на Apache). Как мне сделать это, не заставляя весь каталог требовать HTTPS? Или, если вы отправляете форму на страницу HTTPS со страницы HTTP, отправляет ли она HTTPS вместо HTTP?

Вот мой пример:

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

Я хочу, чтобы он был доступен только через:

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

Конечно, я могу поместить все ссылки на эту страницу, указывающие на версию HTTPS, но это не мешает некоторым дуракам получить доступ к нему через HTTP специально ...

Одна вещь, которую я подумал, это поместить перенаправление в заголовок файла PHP, чтобы убедиться, что они обращаются к версии HTTPS:

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

Но это не может быть правильным путем, не так ли?

Кстати, пожалуйста, не обращайте внимания на URL. Я знаю, что если бы это была действительно страница с корзиной для покупок и т.д., Вы бы сделали это по-другому. Думайте об этом как о странице с сайта, который продает один товар за одну цену, где вы вводите информацию о своей кредитной карте, которая будет отправлена ​​в платежный шлюз на внешнем сайте для явной цели зарядки вашей карты один раз.

123
Wiki

То, как я делал это раньше, в основном похоже на то, что вы написали, но не имеет жестко закодированных значений:

if ($ _ SERVER ["HTTPS"]! = "on") 
 {
 header ("Местоположение: https: //". $ _SERVER ["HTTP_Host"]. $ _SERVER ["REQUEST_URI"]); 
 выход();
}
163
Adam Rosenfield

Вы можете сделать это с помощью директивы и mod_rewrite на Apache:

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

Вы можете сделать Местоположение умнее со временем, используя регулярные выражения , если хотите. 

45
thebigjc

Вы должны заставить client всегда запрашивать HTTPS с заголовками 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();
}

Обратите внимание, что HSTS поддерживается в большинстве современных браузеров, но не универсален. Таким образом, приведенная выше логика вручную перенаправляет пользователя независимо от поддержки, если он оказывается в HTTP, и затем устанавливает заголовок HSTS так, чтобы дополнительные клиентские запросы были перенаправлены браузером, если это возможно.

36
Jacob Swartwood

Я просто создал файл .htaccess и добавил:

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

Просто !

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

Пришлось сделать что-то подобное, когда бежал за балансировщиком нагрузки. Наконечник шляпы 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

Иногда вам может потребоваться убедиться, что пользователь просматривает ваш сайт через защищенное соединение. Простой способ всегда перенаправить пользователя на защищенное соединение (https: //) может быть выполнен с помощью файла .htaccess, содержащего следующие строки:

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

Обратите внимание, что файл .htaccess должен находиться в главной папке веб-сайта.

Если вы хотите использовать HTTPS для конкретной папки, вы можете использовать:

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

Файл .htaccess должен быть помещен в папку, где вам нужно принудительно установить HTTPS.

5
itsazzad

Хорошо. Теперь есть масса вещей по этому вопросу, но никто не заканчивает "Безопасный" вопрос. Для меня это смешно использовать что-то небезопасное.

Если вы не используете его в качестве приманки. 

Распространение $ _SERVER может быть изменено по желанию того, кто знает, как.

Также, как заявили Саззад Тушар Хан и thebigjc, вы также можете использовать httaccess для этого, и здесь есть много ответов, содержащих его.

Просто добавь:

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

до конца того, что у вас есть в вашем .httaccess и это все.

Тем не менее, мы не настолько безопасны, как могли бы быть с этими двумя инструментами.

Остальное просто. Если отсутствуют атрибуты, т.е.

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

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


Также скажите, что вы обновили файл httaccess и проверили:

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

Есть намного больше переменных, которые вы можете проверить, т.е. 

Host_URI(если есть статические атрибуты об этом, чтобы проверить)

HTTP_USER_AGENT(в том же сеансе разные значения)

Так что все, что я говорю, это не просто соглашайтесь на одно или другое, когда ответ лежит в комбинации.

Для получения дополнительной информации о переписывании httaccess см. Docs-> http://httpd.Apache.org/docs/2.0/misc/rewriteguide.html

Некоторые Стеки здесь -> Принудительное использование SSL/https с использованием .htaccess и mod_rewrite
а также
Получение полного URL текущей страницы (PHP)
чтобы назвать пару.

5
JSG

Используйте $_SERVER['HTTPS'], чтобы узнать, является ли он SSL , и перенаправьте в нужное место, если нет.

И помните, что страница, которая отображает форму, не нуждается в подаче через HTTPS, больше всего ей нужен URL обратной ссылки.

Edit: да, как указано ниже, лучше всего иметь весь процесс в HTTPS. Это гораздо более обнадеживающе - я указывал, что этот пост - самая важная часть. Кроме того, вам нужно позаботиться о том, чтобы все файлы cookie были защищены, поэтому они будут отправляться только через SSL. Решение mod_rewrite также очень изящно, я использовал его для защиты многих приложений на моем собственном веб-сайте.

3
DGM

используйте 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

Если вы используете Apache или что-то вроде LiteSpeed, который поддерживает файлы .htaccess, вы можете сделать следующее .... Если у вас еще нет файла .htaccess, вы должны создать новый файл .htaccess в корневом каталоге (обычно где находится ваш index.php). Теперь добавьте эти строки как первые правила перезаписи в ваш .htaccess:

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

Вам нужна только инструкция «RewriteEngine On» один раз в вашем .htaccess для всех правил перезаписи, поэтому, если она у вас уже есть, просто скопируйте вторую и третью строку.

Надеюсь, это поможет.

1
Antonio

Использование этого недостаточно:

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

Если у вас есть какой-либо контент http (например, внешний источник изображения http), браузер обнаружит возможную угрозу. Поэтому убедитесь, что все ваши ref и src внутри вашего кода являются https

1
bourax webmaster

Для тех, кто использует IIS, добавление этой строки в web.config поможет:

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

Полный пример файла

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

Не смешивайте HTTP и HTTPS на одной странице. Если у вас есть страница формы, которая обслуживается через HTTP, я буду нервничать по поводу отправки данных - я не могу увидеть, идет ли отправка по HTTPS или HTTP, не выполняя View Source и не отыскивая его.

Обслуживание формы по HTTPS вместе со ссылкой на отправку не так уж сложно для преимущества.

1
JBB

Я прошел через множество решений с проверкой состояния $ _SERVER [HTTPS], но кажется, что это ненадежно, потому что иногда он не устанавливается или включается, выключается и т.д., Что приводит к внутреннему циклу сценария перенаправления.

Вот наиболее надежное решение, если ваш сервер поддерживает $ _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;
}

Обратите внимание, что в зависимости от вашей установки ваш сервер может не поддерживать $ _SERVER [SCRIPT_URI], но если это так, это лучший сценарий для использования.

Вы можете проверить здесь: Почему в некоторых PHP установках есть $ _SERVER ['SCRIPT_URI'], а в других нет

0
Tarik

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

Способ Apache mod_rewrite:

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

Вы не должны по соображениям безопасности. Особенно, если здесь есть файлы cookie. Это делает вас широко открытыми для атак воспроизведения на основе файлов cookie. 

В любом случае, вы должны использовать правила управления Apache для его настройки.

Затем вы можете проверить, включен ли HTTPS, и перенаправлять по мере необходимости. 

Вы должны перенаправить на платную страницу только с помощью ФОРМЫ POST (без получения), Доступ к странице без POST должен быть перенаправлен на другие страницы. (Это поймает людей просто прыгать.) 

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

Это хорошее место для начала, извинения за то, что не предоставили больше. Но вы действительно должны протолкнуть все через SSL.

Это чрезмерно защищает, но по крайней мере у вас меньше забот. 

0
Kent Fredric

может быть, это может помочь вам, вот как я сделал для моего сайта, это работает как шарм:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

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