it-swarm.cn

如何强制用户通过HTTPS而不是HTTP访问我的页面?

我只有一个页面,我想强制作为HTTPS页面访问(Apache上的PHP)。如何在不使整个目录需要HTTPS的情况下执行此操作?或者,如果您从HTTP页面向HTTPS页面提交表单,它是通过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。我知道如果它实际上是一个有购物车等的页面,你会以不同的方式做到这一点。您可以将其视为一个网站,该网站以一个价格销售一件商品,您可以在其中输入您的信用卡信息,然后将其提交到外部网站上的支付网关,以便明确向您的卡收费一次。

127
Wiki

我以前做过的方式基本上就像你写的那样,但没有任何硬编码的值:

if($ _ SERVER [“HTTPS”]!=“on”)[。_____。] {
 header(“Location:https://”。$ _SERVER [“HTTP_Host”]。$ _SERVER [“REQUEST_URI “]);
    出口();
}
166
Adam Rosenfield

您可以在Apache上使用指令和mod_rewrite来执行此操作:

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

如果需要,您可以使用 正则表达式 随着时间的推移使位置更智能。

45
thebigjc

您应该强制 client 始终使用 HTTP严格传输安全性 (HSTS)标头请求HTTPS:

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

有时您可能需要确保用户通过安全连接浏览您的站点。使用包含以下行的.htaccess文件可以轻松地将用户重定向到安全连接(https://)。

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传播可以根据知道方法的人的意愿进行更改。

同样,Sazzad Tushar Khan和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

这里的一些堆栈 - > 使用.htaccess和mod_rewrite强制SSL/https

获取当前页面的完整URL(PHP)
为一对夫妇命名。

5
JSG

使用$_SERVER['HTTPS']来判断它是否是 _ ssl _ ,如果没有,则重定向到正确的位置。

请记住,显示表单的页面不需要通过HTTPS提供,它是最需要它的回发URL。

编辑 :是,如下所述,最好使用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或支持.htaccess文件的LiteSpeed,您可以执行以下操作。如果您还没有.htaccess文件,则应在根目录中创建一个新的.htaccess文件(通常是index.php所在的位置)。现在将这些行添加为.htaccess中的第一个重写规则:

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

在.htaccess中只需要一次“RewriteEngine On”指令即可获得所有重写规则,所以如果你已经拥有它,只需复制第二行和第三行。

我希望这有帮助。

1
Antonio

使用这个还不够:

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

如果您有任何http内容(如外部http图像源),浏览器将检测到可能的威胁。因此,请确保代码中的所有ref和src都是https

1
bourax webmaster

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]
1
Jay

对于那些使用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

你不应该出于安全原因。特别是如果饼干在这里发挥作用。它让你对基于cookie的重放攻击敞开大门。

无论哪种方式,您都应该使用Apache控制规则来调整它。

然后,您可以测试启用的HTTPS,并根据需要重定向。

您应该仅使用FORM 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