当前位置: 首页 > news >正文

字符串函数安全解析成执行函数

字符串函数安全解析成执行函数

可以通过创建沙箱环境(注入组件方法和工具函数)使用组件内部函数

// 组件安全函数解析器
function safeParseFunction(fnStr: string, context = {}) {if (typeof fnStr !== 'string') return fnStr;// 增强预处理:处理Vue模板中的转义字符const processedStr = fnStr.trim().replace(/\\n/g, '\n') // 转换转义换行符.replace(/\\t/g, ' ') // 转换制表符为空格.replace(/\\"/g, '"') // 处理转义引号.replace(/\r/g, '') // 移除回车符.replace(/\s+/g, ' '); // 压缩连续空格try {// 创建沙箱环境(注入组件方法和工具函数)const sandbox = {// 注入组件API...context,// 注入工具函数// 注入基础APIconsole,setTimeout,clearTimeout,setInterval,clearInterval// 其他需要注入的依赖...};// 重构函数构建逻辑(避免with语句作用域问题)const createExecutor = () => {const sandboxKeys = Object.keys(sandbox);// const sandboxValues = sandboxKeys.map((key) => sandbox[key]);// 动态生成函数参数列表const params = sandboxKeys.join(', ');// 构建函数体(三种格式统一处理)let fnBody = processedStr;if (fnBody.includes('=>')) {if (!fnBody.startsWith('(')) {fnBody = `(${fnBody})`; // 补全箭头函数括号}} else if (!fnBody.startsWith('function')) {fnBody = `function() { ${fnBody} }`; // 包裹普通函数体}// 生成可执行函数return new Function(params, `return (${fnBody}).apply(this, arguments)`);};// 执行并绑定上下文const executor = createExecutor();return (...args) =>executor.apply(sandbox, Object.values(sandbox).concat(args));} catch (error: any) {console.error('[函数解析失败]', {input: fnStr,error: error.message});return () => {};}
}// 测试用例(在组件中验证)   { emit, props }
const testFunction = safeParseFunction("()=>{\n console.log(11);\n setTimeout(()=>{console.log(12)},100);\n}");
testFunction(); // 应正常执行
http://www.lryc.cn/news/604219.html

相关文章:

  • 解密数据结构之二叉树
  • Wan2.1
  • “非参数化”大语言模型与RAG的关系?
  • 集成电路学习:什么是Wi-Fi无线保真度
  • 「源力觉醒 创作者计划」_文心大模型 4.5 多模态实测:开源加速 AI 普惠落地
  • LeetCode 283 - 移动零
  • 【面试】软件测试面试题
  • mangoDB面试题及详细答案 117道(026-050)
  • Netty中InternalThreadLocalMap的作用
  • 【C++算法】72.队列+宽搜_二叉树的最大宽度
  • React函数组件的“生活管家“——useEffect Hook详解
  • 【Linux】初识make/makefile
  • sqLite 数据库 (2):如何复制一张表,事务,聚合函数,分组加过滤,列约束,多表查询,视图,触发器与日志管理,创建索引
  • 【MySQL基础篇】:MySQL表的约束常用类型以及实战示例
  • 15-C语言:第15~16天笔记
  • dubbo应用之3.0新特性(响应式编程)(2)
  • 《剑指offer》-算法篇-位运算
  • window weblogic 解锁
  • Object.freeze() 深度解析:不可变性的实现与实战指南
  • 第4章唯一ID生成器——4.5 美团点评开源方案Leaf
  • JVM易混淆名称
  • 【24】C# 窗体应用WinForm ——日历MonthCalendar属性、方法、实例应用
  • 在依赖关系正确的情况下,执行 mvn install 提示找不到软件包
  • 测试自动化不踩坑:4 策略告别 “为自动化而自动化”
  • DPDK PMD 深度解析:高性能网络的核心引擎
  • 使用LangChain构建法庭预定智能体:结合vLLM部署的Qwen3-32B模型
  • 疯狂星期四文案网第23天运营日记
  • 基于Matlab图像处理的静态雨滴去除与质量评估系统
  • 数学建模算法-day[14]
  • LeetCode 刷题【19. 删除链表的倒数第 N 个结点、20. 有效的括号、21. 合并两个有序链表】