【问题标题】:Evaluating JavaScript expression with a worker使用 worker 评估 JavaScript 表达式
【发布时间】:2017-12-04 23:50:02
【问题描述】:

我需要在浏览器 Chrome 中评估 JavaScript 表达式。为了安全起见,我使用BlobWorker 运行我的求值程序,直到它回发超时结果取消等待。这工作正常。我还需要支持我的 JavaScript 环境。我这样做如下:

function evalWorker () {
  let postResponse = function(expr, ...) {
    let presets = `var EnvObject = {};
                EnvObject.platform = "Chrome";
                EnvObject.pasteboard = "${clipboard}";
                EnvObject.baseDate = new Date();
                ...
                EnvObject._output = "";
                EnvObject.appendOutput = (str) => {EnvObject._output += str; };
                `
    postMessage(eval(presets + expr));
  };
  onmessage = function(e) {
    postResponse(e.data['expression'], e.data['clipboard'], ...);
  }
}

我的问题是,如果 _output 不为空,我需要返回 - _output 而不是评估表达式,如

EnvObject.appendOutput('hello');
var a = 0;
++a;

应该返回hello;如果没有appendOutput,它应该返回1

我将如何处理这样的事情?

【问题讨论】:

  • postMessage(selectValue(eval(expr), EnvObject._output))?
  • 在 worker 中评估任意代码根本不安全。是什么让您认为代码是在沙盒环境中运行的?
  • EnvObject 存在于表达式中,对吗?应该是undefined
  • 为什么工人在 blob 中运行会不安全?
  • @MosheShmukler 啊,在严格模式下,eval 创建了自己的范围。所以要么使用全局评估,要么使用草率模式,或者在函数范围内的eval调用之前简单地声明var EnvObject

标签: javascript evaluation


【解决方案1】:

@Bergi 有一个正确的想法,那就是推出范围。下面的作品。

function evalWorker () {
  let postResponse = function(expr, TextExpander) {
    let result = eval(expr);
    if (EnvObject._output && EnvObject._output.length) {
      postMessage(EnvObject._output);
    } else {
      postMessage(result);
    }
  };
  onmessage = function(e) {
    var EnvObject = {};
    EnvObject.platform = "Chrome";
    EnvObject.pasteboardText = e.data['clipboard'];
    ...
    EnvObject._output = "";
    EnvObject.appendOutput = function(str) {EnvObject._output += str; };
    postResponse(e.data['expression'], EnvObject);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多