Agent Skills
返回列表
报价分成表达式安全求值

报价分成表达式安全求值

开发编程 更新于 2026.08.29

将以下提示词粘贴到你的 AI 对话框中:

请根据 https://skillhub.cn/install/skillhub.md,安装 @user_f1b049da/yz2026721 以启用安全的数学表达式求值能力。

技能介绍

为什么要抛弃 eval 处理业务计算

在处理报价、分成等涉及金额的业务逻辑时,开发者常常图省事直接使用 eval() 来执行后端传来的或用户输入的表达式。然而,eval() 会执行任意代码,一旦输入被篡改,轻则业务数据泄露,重则直接导致服务端或前端被 RCE(远程代码执行)攻击。为了解决这一安全隐患,同时又要保持动态计算表达式的灵活性,我们需要一个安全的沙箱环境来替代原生的 eval。

安全数学求值的核心机制

该技能的设计灵感来源于 math-expr 工具箱,其核心在于使用 mathjs 库提供的 evaluate 方法替代危险的 eval。

  • 表达式解析与执行:底层依赖 mathjs,它专门用于解析和计算数学表达式。由于 mathjs 只支持数学语法和内置函数,它天然无法执行诸如 process.exit() 或 require('fs') 这类带有副作用的系统级调用。
  • 严格的 Scope 隔离:在执行前,必须严格限制传入的 scope(作用域)。技能明确约束不应将业务对象直接注入到表达式环境中,仅允许暴露必要的数学常量或简单的计算上下文,防止对象原型链污染。
  • 错误兜底机制:对于非法的表达式或计算异常,技能要求进行完整的异常捕获(try-catch)。这能确保在遇到错误输入时,系统会给出友好的提示信息,而不是让异常直接穿透页面导致前端白屏或崩溃。
  • 精度控制:针对金额等敏感数据,建议在返回结果时使用 toFixed() 方法,并根据业务场景设定固定的小数位数(例如金额通常保留 2 位),避免浮点数精度丢失带来的财务对账问题。

适用边界与避坑指南

需要注意的是,该技能的边界仅局限于“纯数学表达式求值”。

  • 不要用于复杂逻辑:它不支持条件判断(如 a ? b : c)或循环结构,如果你的需求包含业务分支,请改用结构化代码实现。
  • 不要滥用 Scope:切忌将整个业务数据库对象或带有敏感属性的 User 对象传入计算上下文,坚持“最小权限”原则。
  • 并非万能的安全沙箱:虽然 mathjs 极大降低了代码注入风险,但面对极其复杂的嵌套表达式时仍可能存在性能瓶颈,建议对表达式长度做合理限制。

使用场景

  • 处理在线报价表单时,需要在前端安全解析用户输入的金额计算公式并返回结果。
  • 开发电商促销系统时,需根据不同商品折扣和平台分成比例,动态计算最终成交金额。
  • 编写参数配置页面时,要允许管理员输入像 (基础价*数量)*0.85 这类公式,且必须防范恶意代码注入。
  • 构建财务数据导出工具时,需对包含 amount*rate 的字符串列进行批量求值,并按两位小数格式化金额。

适合人员

  • 负责前端表单处理的工程师,希望避免因直接使用 eval 解析表达式导致页面遭受 XSS 或 RCE 攻击。
  • 负责电商计费系统的后端或全栈开发者,需要一套安全的规则引擎来计算复杂的动态报价和分账金额。
  • 编写低代码平台的系统架构师,寻求为业务用户提供自定义公式输入功能,同时确保沙箱环境不被突破。