WebSocket安全漏洞与防护
字数 863 2025-11-26 05:50:36
WebSocket安全漏洞与防护
描述
WebSocket协议提供了全双工通信通道,但引入了一系列安全风险。与HTTP不同,WebSocket连接持久存在,传统Web防护机制(如CSRF Token)可能失效。主要漏洞包括:未经验证的连接、消息注入、跨站WebSocket劫持(CSWSH)、敏感数据泄露等。
解题过程
-
理解WebSocket握手过程
- WebSocket通过HTTP Upgrade请求建立连接
- 客户端发送包含
Upgrade: websocket和Sec-WebSocket-Key的请求 - 服务端返回
101 Switching Protocols和Sec-WebSocket-Accept - 关键点:握手阶段仍受HTTP安全机制约束,但建立后脱离HTTP约束
-
识别认证/授权缺陷
- 问题:开发者可能仅在握手时验证身份,但后续消息缺乏持续验证
- 案例:攻击者截获连接后直接发送恶意消息
- 防护:每个消息都应包含会话验证令牌,或使用TLS客户端证书
-
防范跨站WebSocket劫持(CSWSH)
- 原理:类似CSRF,诱导用户浏览器自动建立WebSocket连接
- 特殊挑战:浏览器自动携带Cookie,但无法自定义Origin头
- 防护方案:
a) 验证Origin头(但不可完全信赖)
b) 在握手请求中添加随机Token(类似CSRF Token)
c) 使用双重提交Cookie验证
-
输入验证与消息注入防护
- 风险:WebSocket消息可能包含SQL注入、XSS等恶意内容
- 特殊性:数据格式可能为二进制、文本或自定义协议
- 防护:
a) 严格验证消息格式和长度
b) 对输出到HTML的消息进行编码(防XSS)
c) 使用模式验证(如JSON Schema)
-
实现安全配置
- 关闭调试信息(防止路径泄露)
- 配置合理的消息大小限制(防DoS)
- 使用WSS(WebSocket over TLS)加密传输
- 实施心跳机制超时控制
-
完整防护示例
// 握手阶段验证
server.on('upgrade', (request, socket) => {
// 1. 验证Origin
if (!validateOrigin(request.headers.origin)) {
socket.destroy();
return;
}
// 2. 验证CSRF Token
const token = request.headers['sec-websocket-protocol'];
if (!validateToken(token)) {
socket.destroy();
return;
}
});
// 消息处理阶段
connection.on('message', (message) => {
// 3. 验证消息格式和大小
if (message.length > MAX_SIZE) return;
// 4. 解析后验证业务逻辑
const data = JSON.parse(message);
if (!validateBusinessLogic(data)) return;
// 5. 输出编码
const output = escapeHtml(data.content);
});
通过分层防护策略,可系统化解决WebSocket特有的安全挑战。