【问题标题】:how to redirect page to https in php?如何在php中将页面重定向到https?
【发布时间】:2012-02-26 11:06:27
【问题描述】:

我有一个登录表单:

<form method =POST action="/login.php">
...
</form>

我希望 login.php 页面重定向到使用 https

我不想将用户发送到https://.../login.php,因为他们可能会更改链接。但我想在解析登录表单数据并登录用户之前在服务器端进行重定向。

我找到了例子:

if($_SERVER["HTTPS"] != "on") {
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: "https://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]);
   exit();
}

但我没有$_SERVER["HTTPS"] 如果我有var_dump($_SERVER);

我确实有$_SERVER['SERVER_PORT'] 女巫是 80 岁。

有什么想法吗?

谢谢

【问题讨论】:

  • "我不想发送用户..." "我想做一个重定向" 这两者是互不兼容的。是否要强制用户使用 SSL?如果是这样,您需要将用户重定向(发送)到登录表单的 HTTPS 版本。
  • but i don't have 当然,当您与普通HTTP 连接时,您不会拥有它。端口 80 也一样。 $_SERVER["HTTPS"] = 'on'; 当您通过 HTTPS 连接时,在这种情况下您的端口将是 443。您的脚本正在做正确的事情,它会检查当前连接是否是 HTTP,如果不是 - 它会重定向到 HTTPS 版本。
  • 我可以,但用户有可能将链接更改为 HTTP。我需要在 login.php 页面上检查 HTTPS
  • 然后你需要在 login.php 脚本中使用重定向。如果用户更改链接以使用 HTTP 版本,您的脚本将简单地将他再次重定向到 HTTPS 版本。
  • 是的@George Cummins,脚本是什么?

标签: php redirect https secure-coding


【解决方案1】:

如果您允许他们通过纯 HTTP 发布到 /login.php,然后重定向到 HTTPS,那么您就违背了使用 HTTPS 的目的,因为登录信息已经通过 Internet 以纯文本形式发送。

您可以做些什么来阻止用户更改 URL,如果登录页面不是通过 HTTPS,则登录页面会拒绝登录。

我用来检查 HTTPS 的使用如下:

if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) {
    // request is not using SSL, redirect to https, or fail
}

如果您在默认端口 443 上运行安全服务器,那么您还可以检查该端口是否是该端口,但如果使用 SSL,PHP 会将 $_SERVER['HTTPS'] 值设置为非空,因此我会检查为了最佳实践的存在。

编辑:

如果包含用户手动将 https 更改为 http 并希望通过纯文本发送他们的信息,则您无法阻止他们,但如果您不允许通过 HTTP 登录,那么即使是正确的信息不会让他们登录,您可以强制他们使用 https,方法是使其成为唯一有效的方法。

【讨论】:

  • 是的,将该检查添加到脚本开头附近的 login.php 中。您可以做几件事,从拒绝登录并显示需要 https 的错误,或者使用 301 标头重定向到 https。
【解决方案2】:

您用来显示登录表单的任何页面都应该已经在使用https://表单被填写之前,然后它应该被提交到另一个https:// 地址。否则,您将让表单受到攻击。

您可以查看mod_rewrite 以自动将使用http:// 的任何请求重定向到https://,至少对于您的登录页面。

【讨论】:

  • 只要表单投递到https,表单本身是否在非https页面无所谓。
  • 诚然,登陆页面的 html 可以被中间人修改,但如果发布到 HTTPS 页面,数据仍然会被加密。为了获得最佳实践,我通常会强制整个站点使用 SSL,而不仅仅是特定页面。按照该指南,您也应该在 https 上制作登录表单。
【解决方案3】:
if($requireSSL && $_SERVER['SERVER_PORT'] != 443) {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit();
}

【讨论】:

    【解决方案4】:

    假设你的登录表单页面是由index.php生成的,你需要将HTTP到HTTPS重定向的示例代码放在index.php中。这将确保当用户填写表单并提交时,它通过 HTTPS 而不是 HTTP 提交给/login.php

    将此检查放入login.php 是徒劳的,因为当login.php 收到请求并尝试重定向到相应的HTTPS URL 时,凭据已经以明文形式提交给它,这正是您应该想要的避免。

    当您将检查放入 login.php 时,您看到 $_SERVER['SERVER_PORT']80$_SERVER["HTTPS"] 未设置,这进一步证明了登录凭据正在通过 HTTP 提交给它这一事实因此登录凭据从未加密的客户端到达您的服务器。必须遵循我在本回复第一段中所说的内容来避免这种情况。

    顺便说一句,我不会使用 PHP 进行这种重定向。 Apache HTTPD 中的mod_rewrite 可以非常方便地处理此类重定向。

    一个示例,假设您的登录页面在 URL http://example.com/foo/ 上可用:

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^foo/$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 2013-04-10
      • 2011-03-20
      • 2016-09-16
      • 2018-03-19
      相关资源
      最近更新 更多