【问题标题】:How can I update the condition in a function-wrapped while with callback without using eval()?如何在不使用 eval() 的情况下使用回调更新函数包装中的条件?
【发布时间】:2019-04-17 18:47:36
【问题描述】:

我想定义一个函数,它将充当while 语句(带有一些插件,但为了简单起见,我将在这里展示一个基本的包装器)。所以将条件作为第一个参数,将在每个循环中执行的回调作为第二个参数。

我最初是用这个版本来的:

const wrappedWhile = (conditions, callback) => {
  let avoidInfinite = 0;

  while (conditions) {
    callback();
    
    if (avoidInfinite >= 10) {
      console.log('breaking while statement for avoiding infinite loop');
      break;
    }
    
    avoidInfinite++;
  }
};

let i = 0;

wrappedWhile(i < 5, () => {
  console.log('log from callback: i =', i);
  
  if (i >= 5) {
    console.log('the loop continues whereas it should stop');
  }
  
  i++;
});

从逻辑上讲,它应该在i &gt;= 5 时停止。但是conditions 参数是wrappedWhile 函数中的一个简单布尔值,所以它总是true,因为i 在调用时小于5

然后,我想出了另一个版本,在循环的每次迭代中都会评估 conditions

const wrappedWhile = (conditions, callback) => {
  while (Function('return ' + conditions + ';')()) {
    callback();
  }
};

let i = 0;

wrappedWhile('i < 5', () => {
  console.log('log from callback: i =', i);
  i++;
});

但是,如果我没记错的话,Function 使用eval() 是为了工作,而且我们都曾经听说过eval() 的使用对于代码注入来说并不安全。

现在我的问题很简单:是否有更安全的替代方法可以实现我想要实现的目标?

经过一番研究,我发现了一个link,它展示了一种在沙盒环境中evalify的方法,但我不知道这是不是好方法。

【问题讨论】:

  • 你能传递函数() =&gt; i &lt; 5吗?毕竟,你正在传递另一个函数……
  • 谢谢,它正在工作(正如 wanjas 在他的回答中显示的那样)。它与while 语法有点不同,但我想它已经足够好了!

标签: javascript security while-loop eval


【解决方案1】:

您应该将函数作为条件传递并在 while 循环中调用它

const wrappedWhile = (conditions, callback) => {
  let i = 0;

  while (conditions(i)) {
    callback(i);
    
    if (i >= 10) {
      console.log('breaking while statement for avoiding infinite loop');
      break;
    }
    
    i++;
  }
};

wrappedWhile((i) => (i < 5), (iteration) => {
  console.log('log from callback: i =', iteration);
});

【讨论】:

  • i 不能在 wrappedWhile() 内,因为条件可能涉及其他变量,但它正在工作。我建议编辑你的 sn-p。谢谢你的回答!
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多