Web Worker 中不可执行动态脚本(如 eval、new Function),但可安全进行静态特征扫描:解析源码AST、正则匹配危险API、检测混淆模式、比对恶意特征库,所有操作须通过 postMessage 接收输入且不触碰 DOM 或网络。

不能在 Web Worker 中直接执行动态脚本(如 eval、new Function() 或插入 <script> 标签),这是浏览器强制的安全限制——Worker 环境禁用所有动态代码执行能力,目的是防止 XSS、混淆恶意载荷等高危行为。因此,“在 Worker 中做动态脚本安全扫描与特征匹配”可行,但“执行动态脚本”本身不可行,必须严格区分「扫描/分析」和「执行」。
Worker 中能安全做的:静态特征扫描
Worker 可接收 JavaScript 源码字符串(非执行),通过纯逻辑解析其结构、关键字、可疑模式,完成无副作用的检测:
- 正则匹配危险 API 调用(如
/atob\s*\(|\.innerHTML\s*=|eval\s*\(|new\s+Function/i) - 基于 Acorn 或 Esprima 等轻量 parser 构建 AST,识别可疑节点(
CallExpression调用eval、MemberExpression写入document.write) - 检测编码混淆(连续 base64 字符串、大量
String.fromCharCode、十六进制字符串拼接) - 比对已知恶意特征库(如黑名单函数名、特定字符串哈希、控制流扁平化模式签名)
如何在 Worker 中集成扫描逻辑(示例)
以下是一个最小可行实现片段(使用 Esprima):
// scanner.worker.js
importScripts('https://cdn.jsdelivr.net/npm/esprima@4.0.1/dist/esprima.min.js');
self.onmessage = function(e) {
const { code } = e.data;
try {
const ast = esprima.parseScript(code, { tolerant: true });
const issues = [];
// 遍历 AST 查找 eval 调用
esprima.walk(ast, {
enter(node) {
if (node.type === 'CallExpression' &&
node.callee.type === 'Identifier' &&
/eval|Function/i.test(node.callee.name)) {
issues.push({ type: 'dangerous-call', loc: node.loc });
}
if (node.type === 'AssignmentExpression' &&
node.left.type === 'MemberExpression' &&
/innerHTML|document\.write/i.test(node.left.property.name || '')) {
issues.push({ type: 'dom-write', loc: node.loc });
}
}
});
self.postMessage({ result: 'success', issues });
} catch (err) {
self.postMessage({ result: 'parse-error', error: err.message });
}
};
主页面调用方式:
立即学习“前端免费学习笔记(深入)”;
const worker = new Worker('scanner.worker.js');
worker.postMessage({ code: 'eval("alert(1)")' });
worker.onmessage = e => console.log(e.data); // { issues: [...] }
关键安全边界与限制
务必遵守以下约束,否则会触发异常或被浏览器拦截:
-
禁止任何动态执行:Worker 全局作用域没有
eval、Function构造器、setTimeout字符串参数、setInterval字符串参数 -
无法访问 DOM:不能读取
document、window、localStorage等,所有输入必须由主线程显式传入(postMessage) -
无网络请求权限(除非显式 fetch):不能用
XMLHttpRequest或fetch加载远程特征库(需提前加载好或内置规则) -
不支持 import/export 语法(除非用模块 Worker):若需 ES 模块,创建时应使用
new Worker(url, { type: 'module' })
增强实用性建议
让扫描更可靠、可维护:
- 将特征规则抽象为 JSON 配置(如匹配模式、严重等级、修复建议),Worker 初始化时加载,避免硬编码
- 对长脚本做分块解析(如按函数/作用域拆解 AST),避免阻塞 Worker 线程过久
- 添加超时保护:用
AbortController+setTimeout中断长时间解析(Worker 支持setTimeout) - 输出标准化结果(如 SARIF 格式子集),便于集成到 IDE 插件或 CI 流程



















