图解HTTP
。
实体主体:应该是未压缩时的数据
报文主体:应该是压缩后的数据,
多部分对象集合
描述数据类型时,使用multipart格式。
- multipart/form-data 在 Web 表单文件上传时使用。
- multipart/byteranges 状态码 206(Partial Content,部分内容)响应报文包含了多个范 围的内容时使用。
状态码
200
表示从客户端发来的请求在服务器端被正常处理了。
204
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中 不含实体的主体部分。
206
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。
3XX 重定向
3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请 求。
301 Moved Permanently
永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后 应使用资源现在所指的 URI。
302 Found
和 301 Moved Permanently 状态码相似,但 302 状态码代表的资源不 是被永久移动,只是临时性质的。
303 See Other
该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。
303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确 表示客户端应当采用 GET 方法获取资源,302并没有这个要求。
当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次 发送。 301、302 标准是禁止将 POST 方法改变成 GET 方法的,但实际使用时大家都会这么做。
304 Not Modified
如果客户端发送内容有这些首部: If-Match,If-Modified Since,If-None-Match,If-Range,If-Unmodified-Since。经过服务器检查不符合条件,就会返回304,报文主体不包含内容,否则会正常返回。
比如客户端发送if-Modified Since,服务器检查发现没有更改,则不符合条件,会发送304。
307 Temporary Redirect
该状态码与 302 Found 有着相同的含义。尽管 302 标准禁止 POST 变换成 GET,但实际使用时大家并不遵守。 307 会遵照浏览器标准,不会从 POST 变成 GET。但是,对于处理响 应时的行为,每种浏览器有可能出现不同的情况。
4XX 客户端错误
4XX 的响应结果表明客户端是发生错误的原因所在。
400 Bad Request
该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求 的内容后再次发送请求。
401 Unauthorized
该状态码表示发送的请求需要有通过 HTTP 认证。
403 Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。
404 Not Found
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服 务器端拒绝请求且不想说明理由时使用。
5XX 服务器错误
5XX 的响应结果表明服务器本身发生错误。
500 Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。
503 Service Unavailable
该状态码表明服务器暂时处于超负载或正在进行停机维护,
Web服务器
代理
转发时,需要附加 Via 首部字段以标记出经过的主机信息。

代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一 种是是否会修改报文。
缓存代理:缓存代理会预先将资源的副本 (缓存)保存在代理服务器上。
透明代理:不对报文做任何加工的代理类型被称为透明代理 。反之,对报文内容进行加工的代理被称为非透明代理。
网关
与代理很类似,但网关可以使用非HTTP协议通信,而代理只是简单的转发包。

隧道
隧道可按要求建立起一条与其他服务器的通信线路
HTTP首部
HTTP报文首部


HTTP首部字段
报文首部 = 首部字段 + 请求行/状态行
格式:HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分 隔。
4 种 HTTP 首部字段类型
通用首部字段(General Header Fields),请求报文和响应报文两方都会使用的首部。
请求首部字段(Request Header Fields),从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加 内容、客户端信息、响应内容相关优先级等信息。
响应首部字段(Response Header Fields),从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加 内容,也会要求客户端附加额外的内容信息。
实体首部字段(Entity Header Fields),针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更 新时间等与实体有关的信息。
HTTP/1.1 通用首部字段
Cache-Control

