加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Web应用安全性: HTTP简介

发布时间:2019-03-13 10:14:53 所属栏目:建站 来源:前端小智
导读:HTTP是一个美好的东西:一个存在了20多年而没有太多变化的协议。 正如我们在前一篇文章中看到的,浏览器通过HTTP协议与web应用程序交互,这是我们深入研究这个主题的主要原因。如果用户在网站上输入他们的信用卡信息,攻击者就能在数据到达服务器之前拦截数
副标题[/!--empirenews.page--]

 Web应用安全性: HTTP简介

HTTP是一个美好的东西:一个存在了20多年而没有太多变化的协议。

正如我们在前一篇文章中看到的,浏览器通过HTTP协议与web应用程序交互,这是我们深入研究这个主题的主要原因。如果用户在网站上输入他们的信用卡信息,攻击者就能在数据到达服务器之前拦截数据,我们肯定会有麻烦。

了解HTTP是如何工作的,我们如何保护客户端和服务器之间的通信,以及该协议提供了哪些与安全相关的特性,这是改进安全状态的第一步。

但是,在讨论HTTP时,我们应该始终区分语义和技术实现,因为它们是HTTP工作方式的两个非常不同的方面。

两者之间的关键区别可以用一个非常简单的类比来解释:20年前,人们像现在一样关心他们的亲人,尽管他们互动的方式已经发生了巨大的变化。我们的父母可能会开着车去他们姐姐家,,这样就能赶上和家人在一起。

相反,现在更常见的是在 WhatsApp 上留言、打电话或使用 Facebook 群组,这在以前是不可能的。这并不是说人们或多或少地交流或关心,而是说他们交流的方式改变了。

HTTP 也不例外:协议背后的语义没有太大的变化,而客户端和服务器之间通信的技术实现已经经过多年的优化。如果您查看 1996 年的 HTTP 请求,它看起来与我们在前一篇文章中看到的请求非常相似,尽管这些数据包通过网络的方式非常不同。

概述

如前所述,HTTP遵循请求/响应模型,其中连接到服务器的客户端发出请求,服务器对其进行响应。

HTTP消息(请求或响应)包含多个部分:

  • 请求行
  • 请求头
  • 请求体

第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本。

  1. GET /players/lebron-james HTTP/1.1 

GET说明请求类型为 GET,/players/lebron-james 为要访问的资源,该行的最后一部分说明使用的是 HTTP1.1 版本。

第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信。

  1. GET /players/lebron-james HTTP/1.1  
  2. Host: nba.com  
  3. Accept: */*  
  4. Coolness: 9000  

例如,在此请求中,客户端已为请求附加了3个附加标头:Host,Accept和 Coolness。

等一下,Coolness 是什么

报头不必使用特定的保留名称,但通常建议依赖于 HTTP 规范标准化的名称:越偏离标准,交换中的另一方就越不理解你。

例如,Cache-Control 是一个头文件,用于定义响应是否是可缓存的:大多数代理和反向代理都完全按照 HTTP 规范来理解它。如果将 Cache-Control 头重命名为 Awesome-Cache-Control,代理将不再知道如何缓存响应,因为它们不是按照你刚刚提出的规范构建的。

但有时候,在消息中包含“自定义”标题可能是有意义的,因为你可能希望添加实际上不属于 HTTP 规范的元数据:服务器可以决定在其响应中包含技术信息,以便客户端可以同时执行请求并获取有关回复的服务器状态的重要信息:

  1. ...  
  2. X-Cpu-Usage: 40%  
  3. X-Memory-Available: 1%  
  4. ...  

使用自定义标头时,始终首选为它们添加一个键,以便它们不会与将来可能成为标准的其他标头冲突:从历史上看,这一直很有效,直到每个人都开始使用“非标准” X 前缀 反过来,这成为常态。 X-Forwarded-For 和 X-Forwarded-Proto标 头是负载平衡器和代理广泛使用和理解的自定义标头的示例,即使它们不是 HTTP 标准的一部分。

如果你需要添加自己的自定义头,那么现在通常最好使用一个自动生成的前缀,例如 Acme-Custom-Header 头或 A-Custom-Header 头。

在标题之后,一个请求可能包含一个主体,它与标题之间用空行隔开:

  1. POST /players/lebron-james/comments HTTP/1.1  
  2. Host: nba.com  
  3. Accept: */*  
  4. Coolness: 9000  
  5. Best Player Ever  

我们的请求完成了:第一行(位置和协议信息)、请求头和请求体。注意,请求体是完全可选的,在大多数情况下,它只在我们想要向服务器发送数据时使用——这就是上面的示例使用 POST 的原因。

响应没有太大的不同:

  1. HTTP/1.1 200 OK  
  2. Content-Type: application/json  
  3. Cache-Control: private, max-age=3600  
  4. {"name": "Lebron James", "birthplace": "Akron, Ohio", ...}  

响应发布的第一个信息是它使用的协议版本以及该响应的状态。请求头也一样,如果需要的话,在正文后面加一个换行符。

如前所述,该协议经过了多次修订,并随着时间的推移添加了一些特性(新的头文件、状态代码等),但是底层结构并没有太大的变化(请求行、请求头和正文)。真正改变的是客户端和服务器如何交换这些消息——让我们更仔细地研究一下。

HTTP vs HTTPS vs H2

HTTP 已经经历了 2 个相当大的语义变化: HTTP/1.0 和 HTTP/1.1。

那,“HTTPS 和 HTTP2 在哪里?”

HTTPS 和 HTTP2 (缩写为 H2)是更多的技术更改,因为它们引入了在互联网上传递消息的新方法,而不会严重影响协议的语义。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读