You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向Function构造函数注入上下文并隐藏浏览器对象?求Next.js编辑器

问题与实现说明

按照MDN中关于eval的安全提示,我用Function构造函数替代了不安全的eval方法,但还没找到更优的上下文注入方式,当前实现代码如下:

function evalContext(context: Record<string, unknown>) {
  const injectContext = Object.keys(context).reduce(
    (acc, key) => `${acc}${key}=context.${key};`,
    '',
  );
  return Function(`context`, `${injectContext}${script}`)(context);
}

const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = useEventCallback((event) => {
  if (event.code === 'KeyE' && event.metaKey) {
    evalContext({ a: 3, b: 4, log: console.log });
    event.preventDefault();
    event.stopPropagation();
  }
});

输入图片描述

这个实现可以正常运行(不需要给键名加this前缀),核心问题是:能不能隐藏window、document这类浏览器全局对象?从安全角度来说,Function构造函数中执行的脚本仅对账号所有者可见,希望这个方案是安全的。

另外,我试过monaco-editor、react-simple-code-editor等多款代码编辑器库,但在最新版Next.js环境里都没法正常运行,求推荐适配的编辑器库。


更新

基于建议调整后的代码如下:

function evalContext(context: Record<string, unknown>) {
  const injectContext = Object.keys(context).reduce(
    (acc, key) => `${acc}${key}=context.${key};`,
    '',
  );
  return Function(
    'context',
    'window',
    'document',
    'location',
    'localStorage',
    'navigation',
    'fetch',
    'frames',
    'history',
    `(function () {${injectContext}${script}}).call({})`,
  )(context);
}

输入图片描述

内容的提问来源于stack exchange,提问作者DraganS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:01:23