介绍了WebSocket如何建连接、交换数据的底细。

WebSocket:5分钟从入门到精通

2018/01/08 · HTML5 · 1
评论 ·
websocket

原文出处: 程序猿小卡   

一致、内容概览

WebSocket的起,使得浏览器具备了实时双向通信的力量。本文由浅入深,介绍了WebSocket如何建立连接、交换数据的底细,以及数据帧的格式。此外,还简要介绍了针对性WebSocket的安康攻击,以及协和是怎抵抗类似攻击的。

二、什么是WebSocket

HTML5始提供的等同种浏览器与服务器进行全双工通讯的网技术,属于应用层协议。它根据TCP传输协议,并复用HTTP的拉手通道。

本着绝大多数web开发者来说,上面立段描述有点枯燥,其实如果记住几碰:

  1. WebSocket可以当浏览器里以
  2. 支撑双向通信
  3. 应用好简短

1、有哪亮点

说到长,这里的自查自纠参照物是HTTP协议,概括地说就是:支持双向通信,更灵活,更快速,可扩展性更好。

  1. 支撑双向通信,实时性更胜似。
  2. 再好的二进制支持。
  3. 正如少之操纵支出。连接创建后,ws客户端、服务端进行数据交换时,协议决定的数码包头部较小。在未分包头部的状下,服务端到客户端的包头只生2~10字节(取决于数量包长度),客户端到劳动端的吧,需要添加额外的4字节的掩码。而HTTP协议每次通信都需带完整的头颅。
  4. 支持扩大。ws协商定义了扩大,用户可扩大协议,或者实现由定义之子协议。(比如支持自定义压缩算法等)

对此背后两碰,没有研究过WebSocket协议正式之同学或知道起来不够直观,但无影响对WebSocket的就学和下。

2、需要上学怎样东西

本着纱应用层协议的念吧,最要的累就是连接起过程数据交换教程。当然,数据的格式是避开不掉的,因为它们直接决定了商讨本身的力量。好之数格式会给协议还敏捷、扩展性更好。

下文主要围绕下几乎沾进行:

  1. 如何树立连接
  2. 如何交换数据
  3. 多少帧格式
  4. 何以保持连接

其三、入门例子

于业内介绍协议细节前,先来拘禁一个简单易行的例证,有只直观感受。例子包括了WebSocket服务端、WebSocket客户端(网页端)。完整代码可以当
这里
找到。

此地服务端用了ws这个库房。相比大家熟悉的socket.iows心想事成再轻量,更符合学习之目的。

1、服务端

代码如下,监听8080端口。当起新的总是要到达时,打印日志,同时向客户端发送信息。当收到到自客户端的消息不时,同样打印日志。

var app = require(‘express’)(); var server =
require(‘http’).Server(app); var WebSocket = require(‘ws’); var wss =
new WebSocket.Server({ port: 8080 }); wss.on(‘connection’, function
connection(ws) { console.log(‘server: receive connection.’);
ws.on(‘message’, function incoming(message) { console.log(‘server:
received: %s’, message); }); ws.send(‘world’); }); app.get(‘/’, function
(req, res) { res.sendfile(__dirname + ‘/index.html’); });
app.listen(3000);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var app = require(‘express’)();
var server = require(‘http’).Server(app);
var WebSocket = require(‘ws’);
 
var wss = new WebSocket.Server({ port: 8080 });
 
wss.on(‘connection’, function connection(ws) {
    console.log(‘server: receive connection.’);
    
    ws.on(‘message’, function incoming(message) {
        console.log(‘server: received: %s’, message);
    });
 
    ws.send(‘world’);
});
 
app.get(‘/’, function (req, res) {
  res.sendfile(__dirname + ‘/index.html’);
});
 
app.listen(3000);

2、客户端

代码如下,向8080端口发起WebSocket连接。连接起后,打印日志,同时为服务端发送信息。接收到来自服务端的信继,同样打印日志。

1
 

3、运行结果

而是分别查看服务端、客户端的日记,这里不开展。

服务端输出:

server: receive connection. server: received hello

1
2
server: receive connection.
server: received hello

客户端输出:

client: ws connection is open client: received world

