You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JSONstat用户自定义过滤器中替代已废弃的with()语句?

替代with()+eval实现JSONstat数据集过滤的方案
  • 用new Function()构造可控的过滤函数
    直接把用户的条件字符串包装成一个接收数据对象的函数,让条件里的字段自动映射到对象属性,彻底抛弃with()。示例代码:

    function buildFilter(condition) {
      // 用new Function创建函数,参数为data,函数体返回用户的条件表达式
      return new Function('data', `return ${condition}`);
    }
    
    // 调用示例
    const filterFn = buildFilter('city === "New York" && year === "2012"');
    // 假设item是JSONstat数据集中的单条数据对象
    const matches = filterFn({ city: "New York", year: "2012" }); // 返回true
    

    这种方式比eval更安全,因为函数的作用域被限制在传入的data对象上,不会污染全局作用域,也避开了with()的废弃问题。

  • 结合解构赋值限定可访问字段
    如果能提前确定数据集的所有维度字段(比如city、year等),可以用解构赋值进一步缩小作用域,避免用户访问非法变量:

    function buildRestrictedFilter(condition, allowedFields) {
      // 生成解构参数,比如allowedFields为['city','year']则参数是{city,year}
      const paramStr = `{${allowedFields.join(',')}}`;
      return new Function(paramStr, `return ${condition}`);
    }
    
    // 调用示例
    const filterFn = buildRestrictedFilter('city === "Chicago" || year === "2012"', ['city', 'year']);
    const matches = filterFn({ city: "Chicago", year: "2011" }); // 返回true
    

    这种方法更严谨,用户的条件只能用到指定的字段,降低了注入风险。

  • 安全校验不可少
    无论哪种方案,面对不可信用户输入时都要做校验:

    • 用正则表达式过滤非法内容,比如只允许字母、数字、双引号、比较运算符(=、!)、逻辑运算符(&&、||)和空格
    • 禁止出现全局对象引用(如window、document)或函数调用
    • 验证字段名是否在允许的列表内

内容的提问来源于stack exchange,提问作者Esszed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:55:25