Skip to content

Commit caad51a

Browse files
authored
Merge pull request #2 from CyC2018/master
update
2 parents d47b6f8 + 286d54f commit caad51a

File tree

151 files changed

+194
-164
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

151 files changed

+194
-164
lines changed

notes/HTTP.md

+32-17
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767

6868
URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基本都是 URL。
6969

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>
7171

7272
## 请求和响应报文
7373

@@ -97,6 +97,10 @@ POST 主要目的不是获取资源,而是传输存储在内容实体中的数
9797

9898
GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在内容实体。
9999

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+
100104
```
101105
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
102106
```
@@ -107,10 +111,6 @@ Host: w3schools.com
107111
name1=value1&name2=value2
108112
```
109113

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-
114114
## HEAD
115115

116116
> 获取报文首部
@@ -172,7 +172,7 @@ DELETE /file.html HTTP/1.1
172172

173173
> 要求用隧道协议连接代理
174174
175-
要求在于代理服务器通信时建立隧道,使用 SSL(Secure Sokets Layer,安全套接字)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
175+
要求在与代理服务器通信时建立隧道,使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
176176

177177
```html
178178
CONNECT www.example.com:443 HTTP/1.1
@@ -342,7 +342,16 @@ Host: www.example.org
342342
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
343343
```
344344

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
346355

347356
| 属性 | 说明 |
348357
| :--: | -- |
@@ -353,18 +362,20 @@ Cookie: yummy_cookie=choco; tasty_cookie=strawberry
353362
| Secure | 仅在 HTTPs 安全通信时才会发送 Cookie |
354363
| HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 |
355364

356-
### 3. Session 和 Cookie 区别
365+
### 4. Session 和 Cookie 区别
357366

358367
Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID。HTTP 就是通过 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的,Session 用于服务器端,Cookie 用于客户端。
359368

360-
### 4. 浏览器禁用 Cookie 的情况
369+
### 5. 浏览器禁用 Cookie 的情况
361370

362371
会使用 URL 重写技术,在 URL 后面加上 sid=xxx 。
363372

364-
### 5. 使用 Cookie 实现用户名和密码的自动填写
373+
### 6. 使用 Cookie 实现用户名和密码的自动填写
365374

366375
网站脚本会自动从保存在浏览器中的 Cookie 读取用户名和密码,从而实现自动填写。
367376

377+
但是如果 Set-Cookie 指定了 HttpOnly 属性,就无法通过 Javascript 脚本获取 Cookie 信息,这是出于安全性考虑。
378+
368379
## 缓存
369380

370381
### 1. 优点
@@ -448,7 +459,7 @@ Content-Type: text/plain
448459

449460
如果网络出现中断,服务器只发送了一部分数据,范围请求使得客户端能够只请求未发送的那部分数据,从而避免服务器端重新发送所有数据。
450461

451-
在请求报文首部中添加 Range 字段,然后指定请求的范围,例如 Range:bytes=5001-10000。请求成功的话服务器发送 206 Partial Content 状态。
462+
在请求报文首部中添加 Range 字段指定请求的范围,请求成功的话服务器发送 206 Partial Content 状态。
452463

453464
```html
454465
GET /z4d4kWk.jpg HTTP/1.1
@@ -504,9 +515,11 @@ HTTP 有以下安全性问题:
504515
2. 不验证通信方的身份,通信方的身份有可能遭遇伪装;
505516
3. 无法证明报文的完整性,报文有可能遭篡改。
506517

507-
HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,再由 SSL 和 TCP 通信。通过使用 SSL,HTTPs 提供了加密、认证和完整性保护
518+
HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,再由 SSL 和 TCP 通信。也就是说使用了隧道进行通信
508519

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>
510523

511524
## 加密
512525

@@ -521,7 +534,7 @@ HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信
521534

522535
### 2. 公开密钥
523536

524-
(Public-Key Encryption)而公开密钥加密使用一对密钥用于加密和解密,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
537+
(Public-Key Encryption),使用一对密钥用于加密和解密,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
525538

526539
- 优点:更为安全;
527540
- 缺点:运算速度慢;
@@ -530,25 +543,26 @@ HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信
530543

531544
### 3. HTTPs 采用的加密方式
532545

533-
HTTPs 采用混合的加密机制,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。
546+
HTTPs 采用混合的加密机制,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。(下图中的 Session Key 就是对称密钥)
534547

535548
<div align="center"> <img src="../pics//How-HTTPS-Works.png" width="600"/> </div><br>
536549

537550
## 认证
538551

539552
通过使用 **证书** 来对通信方进行认证。
540553

541-
<div align="center"> <img src="../pics//mutualssl_small.png" width=""/> </div><br>
542554

543555
数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。服务器的运营人员向 CA 提出公开密钥的申请,CA 在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公开密钥证书后绑定在一起。
544556

545557
进行 HTTPs 通信时,服务器会把证书发送给客户端,客户端取得其中的公开密钥之后,先进行验证,如果验证通过,就可以开始通信。
546558

559+
<div align="center"> <img src="../pics//mutualssl_small.png" width=""/> </div><br>
560+
547561
使用 OpenSSL 这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。浏览器在访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。
548562

549563
## 完整性
550564

551-
SSL 提供摘要功能来验证完整性
565+
SSL 提供报文摘要功能来验证完整性
552566

553567
# 七、Web 攻击技术
554568

@@ -733,3 +747,4 @@ HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。
733747
- [维基百科: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)
734748
- [维基百科:跨站点请求伪造](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0)
735749
- [维基百科:拒绝服务攻击](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)

notes/Java 基础.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ public static void main(java.lang.String[]);
503503

504504
每个类都有一个 **Class** 对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象。
505505

506-
类加载相当于 Class 对象的加载。类在第一次使用时才动态加载到 JVM 中,可以使用 Class.forName('com.mysql.jdbc.Driver.class') 这种方式来控制类的加载,该方法会返回一个 Class 对象。
506+
类加载相当于 Class 对象的加载。类在第一次使用时才动态加载到 JVM 中,可以使用 Class.forName("com.mysql.jdbc.Driver") 这种方式来控制类的加载,该方法会返回一个 Class 对象。
507507

508508
反射可以提供运行时的类信息,并且这个类可以在运行时才加载进来,甚至在编译时期该类的 .class 不存在也可以加载进来。
509509

0 commit comments

Comments
 (0)