1

我想强制 HTTP 客户端在我的应用程序中切换到 HTTPS。用户键入www.mysite.com将默认使用 HTTP,但他们需要重定向到 HTTPS。使用旧书签的用户将被重定向到书签页面的 HTTPS 版本。

HSTS (RFC 6797) 一旦被重定向就会有很大帮助。我的问题实际上是关于 HTTP 方法的。

GET并且HEAD肯定应该接受 301/302 重定向,但是POST/PUTDELETE呢?

请参见以下示例:

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;

        if (context.Request.IsSecureConnection) return;

        if (context.Request.HttpMethod == "GET" || context.Request.HttpMethod == "HEAD")
        {
            string redirectUri = context.Request.Url.ToString().Replace("http://", "https://");
            context.Response.RedirectPermanent(redirectUri, true);
        }
        else
        {
            throw new HttpException(403, "SSL Required");
        }
    }

GET 和 HEAD 都通过重定向处理。目前 POST,据我所知,接受 301 重定向作为要完成的 GET 请求,即不会重新发布到 HTTPS 版本。所以这就是为什么在我的代码片段中我最终得到一个 403 代码。

问题是从 HTTP 协议的角度来阅读

除了检查应用程序中的所有表单是否指向 HTTPS,聪明的 HTTP 开发人员应该如何在浏览器将请求定向到普通的旧 HTTP 版本时强制客户端将 POST 请求重定向到页面的 HTTPS 版本?

可能的解决方案

创建一个包含所有表单字段的登录页面,该页面会自动(通过 Javascript 和“如果您没有被重定向,请点击我”按钮)将表单重新发布到目标页面的 HTTPS 版本。

还有其他想法吗?

4

2 回答 2

2

最初,301 和 302 响应旨在保留请求方法和请求正文,以便POST可以正确重定向请求。然而,在实践中,几乎所有的网络浏览器都实现了它们,因此请求方法被更改为GET,因为这通常是人们想要的。

正是出于这个原因,在 HTTP/1.1 中引入了 303 和 307。303 字面意思是请求方法应该被切换到GET,而 307 明确表示该方法被保留,所以你可能想要 307。但是请注意,我从未将 307 用于任何事情,所以我不知道有多好它适用于浏览器和其他用户代理。

不过,你不是让这个问题变得比它需要的更大吗?并不是任何人都可以为 POST 请求添加书签。

于 2012-12-30T16:11:06.040 回答
2

重定向时 POST 的行为取决于服务器返回的状态码。此外,许多浏览器都实现了Post/Redirect/Get 模式,这可能并不完全符合 HTTP 规范。

话虽如此:

  • 一般避免依赖重定向。(请参阅此答案。)在生产中进行重定向不一定是坏事,但这适用于直接在地址栏中键入地址的用户。它依赖于在进行重定向时没有 MITM 的假设。我认为开发阶段的重定向是不好的,因为它们隐藏了潜在的问题。

  • 永远不要依赖 POST 上的重定向(甚至是 URL 中包含敏感信息的 GET):初始请求(在重定向到 HTTPS 之前)无论如何都会以明文形式发送,这违背了尝试使用 HTTPS 的目的。

如果您希望使用 HTTPS,请确保您提供的链接和表单的目标 URL 使用https://. 如果可以的话,还要确保您的用户期望使用 HTTPS。只有用户可以检查。

正如 Eugene 在评论中所说,拥有通过 HTTPS 提供表单的登录页面也是一种好习惯。

由于您似乎主要关注使用旧书签访问此页面的用户,因此 POST 和 DELETE 无关紧要:他们无论如何都会使用 GET from a bookmark。如果可以的话,告诉他们更新他们的书签。您还可以使用浏览器应记住的 HSTS 或 301(永久重定向),以便在https://下次使用该地址时直接转到该地址,除非其缓存被清除。

于 2012-12-30T17:19:46.640 回答