it-swarm-vi.tech

Làm cách nào tôi có thể buộc người dùng truy cập trang của mình qua HTTPS thay vì HTTP?

Tôi chỉ có một trang mà tôi muốn buộc phải truy cập dưới dạng trang HTTPS (PHP trên Apache). Làm thế nào để tôi làm điều này mà không làm cho toàn bộ thư mục yêu cầu HTTPS? Hoặc, nếu bạn gửi biểu mẫu đến trang HTTPS từ trang HTTP, liệu nó có gửi nó bằng HTTPS thay vì HTTP không?

Đây là ví dụ của tôi:

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

Tôi muốn nó chỉ được truy cập thông qua:

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

Chắc chắn, tôi có thể đặt tất cả các liên kết đến trang này chỉ vào phiên bản HTTPS, nhưng điều đó không ngăn được kẻ ngốc truy cập nó thông qua HTTP nhằm mục đích ...

Một điều tôi nghĩ là đặt một chuyển hướng trong tiêu đề của tệp PHP để kiểm tra để chắc chắn rằng họ đang truy cập phiên bản HTTPS:

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

Nhưng đó không phải là cách đúng đắn, phải không?

BTW, xin vui lòng không chú ý đến URL. Tôi biết rằng nếu đó thực sự là một trang có giỏ mua hàng, v.v., bạn sẽ làm theo cách khác. Hãy nghĩ về nó như một trang từ một trang web bán một mặt hàng với một mức giá mà bạn nhập thông tin thẻ tín dụng của mình để gửi đến cổng thanh toán trên một trang web bên ngoài với mục đích rõ ràng là sạc thẻ của bạn một lần.

123
Wiki

Cách tôi đã làm trước đây về cơ bản giống như những gì bạn đã viết, nhưng không có bất kỳ giá trị mã hóa cứng nào:

if ($ _ SERVER ["HTTPS"]! = "trên") 
 {
 tiêu đề ("Vị trí: https://: //" lối thoát hiểm();
}
163
Adam Rosenfield

Bạn có thể làm điều đó với một lệnh và mod_rewrite trên Apache:

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

Bạn có thể làm cho Vị trí thông minh hơn theo thời gian bằng cách sử dụng biểu thức chính quy nếu bạn muốn. 

45
thebigjc

Bạn nên buộc client luôn yêu cầu HTTPS với các tiêu đề 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();
}

Xin lưu ý rằng HSTS được hỗ trợ trong hầu hết các trình duyệt hiện đại, nhưng không phổ biến. Do đó, logic ở trên chuyển hướng thủ công cho người dùng bất kể hỗ trợ nếu họ kết thúc bằng HTTP và sau đó đặt tiêu đề HSTS để các yêu cầu khách tiếp theo sẽ được trình duyệt chuyển hướng nếu có thể.

36
Jacob Swartwood

Tôi vừa tạo một tệp .htaccess và thêm:

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

Đơn giản !

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

Phải làm một cái gì đó như thế này khi chạy phía sau một bộ cân bằng tải. Mũ lưỡi trai 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