1
2
client: ws connection is open
client: received world

季、如何建立连接

前提到,WebSocket复用了HTTP的拉手通道。具体指的凡,客户端通过HTTP请求与WebSocket服务端协商升级协议。协议升级好后,后续的数据交换则依照WebSocket的协商。

1、客户端:申请协议升级

首先,客户端发起协议升级要。可以看出,采用的凡正统的HTTP报文格式,且仅支持GET方法。

GET / HTTP/1.1 Host: localhost:8080 Origin: http://127.0.0.1:3000
Connection: Upgrade Upgrade: websocket Sec-WebSocket-Version: 13
Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==

1
2
3
4
5
6
7
GET / HTTP/1.1
Host: localhost:8080
Origin: http://127.0.0.1:3000
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==

要呼吁首部意义如下:

  • Connection: Upgrade:表示要提升协议
  • Upgrade: websocket:表示一旦升级到websocket协商。
  • Sec-WebSocket-Version: 13:表示websocket的版本。如果服务端不支持该版,需要返回一个Sec-WebSocket-Versionheader,里面富含服务端支持的版本号。
  • Sec-WebSocket-Key:与背后服务端响应首部的Sec-WebSocket-Accept大凡配套的,提供基本的备,比如恶意的连天,或者无意的连日。

小心,上面请求省略了部分非重点请求首部。由于是规范的HTTP请求,类似Host、Origin、Cookie等要首部会照常发送。在握手阶段,可以透过相关请求首部进行
安全范围、权限校验等。

2、服务端:响应协议升级

服务端返回内容如下,状态代码101代表协议切换。到之就协商升级,后续之数码交互都以新的合计来。

HTTP/1.1 101 Switching Protocols Connection:Upgrade Upgrade: websocket
Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=

1
2
3
4
HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=

备注:每个header都以\r\n终极,并且最后一行加上一个外加的空行\r\n。此外,服务端回应的HTTP状态码只能当握手阶段采用。过了拉手阶段后,就只能使用一定的错误码。

3、Sec-WebSocket-Accept的计算

Sec-WebSocket-Accept据悉客户端请求首部的Sec-WebSocket-Key计算出来。

计算公式为:

  1. Sec-WebSocket-Key258EAFA5-E914-47DA-95CA-C5AB0DC85B11拼接。
  2. 经SHA1计量起摘要,并转成base64字符串。

伪代码如下:

>toBase64( sha1( Sec-WebSocket-Key +
258EAFA5-E914-47DA-95CA-C5AB0DC85B11 ) )

1
>toBase64( sha1( Sec-WebSocket-Key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 )  )

征下面前的回结果:

const crypto = require(‘crypto’); const magic =
‘258EAFA5-E914-47DA-95CA-C5AB0DC85B11’; const secWebSocketKey =
‘w4v7O6xFTi36lq3RNcgctw==’; let secWebSocketAccept =
crypto.createHash(‘sha1’) .update(secWebSocketKey + magic)
.digest(‘base64’); console.log(secWebSocketAccept); //
Oy4NRAQ13jhfONC7bP8dTKb4PTU=

1
2
3
4
5
6
7
8
9
10
const crypto = require(‘crypto’);
const magic = ‘258EAFA5-E914-47DA-95CA-C5AB0DC85B11’;
const secWebSocketKey = ‘w4v7O6xFTi36lq3RNcgctw==’;
 
let secWebSocketAccept = crypto.createHash(‘sha1’)
    .update(secWebSocketKey + magic)
    .digest(‘base64’);
 
console.log(secWebSocketAccept);
// Oy4NRAQ13jhfONC7bP8dTKb4PTU=

五、数据帧格式

客户端、服务端数据的置换,离不上马数帧格式的定义。因此,在实质上讲解数据交换之前,我们先行来拘禁下WebSocket的数额帧格式。

WebSocket客户端、服务端通信的极致小单位是帧(frame),由1单或多单帧组成一长达完整的信(message)。

  1. 发送端:将消息切割成多单帧,并发送给服务端;
  2. 接收端:接收消息帧,并以涉嫌的帧重新组装成完全的音;

本节底重要性,就是教授数据帧的格式。详细定义可参考 RFC6455
5.2节 。

