javascript - 在这种情况下有没有比 eval() 更好的方法?

标签 javascript google-apps-script google-drive-api eval

这是一个网络应用程序,使用 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() 是否足够安全?

谢谢,福斯托

最佳答案

嗯,它看起来足够安全。但是使用 eval 有其他问题,比如难以调试您的代码,并且可能还有一些其他问题。

如果您在自己的代码中生成此类自定义数据,我想此类自定义的种类繁多。如果是这样,我会将代码保留在您的脚本中,并在 Drive 中仅保存数据并使用指示符(如函数变体名称)来说明如何在脚本中重建配置对象。例如:

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

关于javascript - 在这种情况下有没有比 eval() 更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26846786/

相关文章:

javascript - React-Big-Calendar中如何使用startAccessor指定日期

javascript - Angular ng-repeat 类似参数绑定(bind)

python - 谷歌应用程序脚本 - "message": "Requested entity was not found." with devMode = false

web-applications - 谷歌电子表格更新多个文件中的同一行

google-apps-script - 用于搜索 Google 云端硬盘的 Google Apps 脚本

javascript - 这个方法在 React.js 中执行什么?

javascript - 在 Angular 中集成 Brightcove 播放器

google-apps-script - 如何或在何处定义在多个电子表格中使用的函数?

google-drive-api - Google Sheet OAuth 范围只能访问几个文件?

android - 如何使用 DriveApi 从谷歌驱动器下载选定的文件?