从任意评估代码中获取返回值

 jawshan212 发布于 2023-02-07 20:27

我要求用户可以提供任意语句,这些语句可以存储在函数中,稍后调用以获取返回值.这userInput可能是一个简单的例子

var x = 10;
x;

我会存储这个

var callback = function() {
    return eval(userInput);
}

然后按预期运行callback()返回10.

但是,我还需要使用显式返回语句来支持该情况,即userInput可能是

var x = 10;
return x;

在这种情况下,上面的eval方法将失败SyntaxError: return not in function.相反,我可以将回调存储为

var callback = new Function(userInput);

我的问题是我想根据规则'得到显式返回值来结合这两种方法,否则得到最后执行语句的结果'.特别是这不能通过在回调创建时分析代码来完成,因为用户可能会做一些奇怪的事情

if(envVar < 10)
    return a;
b * 0.5;

它结合了两者.

有关如何构建callback函数创建以适应这些可能输入的任何想法?不幸的是,不可能在用户上强制执行一种风格或另一种风格.


更新以回答下面的一些评论.

建议的一个解决方案是搜索返回令牌并在new Function和之间进行选择eval.这不适用于我的上一个示例,请参阅http://jsfiddle.net/ZGb6z/2/ - out4应该是"no"但最终未定义,因为最后执行的语句未返回.

另一个建议是修改用户输入,以便在最后一行添加显式返回(如果找不到).不幸的是,不可能知道最后会执行哪个语句.考虑

var x = 10;
switch(x) {
  case 10:
    100;
    break;
  default:
    200;
    break;
}

当被调用它应该返回时100,但需要进行一些认真的分析来确定将任意代码的返回放在何处.

1 个回答
  • 只需使用a try catch,操作输入对你来说将是非常痛苦的,并且try catch在这一点上无法使你的代码更加迟钝.

    var failback = function () {
      try {
        return eval(userInput);
      } catch (e) {
        return Function(userInput);
      }
    };
    

    我真正建议的是投资一个解析器,就像Angular一样.这种事情会阻止你的用户做他们想做的事情,引入攻击向量,yadda,yadda,yadda.

    2023-02-07 20:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有