1、数据帧格式概览

下面为出了WebSocket数据帧的合格式。熟悉TCP/IP协议的同窗对这样的觊觎应该无生疏。

  1. 从左到右,单位凡比特。比如FINRSV1各占据1比特,opcode占据4比特。
  2. 情节囊括了标识、操作代码、掩码、数据、数据长度等。(下同样稍稍节会展开)

0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+——-+-+————-+——————————-+
|F|R|R|R| opcode|M| Payload len | Extended payload length | |I|S|S|S|
(4) |A| (7) | (16/64) | |N|V|V|V| |S| | (if payload len==126/127) | |
|1|2|3| |K| | | +-+-+-+-+——-+-+————-+ – – – – – – – – – – –

          • | Extended payload length continued, if payload len == 127 | +
              • – – – – – – – – – +——————————-+ |
                |Masking-key, if MASK set to 1 |
                +——————————-+——————————-+ |
                Masking-key (continued) | Payload Data |
                +——————————– – – – – – – – – – – – – – – – + :
                Payload Data continued … : + – – – – – – – – – – – – – – – – – – – – –
              • – – – – + | Payload Data continued … |
                +—————————————————————+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+——-+-+————-+——————————-+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+——-+-+————-+ – – – – – – – – – – – – – – – +
|     Extended payload length continued, if payload len == 127  |
+ – – – – – – – – – – – – – – – +——————————-+
|                               |Masking-key, if MASK set to 1  |
+——————————-+——————————-+
| Masking-key (continued)       |          Payload Data         |
+——————————– – – – – – – – – – – – – – – – +
:                     Payload Data continued …                :
+ – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – +
|                     Payload Data continued …                |
+—————————————————————+

2、数据帧格式详解

本着前的格式概览图,这里逐个字段进展讲解,如有非懂得的远在,可参考协议正式,或留言交流。

FIN:1个比特。

一旦是1,表示这是信(message)的末段一个分片(fragment),如果是0,表示未是是信(message)的末梢一个分片(fragment)。

RSV1, RSV2, RSV3:各占1个比特。

相似景象下全为0。当客户端、服务端协商下WebSocket扩展时,这三独标志位可非0,且值的含义由扩张进行定义。如果出现非零的价,且并没有用WebSocket扩展,连接出错。

Opcode: 4个比特。

操作代码,Opcode的值决定了应有怎样剖析后续的多寡载荷(data
payload)。如果操作代码是勿识的,那么接收端应该断开连接(fail the
connection)。可摘的操作代码如下:

  • %x0:表示一个延续帧。当Opcode为0时,表示本次数据传采用了数量分片,当前接收的数据帧为内部一个数额分片。
  • %x1:表示马上是一个文本帧(frame)
  • %x2:表示这是一个次之前进制帧(frame)
  • %x3-7:保留的操作代码,用于后续定义的非控制帧。
  • %x8:表示连接断开。
  • %x9:表示即是一个ping操作。
  • %xA:表示马上是一个pong操作。
  • %xB-F:保留的操作代码,用于后续定义的控制帧。

Mask: 1个比特。

代表是否要指向数据载荷进行掩码操作。从客户端向服务端发送数据时,需要对数据开展掩码操作;从劳动端向客户端发送数据时,不需对数据进行掩码操作。

如服务端接收及之数码没有进行过掩码操作,服务端需要断开连接。

而Mask是1,那么在Masking-key中见面定义一个掩码键(masking
key),并因此者掩码键来对数据载荷进行反掩码。所有客户端发送至服务端的数据帧,Mask都是1。

掩码的算法、用途在产一样稍微节讲解。

Payload
length
:数据载荷的长度,单位凡字节。为7位,或7+16号,或1+64号。

假设数Payload length === x,如果

  • x为0~126:数据的尺寸也x字节。
  • x为126:后续2单字节代表一个16个之无符号整数,该无符号整数的价值吗多少的长短。
  • x为127:后续8只字节代表一个64各类之无符号整数(最高位为0),该无符号整数的值也数据的长度。

另外,如果payload length占用了大半独字节的话,payload
length的二进制表达采用网络序(big endian,重要的各项在前)。

Masking-key:0或4字节(32位)

