一、风险与目标风险:同源脚本共享上下文污染、消息注入、权限过宽、资源误用与数据泄露。目标:隔离执行环境、收敛可用能力、严格来源与消息校验、可控创建与销毁。二、iframe隔离<iframe id="app-frame" src="/sandbox.html" sandbox="allow-scripts" referrerpolicy="no-referrer" allow="geolocation 'none'; microphone 'none'; camera 'none'"></iframe> const frame = document.getElementById('app-frame') as HTMLIFrameElement const origin = 'https://example.com' function sendToFrame(msg: { type: string; payload?: any; version: number }) { frame.contentWindow?.postMessage(msg, origin) } function onFrameMessage(ev: MessageEvent) { if (ev.origin !== origin) return const m = ev.data as { type: string; payload?: any; version: number } if (typeof m?.type !== 'string' || typeof m?.version !== 'number') return } window.addEventListener('message', onFrameMessage) 三、Worker隔离const worker = new Worker('/worker.js', { type: 'module' }) function sendToWorker(msg: { type: string; payload?: any; version: number }) { worker.postMessage(msg) } worker.onmessage = ev => { const m = ev.data as { type: string; payload?: any; version: number } if (typeof m?.type !== 'string' || typeof m?.version !== 'number') return } function stopWorker() { worker.terminate() } 四、MessageChannel与类型守卫const ch = new MessageChannel() function isMsg(x: any): x is { type: string; payload?: any; version: number } { return x && typeof x.type === 'string' && typeof x.version === 'number' } function connectWithChannel(target: Window, origin: string) { target.postMessage({ type: 'connect', version: 1 }, origin, [ch.port2]) ch.port1.onmessage = ev => { if (isMsg(ev.data)) {} } } 五、策略协同Content-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'self'; frame-ancestors 'none' Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp 六、验收清单iframe使用`sandbox`且最小能力集合,不授予`allow-same-origin`除非必要。Worker独立执行且通信仅接受满足类型守卫的消息。`postMessage`严格校验`origin`与结构,使用固定`version`与有限`type`枚举。CSP限制默认来源与可连接端点;COOP/COEP提升隔离与资源嵌入安全性。建立创建与销毁流程,空闲时终止Worker并释放资源。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
2.118970s