no-cache:强制向源服务器再次验证
no-store:不缓存请求(真正意义上的不缓存)
private:仅向特定用户返回响应
max-age :响应的最大Age值(经过这么多时间,缓存过期)
s-maxage :公共缓存服务器(代理)响应的最大Age值
min-fresh:要求缓存服务器返回至少还未过指定时间的缓存资源。
max-state: max-stale 可指示缓存资源,即使过期也照常接收。
only-if-cached : 只要缓存服务器有数据,就返回数据。
must-revalidate:强调一旦缓存过期,必须重新验证内容。
no-transform 指令:使用 no-transform 指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。
Connection
Connection 首部字段具备如下两个作用。:控制不再转发给代理的首部字段、管理持久连接,Connection: Keep-Alive
Date
表明创建 HTTP 报文的日期和时间。
Trailer
首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。该 首部字段可应用在 HTTP/1.1 版本分块传输编码时。
1 | HTTP/1.1 200 OK |
以上用例中,指定首部字段 Trailer 的值为 Expires,在报文主体之后(分块长度 0 之后)出现了首部字段 Expires。
Transfer-Encoding
规定了传输报文主体时采用的编码方式,通常指定 Transfer-Encoding: chunked
来标识报文主体是分块的,
这个Transfer-Encoding很有误导性,他不是编码,只是一种传输机制。Content-Encoding才是编码。
请求首部字段
Accept
可使用 type/subtype 这种形式,一次指定多种媒 体类型,每个媒体有一个q值,范围是0-1,默认是1,越大优先级越高,用分号(;)进行分隔。如:Accept: text/plain; q=0.3, text/htm
,表示第一优先级是html,第二优先级是plain。
Accept-Charset
Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集及 字符集的相对优先顺序。
Accept-Encoding
Accept-Encoding 首部字段用来告知服务器用户代理(浏览器)支持的内容编码及 内容编码的优先级顺序。
Accept-Language
告知服务器用户代理能够处理的自然 语言集(指中文或英文等)
Authorization
首部字段 Authorization 是用来告知服务器,用户代理的认证信息(证 书值)。通常,想要通过服务器认证的用户代理会在接收到返回的 401 状态码响应后,把首部字段 Authorization 加入请求中。

Expect
From
首部字段 From 用来告知服务器使用用户代理的用户的电子邮件地 址。
Host
虚拟主机运行在同一个 IP 上,因此使用首部字段 Host 区分是哪一个虚拟主机。
If-Match
服务器上的资源有一个实体标记ETag,如果If-Match的字段值与资源的实体标记匹配时才会执行请求,否则返回412。
If-Modified-Since
如果在 If-Modified-Since 字段指定的日期时间后,资源发生了 更新,服务器会接受请求。如果请求的资源 都没有过更新,则返回状态码 304 Not Modified 的响应。
If-None-Match
只有在 If-None-Match 的字段值与 ETag 值不一致时,可处理 该请求。与 If-Match 首部字段的作用相反
If-Range
If-Range 属于附带条件之一。它告知服务器若指定的 If Range 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一 致时,则作为范围请求处理。反之,则返回全体资源。

