在这种情况下,有比eval()更好的方法吗?

时间:2014-11-10 15:09:34

标签: google-apps-script

这是一个使用Google Apps脚本的网络应用,以访问该应用的用户身份运行。

我们为某些用户提供自定义数据和代码。

该自定义信息位于开发者Google云端硬盘中的文本文件中,仅具有来自特定用户的查看权限。

该文本文件的内容可能类似于虚拟代码:

var oConfig = {
  some : "OK",  
  getinfo : function (s) {
    return this.some + s;
  }
}

为了将自定义数据/代码放入应用程序,我们可以使用eval(),如下所示:

  var rawjs = DriveApp.getFileById(jsid).getBlob().getDataAsString();
  eval(rawjs);
  Logger.log(oConfig.getinfo("?")); // OK?

我的问题是:

  1. 有没有比eval()有更好的方法来实现这个目标?

  2. 在这种情况下,eval()是否足够安全,考虑到文本文件只能由开发人员编辑?

  3. 谢谢,Fausto

2 个答案:

答案 0 :(得分:4)

嗯,看起来很安全。但是使用eval还有其他问题,例如难以调试代码,以及其他一些问题。

如果您在代码中生成此类自定义数据,我想可以枚举各种此类自定义项。如果是这样,我将代码留在您的脚本中并保存在Drive just data中,并使用指针(如函数变体名称)来说明如何在脚本中重建配置对象。例如:

function buildConfig(data) {
  var config = JSON.parse(data); //only data, no code
  config.getInfo = this[config.getInfo]; //hook code safely
  return config;
}

function customInfo1(s) { return this.some + s; }

function customInfo2(s) { return s + this.some; }

function testSetup() {
  //var userData = DriveApp.getFileById(jsid).getBlob().getDataAsString();
  var userData = '{"some":"OK", "getInfo":"customInfo1"}'; //just for easier testing

  var config = buildConfig(userdata); //no eval

  //let's test it
  Logger.log(config.getInfo('test'));
}

答案 1 :(得分:1)

  1. 看起来很安全。但是,如果文本文件中包含大量数据,它将使执行过程变慢。

  2. 我仍然建议使用JSON.parse()而不是eval()来解析自定义数据/代码。

    {
      some : "OK",         
      getinfo : "function(s){return this.some +\" \"+ s;}"       
    }        
    
    var rawjs = DriveApp.getFileById(jsid).getBlob().getDataAsString();        
    var oConfig = JSON.parse(rawjs, function(k,v){//put your code here to parse function}); // avoid eval()        
    Logger.log(oConfig.getinfo("?"));