5

我有一个登录表单:

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

有任何想法吗?

谢谢

4

4 回答 4

6

如果您允许他们通过纯 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 上运行您的安全服务器,那么您还可以检查该端口是否为该端口,但$_SERVER['HTTPS']如果使用 SSL,PHP 会将值设置为非空,因此我将检查该端口是否存在最佳实践。

编辑:

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

于 2012-02-03T20:55:43.177 回答
5

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

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

于 2012-02-03T20:58:46.043 回答
5
if($requireSSL && $_SERVER['SERVER_PORT'] != 443) {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit();
}
于 2013-07-30T08:08:06.560 回答
3

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

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

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

顺便说一句,我不会使用 PHP 来做这种重定向。mod_rewrite这种重定向在 Apache HTTPD中非常方便地处理。

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

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^foo/$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
于 2012-02-03T21:01:08.683 回答