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

3

这是一个使用Google Apps Script作为用户访问应用程序的Web应用。

我们为某些用户定制了数据和代码。

该定制信息包含在开发者的Google Drive中的文本文件中,特定用户仅具有查看权限。

该文本文件的内容可以像下面的虚拟代码一样:

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()在这种情况下是否足够安全?

谢谢,Fausto

2个回答

4

看起来足够安全了。但是使用 eval 还有其他问题,比如使得调试代码变得困难,可能还会出现其他问题。

如果你在代码中生成此类自定义数据,我想这些自定义的种类是可枚举的。如果是这样,我建议将代码保留在你的脚本中并保存在驱动器中的数据及其指示器(例如函数变量名称)用于重建脚本中的配置对象。例如:

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'));
}

你的方法真是太棒了,即使我不确定选项有多少个,我也会按照你的建议去尝试,谢谢!另外,谢谢你对“足够安全”的保证。 - Fausto R.
1
谢谢。我使用了最简单的例子,只是为了更容易理解这个概念。但是这种技术可以变得非常复杂。哦,要保存客户端配置,请使用 JSON.stringify - Henrique G. Abreu

1
  1. It seems secure. But, it will make your execution process slower if you have large data in your text file.

  2. I would still suggest to use JSON.parse() instead of eval() to parse your custom data/code.

    {
      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("?"));
    

那段代码对你有用吗?我相信解析不会包括该函数,并且我尝试时出现了错误。 - Fausto R.
1
@FaustoR。我觉得我解释得不够好,对此我深表歉意。是的,你也可以使用JSON.parse来解析函数。你需要使用reviver函数作为第二个参数,例如:JSON.parse(text, function(K,v){//在这里放置解析getinfo函数的代码}). 让我修改一下代码。 - rpm
谢谢您提供的参考,但我担心这种方法对我来说有些难以理解,至少目前是这样。 - Fausto R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接