Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 在服务器代码中处理SSL_Http_Ssl - Fatal编程技术网

Http 在服务器代码中处理SSL

Http 在服务器代码中处理SSL,http,ssl,Http,Ssl,我想强制HTTP客户端在我的应用程序中切换到HTTPS。默认情况下,键入www.mysite.com的用户将使用HTTP,但他们需要重定向到HTTPS。使用旧书签的用户将被重定向到书签页面的HTTPS版本 HSTS(RFC6797)在重定向后有很大帮助。我的问题实际上是关于HTTP方法的 GET和HEAD当然应该接受301/302重定向,但是POST/PUT和DELETE呢 请参见以下示例: void context_BeginRequest(object sender, EventAr

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

HSTS(RFC6797)在重定向后有很大帮助。我的问题实际上是关于HTTP方法的

GET
HEAD
当然应该接受301/302重定向,但是
POST
/
PUT
DELETE

请参见以下示例:

    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开发人员应该如何在浏览器将POST请求定向到普通的旧HTTP版本时强制客户端将POST请求重定向到页面的HTTPS版本

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


还有其他想法吗?

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

正是出于这个原因,HTTP/1.1中引入了303和307。303字面上的意思是请求方法应该切换到
GET
,而307则明确表示该方法被保留,因此您可能需要307。然而,请注意,我从未将307用于任何用途,因此我无法判断它在浏览器和其他用户代理中的工作情况


不过,你不是把这个问题弄得比实际情况更严重了吗?这并不是说任何人都可以为POST请求添加书签。

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

正是出于这个原因,HTTP/1.1中引入了303和307。303字面上的意思是请求方法应该切换到
GET
,而307则明确表示该方法被保留,因此您可能需要307。然而,请注意,我从未将307用于任何用途,因此我无法判断它在浏览器和其他用户代理中的工作情况


不过,你不是把这个问题弄得比实际情况更严重了吗?这并不是说任何人都可以为POST请求添加书签。

重定向后POST的行为取决于服务器返回的状态代码。此外,许多浏览器实现了,这可能不完全符合HTTP规范

这就是说:

  • 一般避免依赖重定向。(请参阅。)在生产环境中使用重定向并不一定不好,但这适用于直接在位置栏中键入地址的用户。它依赖于这样一种假设,即在进行重定向时不存在MITM。我认为在开发阶段重定向是不好的,因为它们隐藏了潜在的问题

  • 永远不要依赖于帖子上的重定向(甚至是URL中包含敏感信息的GET):初始请求(在重定向到HTTPS之前)将以明文形式发送,这与尝试使用HTTPS的目的背道而驰

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

正如Eugene在评论中所说的那样,在登录页上也可以通过HTTPS发送表单,这也是一种很好的做法


因为您似乎主要关心使用旧书签访问此页面的用户,所以POST和DELETE无关紧要:他们将使用GET from书签。如果可以,告诉他们更新书签。您还可以使用HSTS或301(永久重定向),浏览器应该记住这一点,以便下次使用地址时它将直接转到
https://
,除非清除其缓存。

重定向后的POST行为取决于服务器返回的状态代码。此外,许多浏览器实现了,这可能不完全符合HTTP规范

这就是说:

  • 一般避免依赖重定向。(请参阅。)在生产环境中使用重定向并不一定不好,但这适用于直接在位置栏中键入地址的用户。它依赖于这样一种假设,即在进行重定向时不存在MITM。我认为在开发阶段重定向是不好的,因为它们隐藏了潜在的问题

  • 永远不要依赖于帖子上的重定向(甚至是URL中包含敏感信息的GET):初始请求(在重定向到HTTPS之前)将以明文形式发送,这与尝试使用HTTPS的目的背道而驰

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

正如Eugene在评论中所说的那样,在登录页上也可以通过HTTPS发送表单,这也是一种很好的做法

因为你看起来主要是个骗子