If-Unmodified-Since
指定的请求资源只有在字段值内指定 的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定 日期时间后发生了更新,则以状态码 412 Precondition Failed 作为响应 返回。
If-Modified-Since使用场景: 主要用于 GET 或 HEAD 请求,用来判断资源是否需要更新。
If-Unmodified-Since使用场景: 主要用于 POST、PUT 等非安全方法,用来判断资源是否可以被修改。
Max-Forwards
类似于IP协议的TTL。服务器在往下一个服务器转发请求之前,Max-Forwards 的 值减 1 后重新赋值。当服务器接收到 Max-Forwards 值为 0 的请求 时,则不再进行转发,而是直接返回响应。
Proxy-Authorization
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段 Proxy-Authorization 的请求,以告知服务器认证所需要的信息。这个行为是与客户端和服务器之间的 HTTP 访问认证相类似的,不同 之处在于,认证行为发生在客户端与代理之间。
Range
接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状 态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返 回状态码 200 OK 的响应及全部资源。
Referer
首部字段 Referer 会告知服务器请求的原始资源的 URI。
TE
TE 是客户端告知服务器(注意方向)能够处理响应的传输编码方式及相对优先级。
Transfer-Encoding 是服务器用来指定数据传输方式的响应头。
User-Agent
User-Agent 用于传达浏览器的种类
响应首部字段
响应首部字段是由服务器端向客户端返回响应报文中所使用的字段, 用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等 信息。
Accept-Ranges
首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请 求,可处理范围请求时指定其为 bytes,反之则 指定其为 none
Age
它表示一个对象(如 HTML 页面、图片等)在代理服务器的缓存中停留的时间,
ETag
服务器会为每份资源分配对应的 ETag 值。
当使用中文版的浏览 器访问 http://www.google.com/ 时,就会返回中文版对应的资源,而 使用英文版的浏览器访问时,则会返回英文版对应的资源。两者的 URI 是相同的,所以仅凭 URI 指定缓存的资源是相当困难的。若在下 载过程中出现连接中断、再连接的情况,都会依照 ETag 值来指定资 源。
强 ETag 值,不论实体发生多么细微的变化都会改变其值。
弱 ETag 值只用于提示资源是否相同。只有资源发生了根本改变,产 生差异时才会改变 ETag 值。
Location
使用首部字段 Location 可以将响应接收方引导至某个与请求 URI 位置 不同的资源。
Proxy-Authenticate
首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送 给客户端。
Retry-After
Server
首部字段 Server 告知客户端当前服务器上安装的 HTTP 服务器应用程 序的信息。
Vary
Vary 字段是 HTTP 响应头中非常重要的一项,它用于指示缓存代理(如浏览器和 CDN)在决定如何缓存响应时需要考虑哪些请求头。简单来说,Vary 字段告诉缓存系统,哪些请求头的不同值会导致(即使URL相同)服务器返回不同的内容。
WWW-Authenticate
它会告知客户端 适用于访问请求 URI 所指定资源的认证方案(Basic 或是 Digest)
实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首 部,用于补充内容的更新时间等与实体相关的信息。
Allow
首部字段 Allow 用于通知客户端能够支持 Request-URI 指定资源的所 有 HTTP 方法。当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 作为响应返回。
Content-Encoding
会告知客户端服务器对实体的主体部分选 用的内容编码方式。
gzip , compress, deflate, identity
Content-Language
Content-Length
Content-Location
首部字段 Content-Location 给出与报文主体部分相对应的 URI。
Content-MD5
为什么二进制数据需要编码在传输,因为如果以ASCII直接读取二进制数据的8个bit,读取的文本有些是不可见的,有些是控制字符,某字符在HTML语言中中有特殊的含义,比如
\n代表数据已经结束
,<, >, &, \t, \n
等,所以说能够传输的数据只有一小部分文本数据,需要将二进制数据变成这种文本数据才行。Base64编码将二进制数据转换为由A-Z、a-z、0-9、+、/组成的字符串,这些字符都是可见的,并且在文本协议中是安全的。
客户端会对接收的报文主体执行相同的 MD5 算法,然后与首 部字段 Content-MD5 的字段值比较
Content-Range
实体主体内对象的媒体类型。
Expires
Last-Modified
Cookie
Set-Cookie

HttpOnly 属性 Cookie 的 HttpOnly 属性是 Cookie 的扩展功能,它使 JavaScript 脚本 无法获得 Cookie。其主要目的为防止跨站脚本攻击(Cross-site scripting,XSS)对 Cookie 的信息窃取。
Cookie
首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支 持时,就会在请求中包含从服务器接收到的 Cookie。接收到多个 Cookie 时,同样可以以多个 Cookie 形式发送。
非标准的首部字段
X-Frame-Options
用于控制网站内容 在其他 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防 止点击劫持(clickjacking)攻击。
X-XSS-Protection
用于控制浏览器 XSS 防护机制的开关
DNT
其中 DNT 是 Do Not Track 的简 称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方 法。
P3P
可以让 Web 网站上 的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的 目的。
安全的HTTPS
如何防止窃听:
通信的加密,通过和SSL或 TLS组合使用,与 SSL 组合使用的 HTTP 被称为 HTTPS。(TLS修复了SSL中存在的许多安全漏洞)
内容的加密
HTTP+ 加密 + 认证 + 完整性保护 =HTTPS
CA验证和签发:
- CA会验证CSR中的信息,确保信息真实可靠。
- 如果验证通过,对要发送的数据进行哈希运算,得到一个固定长度的消息摘要。CA会使用自己的私钥对消息摘要进行签名,生成一个数字签名。
- 这个数字证书包含了公钥、证书所有者信息、签发机构信息(要发送的数据)以及CA的数字签名。

