当前位置: 首页 > 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.xdnf.cn/news/1208071.html

相关文章:

  • 【Spring Boot 快速入门】三、分层解耦
  • 论文阅读--射频电源在半导体领域的应用
  • 【nerf处理视频数据】Instant-NGP项目NeRF模型训练数据集准备指南
  • 机器学习线性回归:从基础到实践的入门指南
  • Golang语言如何高效使用字符串
  • VLA--Gemini Robotics On-Device: 将AI带到本地机器人设备上
  • 字节序详解
  • Windows下基于 SenseVoice模型的本地语音转文字工具
  • 重塑浏览器!微软在Edge加入AI Agent,自动化搜索、预测、整合
  • 数据结构【红黑树】
  • SeeMoE:从零开始实现一个MoE视觉语言模型
  • 【学习笔记】Lean4 定理证明 ing
  • OCR 技术识别全解析:原理、主流方案与实战应用
  • 基于JavaWeb的兼职发布平台的设计与实现
  • React函数组件的“生活管家“——useEffect Hook详解
  • [学习记录]URP流程解析(2)--初始化阶段
  • Rust 实战二 | 开发简易版命令行工具 grep
  • Java程序数据库连接满问题排查指南
  • napping-1.0.1靶机练习
  • SQLAlchemy 全方位指南:从入门到精通
  • RabbitMQ面试精讲 Day 7:消息持久化与过期策略
  • 【C++算法】78.BFS解决FloodFill算法_算法简介
  • umijs局域网访问警告Disconnected from the devServer,trying to reconnect...
  • C++跨平台连接多种数据库实战
  • 时序数据库选型指南:为什么IoTDB正在重新定义工业大数据规则?
  • C# CAN通信上位机系统设计与实现
  • vue相关的拖拉拽官网
  • 【LeetCode】前缀表相关算法
  • 【PHP】通过IP获取IP所在地理位置(免费API接口)
  • 数据结构(5)单链表算法题(中)