持有由客户端传送至服务端的数据帧,数据载荷都进行了掩码操作,Mask也1,且携带了4字节的Masking-key。如果Mask为0,则并未Masking-key。

备考:载荷数据的长,不包mask key的尺寸。

Payload data:(x+y) 字节

载荷数据:包括了扩大数据、应用数据。其中,扩展数据x字节,应用数据y字节。

扩大数据:如果没协商下扩展的话,扩展数据数据为0字节。所有的扩展都不能不声明扩展数据的长度,或者可以什么算起恢弘数据的长。此外,扩展如何以要以拉手阶段便协商好。如果扩展数据有,那么载荷数据长度要将扩展数据的尺寸包含在内。

下数据:任意的采取数据,在扩展数据之后(如果有扩展数据),占据了数据帧剩余的职位。载荷数据长度
减去 扩展数据长度,就得到利用数据的尺寸。

3、掩码算法

掩码键(Masking-key)是由客户端挑选出去的32各的随机数。掩码操作不见面潜移默化多少载荷的长短。掩码、反掩码操作都使如下算法:

首先,假设:

  • original-octet-i:为老数据的第i字节。
  • transformed-octet-i:为转移后底数码的第i字节。
  • j:为i mod 4的结果。
  • masking-key-octet-j:为mask key第j字节。

算法描述为: original-octet-i 与 masking-key-octet-j 异或后,得到
transformed-octet-i。

j = i MOD 4
transformed-octet-i = original-octet-i XOR masking-key-octet-j

六、数据传递

若WebSocket客户端、服务端建立连接后,后续之操作都是因数据帧的传递。

WebSocket根据opcode来分操作的花色。比如0x8意味着断开连接,0x00x2意味着数据交互。

1、数据分片

WebSocket的各国条信息可能于切分成多单数据帧。当WebSocket的接收方收到一个数据帧时,会依据FIN的值来判定,是否早已吸收信之尾声一个数据帧。

FIN=1表示目前数据帧为信息的终极一个数据帧,此时接收方已经接收完整的消息,可以针对信息进行处理。FIN=0,则接收方还欲持续监听接收其余的数据帧。

此外,opcode当数据交换的场景下,表示的是数的型。0x01意味着文本,0x02表示二进制。而0x00较特别,表示延续帧(continuation
frame),顾名思义,就是整体信息对应的数据帧还从来不接过了。

2、数据分片例子

一直看例子更形象来。下面例子来自MDN,可以非常好地示范数据的分片。客户端向劳动端两坏发送信息,服务端收到信继转应客户端,这里关键看客户端往服务端发送的音信。

第一长达信息

FIN=1,
表示是当前消息的结尾一个数据帧。服务端收到时数据帧后,可以拍卖消息。opcode=0x1,表示客户端发送的是文件类。

仲久信息

  1. FIN=0,opcode=0x1,表示发送的凡文件类,且消息还无发送完,还有后续之数据帧。
  2. FIN=0,opcode=0x0,表示消息还尚无发送完,还有后续之数据帧,当前之数据帧需要连接在直达同一长条数据帧之后。
  3. FIN=1,opcode=0x0,表示消息一度发送完,没有继续的数据帧,当前的数据帧需要衔接在达标亦然条数据帧之后。服务端可以以涉及的数据帧组装成完全的信息。

Client: FIN=1, opcode=0x1, msg=”hello” Server: (process complete message
immediately) Hi. Client: FIN=0, opcode=0x1, msg=”and a” Server:
(listening, new message containing text started) Client: FIN=0,
opcode=0x0, msg=”happy new” Server: (listening, payload concatenated to
previous message) Client: FIN=1, opcode=0x0, msg=”year!” Server:
(process complete message) Happy new year to you too!

1
2
3
4
5
6
7
8
Client: FIN=1, opcode=0x1, msg="hello"
Server: (process complete message immediately) Hi.
Client: FIN=0, opcode=0x1, msg="and a"
Server: (listening, new message containing text started)
Client: FIN=0, opcode=0x0, msg="happy new"
Server: (listening, payload concatenated to previous message)
Client: FIN=1, opcode=0x0, msg="year!"
Server: (process complete message) Happy new year to you too!

