2014-11-10 1 views
3

Google Apps Script를 사용하여 앱에 액세스하는 사용자로 실행되는 웹 앱입니다.이 시나리오에서 eval()보다 나은 방법이 있습니까?

일부 사용자에게는 맞춤 데이터와 코드가 있습니다.

맞춤 정보는 개발자의 Google 드라이브에있는 텍스트 파일에 있으며 특정 사용자의보기 권한 만 있습니다.

텍스트 파일의 내용은 더미 코드를 아래와 같이 할 수있다 :

, 우리는 평가()를 사용할 수있는 응용 프로그램으로 그 사용자 정의 데이터/코드를 얻기 위하여
var oConfig = { 
    some : "OK", 
    getinfo : function (s) { 
    return this.some + s; 
    } 
} 

아래와 같이

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

내 질문은 :

  1. 평가보다는 이러한 목표를 달성하기 위해 더 나은 방법이 있나요()?

  2. 텍스트 파일을 개발자 만 편집 할 수 있다는 점을 감안할 때 eval() 보안이 충분합니까?

덕분에, 파우스 토

답변

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

당신의 접근 방식은 JS-굉장합니다! 비록 내가 얼마나 열거 할 수있는 옵션이 있는지에 관해 명확히하지 않지만, 나는 당신이 제안했던 것에 따라 시험 할 것이다, 감사!! 추신. 또한 '충분히 안전함'보증에 감사드립니다. –

+1

감사합니다. 가능한 가장 단순한 예를 사용 했으므로 개념을 더 쉽게 이해할 수 있습니다. 그러나 그러한 기술은 야생화 될 수 있습니다. 클라이언트 구성을 저장하려면 JSON.stringify를 사용하십시오. –

1
  1. 그것은 보안 보인다. 그러나 텍스트 파일에 대용량 데이터가있는 경우 실행 프로세스가 느려집니다.

  2. 사용자 정의 데이터/코드를 구문 분석하기 위해 eval() 대신 JSON.parse()를 사용하는 것이 좋습니다.

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

그 코드가 도움이 되었습니까? 나는 파스가 함수를 포함하지 않을 것이며, 또한 그것을 시도하는 데 오류가 발생한다고 생각한다. –

+1

@FaustoR. 나는 내가 가난한 설명을했다고 생각한다. 내 사과. 예, JSON.parse를 사용하여 함수를 구문 분석 할 수도 있습니다. JSON.parse (text, function (K, v) {}와 같은 두 번째 매개 변수로 리바이버 함수를 사용해야합니다.} getinfo를 함수로 구문 분석하려면 여기에 코드를 입력하십시오. 코드를 수정하겠습니다. – rpm

+0

reviver reference에 감사드립니다.하지만 적어도 지금은 그 접근법을 고수하는 것이 너무 힘듭니다. –

관련 문제