安全数学求值
将以下提示词粘贴到你的 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 并统一错误处理。
- 财务或结算产品经理:需要让金额按业务位截断,避免浮点数尾巴暴露给业务方。
- 增长或运营:经常配置满减、折扣、分成公式,希望表达式出错时得到清晰提示而不是白屏。