七、连接保持+心跳

WebSocket为了维持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的TCP通道保持连续没有断开。然而,对于增长时没数往来之连续,如果还丰富日子维系在,可能会见浪费包括的连天资源。

可是不清除有些场景,客户端、服务端虽然长日子没数量往来,但以需保障连续。这个时刻,可以采用心跳来促成。

  • 发送方->接收方:ping
  • 接收方->发送方:pong

ping、pong的操作,对应的凡WebSocket的星星只控制帧,opcode分别是0x90xA

举例,WebSocket服务端向客户端发送ping,只需要如下代码(采用ws模块)

ws.ping(”, false, true);

1
ws.ping(”, false, true);

八、Sec-WebSocket-Key/Accept的作用

前面提到了,Sec-WebSocket-Key/Sec-WebSocket-Accept当首要意图在于提供基础之警备,减少恶意连接、意外连续。

图约归纳如下:

  1. 免服务端收到非法的websocket连接(比如http客户端不小心要连接websocket服务,此时服务端可以一直拒绝连接)
  2. 保服务端理解websocket连接。因为ws握手阶段采用的凡http协议,因此恐怕ws连接是深受一个http服务器处理并返的,此时客户端可经Sec-WebSocket-Key来确保服务端认识ws协议。(并非百分百保险,比如总是存在那么几无聊的http服务器,光处理Sec-WebSocket-Key,但并没有落实ws协议。。。)
  3. 于是浏览器里提倡ajax请求,设置header时,Sec-WebSocket-Key以及其它有关的header是让明令禁止的。这样可免客户端发送ajax请求时,意外请求协议升级(websocket
    upgrade)
  4. 好防范反为代理(不亮ws协议)返回错误的数码。比如反向代理前后收到两蹩脚ws连接的晋级要,反向代理将第一次等呼吁的回给cache住,然后第二不成呼吁到来时直接把cache住的乞求让返回(无意义的回来)。
  5. Sec-WebSocket-Key主要目的并无是包数据的安全性,因为Sec-WebSocket-Key、Sec-WebSocket-Accept的转移计算公式是光天化日之,而且非常简单,最关键的作用是防备一些大的竟然情况(非故意的)。

强调:Sec-WebSocket-Key/Sec-WebSocket-Accept
的折算,只能带来基本的维系,但连续是否平安、数据是否安全、客户端/服务端是否合法的
ws客户端、ws服务端,其实并不曾实际性的包。

九、数据掩码的来意

WebSocket共商被,数据掩码的企图是增长协商的安全性。但数量掩码并无是为掩护数量本身,因为算法本身是光天化日之,运算也未复杂。除了加密大道本身,似乎没尽多立竿见影之保护通信安全的方法。

这就是说为什么还要引入掩码计算呢,除了增计算机器的运算量外似乎并从未太多之低收入(这也是过剩同学疑惑的点)。

答案还是个别独字:安全。但连无是以以防数据泄密,而是为以防万一早期版本的商议被有的代办缓存污染攻击(proxy
cache poisoning attacks)等问题。

1、代理缓存污染攻击

下摘自2010年有关安全之均等段落讲话。其中提到了代理服务器在商事落实达标之欠缺或者导致的安全题材。打出处。

“We show, empirically, that the current version of the WebSocket
consent mechanism is vulnerable to proxy cache poisoning attacks. Even
though the WebSocket handshake is based on HTTP, which should be
understood by most network intermediaries, the handshake uses the
esoteric “Upgrade” mechanism of HTTP [5]. In our experiment, we find
that many proxies do not implement the Upgrade mechanism properly,
which causes the handshake to succeed even though subsequent traffic
over the socket will be misinterpreted by the proxy.”[TALKING]
Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C.

Jackson, “Talking to Yourself for Fun and Profit”, 2010,

1
          Jackson, "Talking to Yourself for Fun and Profit", 2010,

每当专业描述攻击步骤之前,我们借设有如下参与者:

  • 攻击者、攻击者自己主宰的服务器(简称“邪恶服务器”)、攻击者伪造之资源(简称“邪恶资源”)
  • 受害人、受害者想使拜的资源(简称“正义资源”)
  • 被害人实际想要拜访的服务器(简称“正义服务器”)
  • 中代理服务器

