如何在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
相关产品推荐
相关产品推荐

