67
67
68
68
URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基本都是 URL。
69
69
70
- <div align =" center " > <img src =" ../pics//url_diagram.png " width =" " /> </div ><br >
70
+ <div align =" center " > <img src =" ../pics//f716427a-94f2-4875-9c86-98793cf5dcc3.jpg " width =" 400 " /> </div ><br >
71
71
72
72
## 请求和响应报文
73
73
@@ -97,6 +97,10 @@ POST 主要目的不是获取资源,而是传输存储在内容实体中的数
97
97
98
98
GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在内容实体。
99
99
100
+ GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 中是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。
101
+
102
+ GET 和 POST 的另一个区别是,使用 GET 方法,浏览器会把 HTTP Header 和 Data 一并发送出去,服务器响应 200(OK)并返回数据。而使用 POST 方法,浏览器先发送 Header,服务器响应 100(Continue)之后,浏览器再发送 Data,最后服务器响应 200(OK)并返回数据。
103
+
100
104
```
101
105
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
102
106
```
@@ -107,10 +111,6 @@ Host: w3schools.com
107
111
name1=value1&name2=value2
108
112
```
109
113
110
- GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 中是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。
111
-
112
- GET 和 POST 的另一个区别是,使用 GET 方法,浏览器会把 HTTP Header 和 Data 一并发送出去,服务器响应 200(OK)并返回数据。而使用 POST 方法,浏览器先发送 Header,服务器响应 100(Continue)之后,浏览器再发送 Data,最后服务器响应 200(OK)并返回数据。
113
-
114
114
## HEAD
115
115
116
116
> 获取报文首部
@@ -172,7 +172,7 @@ DELETE /file.html HTTP/1.1
172
172
173
173
> 要求用隧道协议连接代理
174
174
175
- 要求在于代理服务器通信时建立隧道 ,使用 SSL(Secure Sokets Layer,安全套接字 )和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
175
+ 要求在与代理服务器通信时建立隧道 ,使用 SSL(Secure Sockets Layer,安全套接层 )和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
176
176
177
177
``` html
178
178
CONNECT www.example.com:443 HTTP/1.1
@@ -342,7 +342,16 @@ Host: www.example.org
342
342
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
343
343
```
344
344
345
- ### 2. Set-Cookie
345
+ ### 2. 分类
346
+
347
+ - 会话期 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。
348
+ - 持久性 Cookie:指定一个特定的过期时间(Expires)或有效期(Max-Age)之后就成为了持久性的 Cookie。
349
+
350
+ ``` html
351
+ Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
352
+ ```
353
+
354
+ ### 3. Set-Cookie
346
355
347
356
| 属性 | 说明 |
348
357
| :--: | -- |
@@ -353,18 +362,20 @@ Cookie: yummy_cookie=choco; tasty_cookie=strawberry
353
362
| Secure | 仅在 HTTPs 安全通信时才会发送 Cookie |
354
363
| HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 |
355
364
356
- ### 3 . Session 和 Cookie 区别
365
+ ### 4 . Session 和 Cookie 区别
357
366
358
367
Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID。HTTP 就是通过 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的,Session 用于服务器端,Cookie 用于客户端。
359
368
360
- ### 4 . 浏览器禁用 Cookie 的情况
369
+ ### 5 . 浏览器禁用 Cookie 的情况
361
370
362
371
会使用 URL 重写技术,在 URL 后面加上 sid=xxx 。
363
372
364
- ### 5 . 使用 Cookie 实现用户名和密码的自动填写
373
+ ### 6 . 使用 Cookie 实现用户名和密码的自动填写
365
374
366
375
网站脚本会自动从保存在浏览器中的 Cookie 读取用户名和密码,从而实现自动填写。
367
376
377
+ 但是如果 Set-Cookie 指定了 HttpOnly 属性,就无法通过 Javascript 脚本获取 Cookie 信息,这是出于安全性考虑。
378
+
368
379
## 缓存
369
380
370
381
### 1. 优点
@@ -448,7 +459,7 @@ Content-Type: text/plain
448
459
449
460
如果网络出现中断,服务器只发送了一部分数据,范围请求使得客户端能够只请求未发送的那部分数据,从而避免服务器端重新发送所有数据。
450
461
451
- 在请求报文首部中添加 Range 字段,然后指定请求的范围,例如 Range : bytes =5001-10000。 请求成功的话服务器发送 206 Partial Content 状态。
462
+ 在请求报文首部中添加 Range 字段指定请求的范围, 请求成功的话服务器发送 206 Partial Content 状态。
452
463
453
464
``` html
454
465
GET /z4d4kWk.jpg HTTP/1.1
@@ -504,9 +515,11 @@ HTTP 有以下安全性问题:
504
515
2 . 不验证通信方的身份,通信方的身份有可能遭遇伪装;
505
516
3 . 无法证明报文的完整性,报文有可能遭篡改。
506
517
507
- HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,再由 SSL 和 TCP 通信。通过使用 SSL,HTTPs 提供了加密、认证和完整性保护 。
518
+ HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,再由 SSL 和 TCP 通信。也就是说使用了隧道进行通信 。
508
519
509
- <div align =" center " > <img src =" ../pics//ssl-offloading.jpg " width =" " /> </div ><br >
520
+ 通过使用 SSL,HTTPs 具有了加密、认证和完整性保护。
521
+
522
+ <div align =" center " > <img src =" ../pics//ssl-offloading.jpg " width =" 700 " /> </div ><br >
510
523
511
524
## 加密
512
525
@@ -521,7 +534,7 @@ HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信
521
534
522
535
### 2. 公开密钥
523
536
524
- (Public-Key Encryption)而公开密钥加密使用一对密钥用于加密和解密 ,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
537
+ (Public-Key Encryption),使用一对密钥用于加密和解密 ,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
525
538
526
539
- 优点:更为安全;
527
540
- 缺点:运算速度慢;
@@ -530,25 +543,26 @@ HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信
530
543
531
544
### 3. HTTPs 采用的加密方式
532
545
533
- HTTPs 采用混合的加密机制,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。
546
+ HTTPs 采用混合的加密机制,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。(下图中的 Session Key 就是对称密钥)
534
547
535
548
<div align =" center " > <img src =" ../pics//How-HTTPS-Works.png " width =" 600 " /> </div ><br >
536
549
537
550
## 认证
538
551
539
552
通过使用 ** 证书** 来对通信方进行认证。
540
553
541
- <div align =" center " > <img src =" ../pics//mutualssl_small.png " width =" " /> </div ><br >
542
554
543
555
数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。服务器的运营人员向 CA 提出公开密钥的申请,CA 在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公开密钥证书后绑定在一起。
544
556
545
557
进行 HTTPs 通信时,服务器会把证书发送给客户端,客户端取得其中的公开密钥之后,先进行验证,如果验证通过,就可以开始通信。
546
558
559
+ <div align =" center " > <img src =" ../pics//mutualssl_small.png " width =" " /> </div ><br >
560
+
547
561
使用 OpenSSL 这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。浏览器在访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。
548
562
549
563
## 完整性
550
564
551
- SSL 提供摘要功能来验证完整性 。
565
+ SSL 提供报文摘要功能来验证完整性 。
552
566
553
567
# 七、Web 攻击技术
554
568
@@ -733,3 +747,4 @@ HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。
733
747
- [ 维基百科:SQL 注入攻击] ( https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A )
734
748
- [ 维基百科:跨站点请求伪造] ( https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0 )
735
749
- [ 维基百科:拒绝服务攻击] ( https://zh.wikipedia.org/wiki/%E9%98%BB%E6%96%B7%E6%9C%8D%E5%8B%99%E6%94%BB%E6%93%8A )
750
+ - [ What is the difference between a URI, a URL and a URN?] ( https://stackoverflow.com/questions/176264/what-is-the-difference-between-a-uri-a-url-and-a-urn )
0 commit comments