攻击步骤同:

  1. 攻击者浏览器 向 恶服务器
    发起WebSocket连接。根据前文,首先是一个共谋升级要。
  2. 商量升级要 实际到达 代理服务器
  3. 代理服务器 将合计升级要转发到 恶服务器
  4. 恶服务器 同意连接,代理服务器 将响应转发让 攻击者

由 upgrade 的兑现达标发出缺点,代理服务器
以为之前转发的是平凡的HTTP消息。因此,当磋商服务器
同意连接,代理服务器 以为本次对话已经结。

攻击步骤二:

  1. 攻击者 在头里起之连日上,通过WebSocket的接口向 恶服务器
    发送数据,且数量是精心组织的HTTP格式的文书。其中富含了 公允资源
    的地点,以及一个仿冒之host(指向公正服务器)。(见后报文)
  2. 伸手到达 代理服务器 。虽然复用了前头的TCP连接,但 代理服务器
    以为是新的HTTP请求。
  3. 代理服务器狰狞服务器 请求 狰狞资源
  4. 恶服务器 返回 恶资源代理服务器 缓存住
    狰狞资源(url是对的,但host是 公正服务器 的地址)。

顶这里,受害者可以登台了:

  1. 受害者 通过 代理服务器 访问 公服务器公平资源
  2. 代理服务器 检查该资源的url、host,发现当地有同样客缓存(伪造之)。
  3. 代理服务器恶资源 返回给 受害者
  4. 受害者 卒。

附:前面提到的明细布局之“HTTP请求报文”。

Client → Server: POST /path/of/attackers/choice HTTP/1.1 Host:
host-of-attackers-choice.com Sec-WebSocket-Key: Server → Client:
HTTP/1.1 200 OK Sec-WebSocket-Accept:

1
2
3
4
5
Client → Server:
POST /path/of/attackers/choice HTTP/1.1 Host: host-of-attackers-choice.com Sec-WebSocket-Key:
Server → Client:
HTTP/1.1 200 OK
Sec-WebSocket-Accept:

2、当前缓解方案

头的提案是本着数据开展加密处理。基于安全、效率的考虑,最终采取了折中的方案:对数码载荷进行掩码处理。

急需留意的是,这里仅仅是限制了浏览器对数据载荷进行掩码处理,但是坏人了可以实现和谐的WebSocket客户端、服务端,不按照规则来,攻击可以照常进行。

但是本着浏览器加上这界定后,可以大大增加攻击的难度,以及攻击的熏陶范围。如果无这个界定,只需要以网上放个钓鱼网站骗人去做客,一下子便可以当缺少日外展开大范围之攻击。

十、写于后面

WebSocket可写的物还蛮多,比如WebSocket扩展。客户端、服务端之间是何许谋、使用扩展的。WebSocket扩展可以于谋本身增加很多力和想象空间,比如数据的抽、加密,以及多路复用等。

篇幅所限,这里先不进行,感兴趣的校友可以留言交流。文章使产生错漏,敬请指出。

十一、相关链接

RFC6455:websocket规范
https://tools.ietf.org/html/r…

标准:数据帧掩码细节
https://tools.ietf.org/html/r…

专业:数据帧格式
https://tools.ietf.org/html/r…

server-example
https://github.com/websockets…

编写websocket服务器
https://developer.mozilla.org…

针对网基础设备的抨击(数据掩码操作所而防备的事情)
https://tools.ietf.org/html/r…

Talking to Yourself for Fun and Profit(含有攻击描述)
http://w2spconf.com/2011/pape…

What is Sec-WebSocket-Key for?
https://stackoverflow.com/que…

10.3. Attacks On Infrastructure (Masking)
https://tools.ietf.org/html/r…

Talking to Yourself for Fun and Profit
http://w2spconf.com/2011/pape…

Why are WebSockets masked?
https://stackoverflow.com/que…

How does websocket frame masking protect against cache poisoning?
https://security.stackexchang…

What is the mask in a WebSocket frame?
https://stackoverflow.com/que…

1 赞 3 收藏 1
评论

图片 1

相关文章