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

时间:2020-03-05 18:59:31  来源:igfitidea点击:

我只有一个页面要强制作为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。我知道,如果实际上是一个有购物车等的页面,那么我们将以另一种方式进行操作。我们可以将其想象为一个网站的页面,该网站以一种价格出售一件商品,我们在其中键入信用卡信息,然后提交给外部网站上的付款网关,以明确地对卡进行一次收费。

解决方案

回答

我们可以在Apache上使用指令和mod_rewrite来实现:

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

如果需要,我们可以使用正则表达式使位置信息随着时间的推移变得更智能。

回答

使用$ _SERVER ['HTTPS']`来判断它是否为SSL,否则将重定向到正确的位置。

请记住,显示表单的页面不需要通过HTTPS进行馈送,这是最需要它的回发URL。

编辑:是的,正如下面所指出的,最好将整个过程放在HTTPS中。我要指出的是,帖子是最关键的部分,这让我更加放心。另外,我们需要注意将所有cookie设置为安全的,因此它们将仅通过SSL发送。 mod_rewrite解决方案也很漂亮,我用它来保护自己网站上的许多应用程序。

回答

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

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

回答

不要在同一页面上混合使用HTTP和HTTPS。如果我们有一个通过HTTP提供的表单页面,那么我将对提交数据感到不安-如果不执行查看源并进行搜寻,就无法查看提交是通过HTTPS还是HTTP进行。

通过HTTPS连同提交链接一起提供表单并没有太大的优势。

回答

我们不应该出于安全原因。特别是在这里使用cookie的情况下。它使我们对基于cookie的重播攻击敞开了大门。

无论哪种方式,都应使用Apache控制规则进行调整。

然后,我们可以测试是否启用了HTTPS,并在需要时根据需要重定向。

我们应该仅使用FORM POST(无法获取)重定向到付款页面,
并且在没有POST的情况下访问该页面应定向回其他页面。
(这会引起人们的热跳。)

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

是一个很好的起点,很抱歉没有提供更多。但是我们真的应该通过SSL推送所有内容。

它具有过度保护的功能,但至少担心更少。

回答

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