确认访问用户身份的认 证
某些 Web 页面只想让特定的人浏览,或者干脆仅本人可见。为达到 这个目标,必不可少的就是认证功能。下面我们一起来学习一下认证 机制。
何为认证
服务器需要核对只有登陆者本人才知道的信息。
- 密码:只有本人才会知道的字符串信息。
- 动态令牌:仅限本人持有的设备内显示的一次性密码。
- 数字证书:仅限本人(终端)持有的信息。
- 生物认证:指纹和虹膜等本人的生理信息。
- IC 卡等:仅限本人持有的信息。
使用的认证方式如下所示。
- BASIC 认证(基本认证)
- DIGEST 认证(摘要认证)
- SSL 客户端认证
- FormBase 认证(基于表单认证)
BASIC 认证

DIGEST 认证
SSL 客户端认证
从使用用户 ID 和密码的认证方式方面来讲,只要二者的内容正确, 即可认证是本人的行为。但如果用户 ID 和密码被盗,就很有可能被 第三者冒充。利用 SSL 客户端认证则可以避免该情况的发生。
基于表单认证
最常用
Session 管理及 Cookie 应用
用 Cookie 来 管理 Session。(Session可以看成服务器上给一个客户端记录的状态吧,每个状态有一个ID,这些ID会作为Cookie发给客户端)

基于 HTTP 的功能追加协议
使用浏览器进行双向通信的 WebSocket
一旦 Web 服务器与客户端之间建立起 WebSocket 协议的通信连接, 之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送 JSON、XML、HTML 或图片等任意格式的数据。
由于是建立在 HTTP 基础上的协议,因此连接的发起方仍是客户端, 而一旦确立 WebSocket 通信连接,不论服务器还是客户端,任意一方 都可直接向对方发送报文。
主要特点:
- 推送功能,服务器可以主动发送数据
- 减少通信量,首部信息相比HTTP减少了很多。
为了建立WebSocket,在HTTP连接建立后,还需要完成一次握手的步骤。
- 握手请求:为了实现 WebSocket 通信,需要用到 HTTP 的 Upgrade 首部字 段,告知服务器通信协议发生改变,
- 握手响应:对于之前的请求,返回状态码 101 Switching Protocols 的响应

Web 服务器管理文件的 WebDAV
是一个可对 Web 服务器上的内容直接进 行文件复制、编辑等操作的分布式文件系统。
构建Web内容的技术
CGI
CGI(通用网关接口)是指 Web 服务器在 接收到客户端发送过来的请求后转发给程序的一组机制。
因 Java 而普及的 Servlet
CGI,由于每次接到请求,程序都要跟着启动一次。因此 一旦访问量过大,Web 服务器要承担相当大的负载。而 Servlet 运行 在与 Web 服务器相同的进程中,因此受到的负载较小 。
Web的攻击技术
针对 Web 的攻击技术
针对 Web 应用的攻击模式
- 主动攻击:是指攻击者通过直接访问 Web 应用, 把攻击代码传入的攻击模式。如 SQL 注入攻击和 OS 命令注 入攻击。
- 被动攻击:被动攻击是指攻击者通过诱导用户执行恶意操作,从而达到攻击目的的一种手段。与主动攻击直接针对Web应用本身不同,被动攻击更像是“借刀杀人”,利用用户来发起攻击。比如跨站脚本攻击和跨站点请求伪造。
因输出值转义不完全引发的安全漏洞
输入值转义:比如将HTML特殊字符转义为HTML实体。
跨站脚本攻击
如下,地址栏中 URI 的查询字段指定 ID,即相当于在表 单内自动填写字符串的功能。通过这里在页面上运行script代码。

SQL 注入攻击
OS 命令注入攻击
只要在能调用 Shell 函数的地 方就有存在被攻击的风险。