Http 在服务器代码中处理SSL
我想强制HTTP客户端在我的应用程序中切换到HTTPS。默认情况下,键入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
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://
。如果可以的话,还要确保您的用户希望使用HTTPS。只有用户可以检查
正如Eugene在评论中所说的那样,在登录页上也可以通过HTTPS发送表单,这也是一种很好的做法
因为您似乎主要关心使用旧书签访问此页面的用户,所以POST和DELETE无关紧要:他们将使用GET from书签。如果可以,告诉他们更新书签。您还可以使用HSTS或301(永久重定向),浏览器应该记住这一点,以便下次使用地址时它将直接转到
https://
,除非清除其缓存。重定向后的POST行为取决于服务器返回的状态代码。此外,许多浏览器实现了,这可能不完全符合HTTP规范
这就是说:
- 一般避免依赖重定向。(请参阅。)在生产环境中使用重定向并不一定不好,但这适用于直接在位置栏中键入地址的用户。它依赖于这样一种假设,即在进行重定向时不存在MITM。我认为在开发阶段重定向是不好的,因为它们隐藏了潜在的问题
- 永远不要依赖于帖子上的重定向(甚至是URL中包含敏感信息的GET):初始请求(在重定向到HTTPS之前)将以明文形式发送,这与尝试使用HTTPS的目的背道而驰
HTTPS://
。如果可以的话,还要确保您的用户希望使用HTTPS。只有用户可以检查
正如Eugene在评论中所说的那样,在登录页上也可以通过HTTPS发送表单,这也是一种很好的做法
因为你看起来主要是个骗子