Đôi khi bạn có thể cần đảm bảo rằng người dùng đang duyệt trang web của bạn qua kết nối bảo mật. Một cách dễ dàng để luôn chuyển hướng người dùng đến kết nối an toàn (https: //) có thể được thực hiện bằng tệp .htaccess chứa các dòng sau:

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

Xin lưu ý rằng .htaccess phải được đặt trong thư mục chính của trang web.

Trong trường hợp bạn muốn buộc HTTPS cho một thư mục cụ thể, bạn có thể sử dụng:

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

Tệp .htaccess phải được đặt trong thư mục mà bạn cần buộc HTTPS.

5
itsazzad

Ok .. Bây giờ có hàng tấn công cụ về vấn đề này nhưng không ai thực sự hoàn thành câu hỏi "Bảo mật". Đối với tôi, thật là kỳ quặc khi sử dụng một cái gì đó không an toàn.

Trừ khi bạn sử dụng nó làm mồi nhử. 

Việc truyền bá $ _SERVER có thể được thay đổi theo ý muốn của một người biết cách.

Ngoài ra, như Sazzad Tushar Khan và thebigjc đã nói rằng bạn cũng có thể sử dụng omeaccess để làm điều này và có rất nhiều câu trả lời ở đây có chứa nó.

Chỉ cần thêm:

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

đến cuối những gì bạn có trong .httaccess của bạn và đó là điều đó.

Tuy nhiên, chúng tôi không an toàn như chúng tôi có thể với 2 công cụ này.

Phần còn lại là đơn giản. Nếu có thuộc tính bị thiếu, tức là ...

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

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


Cũng nói rằng bạn đã cập nhật tệp omeaccess của bạn và bạn kiểm tra:

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

Có rất nhiều biến số bạn có thể kiểm tra tức là .. 

Host_URI(Nếu có các thuộc tính tĩnh về nó để kiểm tra)

HTTP_USER_AGENT(Các giá trị khác nhau trong cùng một phiên)

Vì vậy, tất cả những gì tôi nói là không chỉ giải quyết cho cái này hay cái khác khi câu trả lời nằm trong một kết hợp.

Để biết thêm thông tin viết lại, hãy xem tài liệu-> http://httpd.Apache.org/docs/2.0/misc/rewriteguide.html

Một số ngăn xếp ở đây -> Buộc SSL/https bằng cách sử dụng .htaccess và mod_rewrite

Lấy URL đầy đủ của trang hiện tại (PHP)
để đặt tên cho một cặp vợ chồng.

5
JSG

Sử dụng $_SERVER['HTTPS'] để biết nếu đó là SSL và chuyển hướng đến đúng nơi nếu không.

Và hãy nhớ rằng, trang hiển thị biểu mẫu không cần phải được cung cấp qua HTTPS, đó là URL gửi lại bài đăng cần nhất.

Chỉnh sửa: có, như được chỉ ra bên dưới, tốt nhất là có toàn bộ quá trình trong HTTPS. Nó yên tâm hơn nhiều - tôi đã chỉ ra rằng bài viết là phần quan trọng nhất. Ngoài ra, bạn cần lưu ý rằng mọi cookie được đặt là an toàn, vì vậy chúng sẽ chỉ được gửi qua SSL. Giải pháp mod_rewrite cũng rất tiện lợi, tôi đã sử dụng nó để bảo mật rất nhiều ứng dụng trên trang web của riêng tôi.

3
DGM

sử dụng 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

Nếu bạn sử dụng Apache hoặc một cái gì đó như LiteSpeed, hỗ trợ các tệp .htaccess, bạn có thể thực hiện các thao tác sau . Nếu bạn chưa có tệp .htaccess, bạn nên tạo tệp .htaccess mới trong thư mục gốc của mình (thường nơi index.php của bạn được đặt). Bây giờ thêm các dòng này làm quy tắc viết lại đầu tiên trong .htaccess của bạn:

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

Bạn chỉ cần hướng dẫn "RewriteEngine On" một lần trong .htaccess của bạn cho tất cả các quy tắc viết lại, vì vậy nếu bạn đã có nó, chỉ cần sao chép dòng thứ hai và thứ ba.

Tôi hi vọng cái này giúp được.

1
Antonio

Sử dụng điều này là không đủ:

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

Nếu bạn có bất kỳ nội dung http nào (như nguồn hình ảnh http bên ngoài), trình duyệt sẽ phát hiện mối đe dọa có thể. Vì vậy, hãy chắc chắn rằng tất cả các ref và src bên trong mã của bạn là https

1
bourax webmaster

Đối với những người sử dụng IIS thêm dòng này vào web.config sẽ giúp:

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

Một tập tin ví dụ đầy đủ

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

Không trộn lẫn HTTP và HTTPS trên cùng một trang. Nếu bạn có một trang biểu mẫu được cung cấp qua HTTP, tôi sẽ lo lắng về việc gửi dữ liệu - Tôi không thể xem liệu việc gửi qua HTTPS hay HTTP mà không thực hiện Xem nguồn và tìm kiếm nó.

Cung cấp biểu mẫu qua HTTPS cùng với liên kết gửi không phải là một thay đổi lớn cho lợi thế.

1
JBB

Tôi đã trải qua nhiều giải pháp với việc kiểm tra trạng thái của $ _SERVER [HTTPS] nhưng có vẻ như nó không đáng tin cậy vì đôi khi nó không được đặt hoặc tắt, v.v. chuyển hướng.

Đây là giải pháp đáng tin cậy nhất nếu máy chủ của bạn hỗ trợ $ _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;
}

Xin lưu ý rằng tùy thuộc vào cài đặt của bạn, máy chủ của bạn có thể không hỗ trợ $ _SERVER [SCRIPT_URI] nhưng nếu có, đây là tập lệnh tốt hơn để sử dụng.

Bạn có thể kiểm tra tại đây: Tại sao một số cài đặt PHP có $ _SERVER ['SCRIPT_URI'] và các cài đặt khác không

0
Tarik

Cách 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);
}

Cách mod_rewrite của Apache:

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

Bạn không nên vì lý do bảo mật. Đặc biệt là nếu cookie đang chơi ở đây. Nó để bạn mở rộng cho các cuộc tấn công phát lại dựa trên cookie. 

Dù bằng cách nào, bạn nên sử dụng các quy tắc điều khiển Apache để điều chỉnh nó.

Sau đó, bạn có thể kiểm tra xem HTTPS có được bật không và chuyển hướng khi cần thiết. 

Bạn chỉ nên chuyển hướng đến trang thanh toán bằng FORM POST (không lấy), Và truy cập vào trang mà không có POST nên được chuyển trở lại các trang khác. (Điều này sẽ bắt mọi người chỉ nhảy nóng.) 

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

Là một nơi tốt để bắt đầu, xin lỗi vì không cung cấp thêm. Nhưng bạn thực sự nên xô đẩy mọi thứ thông qua SSL.

Nó bảo vệ quá mức, nhưng ít nhất bạn có ít lo lắng hơn. 

0
Kent Fredric

có lẽ điều này có thể giúp bạn, đó là cách tôi đã làm cho trang web của mình, nó hoạt động như một cơ duyên:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

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