Agent Skills
返回列表
安全数学求值

安全数学求值

开发编程 更新于 2026.08.30

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

请根据 https://skillhub.cn/install/skillhub.md,安装 @user_f1b049da/mul2026254

技能介绍

要解决什么问题

业务系统里经常会出现「报价 = 数量 × 单价 × 折扣」这类公式。最常见的做法是把表达式丢给 eval,但用户输入一旦进入 eval,就等于给 XSS 和任意代码执行开了门。另一个问题是浮点数:0.1 + 0.2 在 JavaScript 里等于 0.30000000000000004,直接返回给前端就是事故。本技能要解决两件事:一是不使用 eval / new Function 也能安全计算数学表达式;二是对金额类结果做定点精度控制,避免浮点误差直接展示到页面上。

它如何工作

核心依赖 mathjs 提供的 evaluate 方法,而不是 JavaScript 原生的动态执行能力。整体流程分四步:

  • 词法与语法解析:mathjs.evaluate 内部完成表达式解析,支持加减乘除、幂运算、三角函数、常量(如 pi、e)等标准数学语法,开发者不需要手写 parser。
  • 作用域隔离:调用时显式传入一个受控的 scope 对象,只包含业务需要的变量(如单价、数量)。业务对象(用户信息、请求上下文等)不注入 scope,避免被表达式越权访问。
  • 错误捕获:表达式语法错误、引用了未定义变量、运算类型不匹配等情况,在调用层通过 try/catch 统一捕获,转换为可读的错误提示返回给调用方,不会把异常抛穿到页面渲染层。
  • 结果格式化:对金额、分成这类需要展示的数值,调用 toFixed 按业务指定位数截断。默认保留 2 位小数,也可通过参数传入其他精度要求。

适用边界

这个技能只解决数学表达式求值这一个点,不涉及:

  • 业务规则编排或条件逻辑(if/else、逻辑运算虽然能算,但复杂业务规则应改用专门的规则引擎)
  • 非数学语义的表达式解析(字符串拼接、JSON 构造等不在范围内)
  • 表达式持久化与版本管理(需要这类能力应配合 DB 和 DSL 单独设计)

使用时务必记住:scope 里只放数学计算需要的数值变量。不要把整个用户对象、数据库连接、请求上下文塞进 scope,否则安全边界就形同虚设。表达式的来源如果是用户输入,建议额外加一层长度限制和字符白名单校验,防止超长表达式拖垮解析性能。

使用场景

  • 电商运营在结算页输入数量、单价、折扣,需要实时算出应付金额并保留两位小数。
  • 财务在分成结算时需要按比例表达式算出各方应得金额,避免浮点误差。
  • SaaS 后端在报价接口里需要安全解析用户传入的价格公式,禁止使用 eval。
  • 活动运营需要计算满减后到手价,表达式来自后台配置,出错要给可读提示。

适合人员

  • 前端工程师:需要在页面实时展示报价或分成结果,同时避免 eval 引入 XSS 风险。
  • 后端工程师:负责结算或报价接口,想把表达式求值收敛到受控 scope 并统一错误处理。
  • 财务或结算产品经理:需要让金额按业务位截断,避免浮点数尾巴暴露给业务方。
  • 增长或运营:经常配置满减、折扣、分成公式,希望表达式出错时得到清晰提示而不是白屏。