技术解析

这样的 javascript 沙盒足够安全吗?
0
2021-08-11 03:17:20
idczone

想要做个搜索框,支持简易的数学计算,比如 100+100 。

想着用 evel 来做应该足够简单,就是不知道是否够安全。 如果够安全,似乎开可以开放一些函数,提供 context 供用户自己写点具体的东西。 比如让用户自定义搜索框的行为。

这段代码是从知乎的腾讯云技术社区发的文章里拿来的。

模块:

const codeProxies = new WeakMap();
const compileCode = (content) => {
  const code = new Function('context', `with(context) { ${content} }`);

  return (data = {}) => {
    if (!codeProxies.has(data)) {
      codeProxies.set(data, new Proxy(data, {
        has: () => true,
        get: (target, key) => key === Symbol.unscopables ? void 0 : target[key],
      }));
    }
    return code(codeProxies.get(data));
  };
};

再次封装:

export const compileFunction = (context, code) => {
  return compileCode(`
    return (function() { ${code} }).call({});
  `)(context);
};

使用:

try {
  console.log(compileFunction({}, `return ${this.store.search};`));
} catch(error) {
  console.log(error);
}

要不试试这个?
https://mathjs.org/

eval 、new function 这种有的代码审核都不让过的,不要在这里玩骚操作,除非你确定后台给你的代码一定安全(至少不要把原有的东西搞砸),而且这部分接口的数据不会被入侵或者注入什么

不安全,你试试这个
compileFunction({ console }, "console.log(this.constructor.constructor(\"return process\")())")

创建个可控跨源的 iframe sandbox,用 postMessage 通讯,随便 eval 。

这个好棒啊,谢谢!
这个用例走到了 catch,报错 process 不存在,但没有逃逸成功。

你是用的浏览器吧
浏览器的话试试这个 compileFunction({ }, "this.constructor.constructor('return top')().close()")

https://github.com/Agoric/realms-shim/issues
看看别人怎么做的

我建议在 Realms 提案广泛可用之前别尝试折腾 js 实现 js 沙箱,
自己写一个语言的解释器不香吗

还有这个
https://github.com/salesforce/near-membrane

(()=>{}).constructor('return eval')()('prompt()')
对 JS 这种语言就别想着自己实现沙盒了,vm2 这种专门做沙盒的项目都被打穿过好多次

按你计算器的需求,白名单限制下 [0-9\+\-\*\/\(\)]

一个前端运算的搜索框搞啥沙盒,用户自己攻击自己?

用 iframe

可能会导致 xss

别想着沙盒,还是重新实现一遍解释器靠谱。

很多年前做过类似的功能,个人感觉最好的方法是自己写一个针对算式的解析;
这样更安全也更可控,还能兼容更多交互。

直接脚本发后台 nodejs, 在后台执行, 后台部署 docker,通过网管转发, 每个 docker 都是隔离的, 完全的。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服