深入HTTP协议


协议的表达方式

什么是协议?

网络传输协议或简称为传送协议(Communications Protocol),是指计算机通信或网络设备的共同语言。

协议一般都包括哪些内容?

如何创建一个协议?


HTTP协议的作用

我们可以用HTTP协议做什么事情?

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是互联网上应用最为广泛的一种网络协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。


HTTP协议包括的内容

HTTP协议的执行流程是什么?

  1. 连接 当我们输入这样一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的,所以之前还有一个DNS解析过程,把www.mycompany.com 变成ip,如果url里不包含端口号,则会使用该协议的默认端口号。
  2. 请求 连接成功建立后,开始向web服务器发送请求
  3. 应答 web服务器收到这个请求,进行处理。
  4. 关闭连接:当应答结束后,Web浏览器与Web服务器断开连接

HTTP协议包括哪些内容?

  1. 请求报文
  2. 响应报文

HTTP协议格式是什么样的?

Client request

GET /index.html HTTP/1.1
Host: www.example.com

Server response

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
ETag: "3f80f-1b6-3e1cb03b"
Content-Type: text/html; charset=UTF-8
Content-Length: 131
Accept-Ranges: bytes
Connection: close

<html>
<head>
  <title>An Example Page</title>
  </head>
  <body>
  Hello World, this is a very simple HTML document.
  </body>
</html>

HTTP协议中的头域有哪些内容?

通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via

HTTP协议中的状态码有哪些?

1xx消息
这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。 这些状态码代表的响应都是信息性的,标示客户应该采取的其他行动。

2xx成功
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。

3xx重定向
这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。 当且仅当后续的请求所使用的方法是GET或者HEAD时,用户浏览器才可以在没有用户介入的情况下自动提交所需要的后续请求。客户端应当自动监测无限循环重定向(例如:A→B→C→……→A或A→A),因为这会导致服务器和客户端大量不必要的资源消耗。按照HTTP/1.0版规范的建议,浏览器不应自动访问超过5次的重定向。

4xx客户端错误
这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。 如果错误发生时客户端正在传送数据,那么使用TCP的服务器实现应当仔细确保在关闭客户端与服务器之间的连接之前,客户端已经收到了包含错误信息的数据包。如果客户端在收到错误信息后继续向服务器发送数据,服务器的TCP栈将向客户端发送一个重置数据包,以清除该客户端所有还未识别的输入缓冲,以免这些数据被服务器上的应用程序读取并干扰后者。

5xx服务器错误
这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。 这些状态码适用于任何响应方法。

HTTP协议中GET和POST有什么不一样?

根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的 。 根据HTTP规范,POST表示可能修改变服务器上的资源的请求 。 POST的安全性要比GET的安全性高。


COOKIE和SESSION

COOKIE是什么?

Cookie(复数形态Cookies),中文名称为小型文本文件或小甜饼[1],指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。

COOKIE在两个不同的子域名a.abc.com和b.abc.com中可以相互调用吗?

Cookies域设置为abc.com或.abc.com

COOKIE的存储是安全的吗?

SESSION是什么?

会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。

SESSION是怎么工作的?

PHP会用session_start()函数为用户创建一个session ID,这就是针对这个用户的唯一标识,每一个访问的用户都会得到一个自己独有的session ID,这个session ID会存放在响应头里的cookie中,之后发送给客户端。这样客户端就会拥有一个该站点给他的session ID。

当用户第二次访问该站点时,浏览器会带着本地存放的cookie(里面存有上次得到的session ID)随着请求一起发送到服务器,服务端接到请求后会检测是否有session ID,如果有就会找到响应的session文件,把其中的信息读取出来;如果没有就跟第一次一样再创建个新的。

SESSION存储在哪里?存储的格式是怎么样的呢?

session.save_path session_set_save_handler

session.serialize_handler 定义用来序列化/解序列化的处理器名字。当前支持 PHP 内部格式(名为 php)和 WDDX(名为 wddx)。如果 PHP 编译时加入了 WDDX 支持,则只能用 WDDX。默认为 php。

SESSION和COOKIE是什么关系?

session实际上是依赖与cookie的,当用户访问某一站点时,浏览器会根据用户访问的站点自动搜索可用的cooki

如何设置SESSION严格的过期时间?

  1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.
  2. 自己为每一个Session值增加Time stamp.
  3. 每次访问之前, 判断时间戳.

多服务器之间SESSION如何共享?

  1. 不使用session,换作cookie
  2. 应用服务器自行实现共享,用数据库或memcached来保存session
  3. nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端
  4. upstream_hash

HTTP性能优化

跟缓存相关的头域有哪些?

Request

Response

如何在PHP中设置分块传输?

ob_flush() 与 flush() 将缓冲区的内容提前输出,浏览器可提早加载这部分的内容,无需等待所有输出完成再加载。

如何在PHP中设置只读请求实体内容的前512个字符?

fgets($a,512);

如何用压缩内容,浏览器怎么知道如何解压缩?

Request: Accept-Encoding:gzip

Response: Content-Encoding: gzip


HTTP安全

如何避免XSS攻击?

XSS 全称为 Cross Site Scripting,因为 CSS 已经用作样式表的简称,故称为 XSS。 XSS 是一种常见的网站攻击的方法。其原理是通过在网页的输入框输入一些恶意的内容,通常是 JavaScript 脚本片段,而这些恶意输入在提交之后并重新读回到客户端时,浏览器会解释执行这些恶意的脚本内容,从而影响网页的正常显示。

  1. 过滤特殊字符

避免XSS的方法之一主要是将用户所提供的内容进行过滤,Go语言提供了HTML的过滤函数:

text/template包下面的HTMLEscapeString、JSEscapeString等函数

  1. 使用HTTP头指定类型

w.Header().Set(“Content-Type”,”text/javascript”)

这样就可以让浏览器解析javascript代码,而不会是html输出。

如何避免csrf攻击?

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

  1. 验证 HTTP Referer 字段
  2. 在请求地址中添加 token 并验证
  3. 在 HTTP 头中自定义属性并验证

如何避免sniffer?

Sniffer,中文可以翻译为嗅探器,是一种基于被动侦听原理的网络分析方式。使用这种技术方式,可以监视网络的状态、数据流动情况以及网络上传输的信息。

  1. 使用检测工具 Tripwire
  2. 会话加密 https
  3. 注意网络异常 ping掉包

参考

HTTP - Hypertext Transfer Protocol
如何设置一个严格30分钟过期的Session
浏览器缓存机制
HTTP协议 (四) 缓存
启用动态 HTTP 压缩
使用 PHP 构建的 Web 应用如何避免 XSS 攻击
避免XSS攻击
从新浪微博被攻击事件看SNS网站的安全问题
CSRF 攻击的应对之道
预防CSRF攻击

Yan Peipan 28 December 2014