这是一个使用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?
我的问题是:
有没有比eval()有更好的方法来实现这个目标?
在这种情况下,eval()是否足够安全,考虑到文本文件只能由开发人员编辑?
谢谢,Fausto
答案 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)
看起来很安全。但是,如果文本文件中包含大量数据,它将使执行过程变慢。
我仍然建议使用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("?"));