2016-08-26 2 views
0

저는 많은 사람들로부터 eval()과 새로운 Function()을 사용하는 것이 매우 역동적 인 특성 때문에 안전하지 않은 함수로 간주된다는 사실을 알고 있습니다. 원래 함수 인 문자열을 함수로 변환하면 다른 클러스터에서도이 함수를 사용할 수 있습니다. 이것은 사용자의 편의를 위해 개발 한 간단한 테스트 프로그램입니다. eval() 함수를위한 것이므로 잘 작동합니다. eval() 또는 심지어 새로운 Function() 이외의 다른 방법이 있습니까 ??문자열을 함수로 변환하는 eval()에 대한 최선의 대안은 무엇입니까?

$(document).ready(function(){ 

savecallback = function() { 
alert("testing savecallback"); 
} 

var stringname = "function() {alert("testing savecallback");}"; 

jQuery(".divclass").click(function() { 
eval(stringname); 
}); 

}); 

편집 :

실제로 문자열이 내 프로젝트 파일에 검사 한 것을 대신 함수 이름의 전체 기능 구현을 저장하고, 미안들 해요. 위의 코드를 수정했습니다 (var stringname에 있음).

답변

0

eval()과 new Funciton()이 안전하지 않은 이유는 실행 가능한 코드를 생성 및/또는 실행할 수 있기 때문입니다. 실행 가능한 코드를 생성해야하므로 안전하지 않은 방법으로 찾을 수 있습니다. 당신이 도움이 될 수 있습니다 : 당신이 무엇에서

'해결하기 위해 노력하고 어떤 문제에 대한 자세한 내용은 - 내가 추측하고있어

0

은 아마 당신이 뭘하려는 건지에 대한 더 나은 만능 해결 방법이 있습니다 당신이 통제 할 수없는이 코드의 일부 또는 전부를이 있다면

// object to store callbacks on 
var callbacks = {}; 

// define your callback 
callbacks['savecallback'] = function() { 
    alert('testing savecallback'); 
} 

// save your callback name 
var stringname = 'savecallback'; 

jQuery(".divclass").click(function() { 
    // call your callback by name 
    callbacks[stringname](); 
}); 

: 게시했습니다, 나는 당신의 기능을위한 객체 속성을 사용하고 대신 전체 기능 실행 문자열의 객체 속성의 이름을 저장하는 생각 하는데요 (콜백 정의 또는 저장된 문자열) 우리에게 알려주십시오 - 주위에도 방법이 있습니다. 콜백이 윈도우 범위에 정의되어 있다면 window[stringname]();을 사용할 수 있고 콜백 문자열을 변경할 수 없다면 stringname = stringname.replace('()','');을 사용할 수 있습니다. 어쨌든, 실제로 eval 대신에 실행할 함수를 식별하기 위해 문자열을 사용할 수 있다면 그 것이 가장 좋을 것입니다.

편집 : 전체 기능 구현이 문자열 인 경우 거의 eval입니다. 스크립트 태그 내의 DOM에 문자열을 삽입 할 수는 있지만, 테스트 (테스트되지 않은 경우)하는 것만으로도 eval보다 위험 할 수 있습니다. 거의 모든 시간에 문자열 형식으로 실행하려는 코드가 있으면 그 문자열에서 이전 내용을 실행할 위험이 있습니다. 만큼 당신이 위험을 알고있는 한, 평가는 세상의 끝이 아니다 -로 유지하려고 가능한, 예를 들어 같은 폐쇄 :

function getEvalClosure(evalCode) { 
    return function() { return eval(evalCode); } 
} 

jQuery(".divclass").click(function() { 
    var f = (getEvalClosure(stringname))(); 
    // i noticed your code is itself a function, 
    // so you'd have to run it after eval-ing it into existence 
    f(); 
}); 

이제까지 '안전'하지 않습니다 ,하지만 최종 사용자가 귀하의 자바 스크립트의 어쨌든 어떤 부분과 원숭이를 기억, 그래서 내가 처음부터 클라이언트 자바 스크립트에서 너무 민감한 아무것도 수행하지 않는 것이 좋습니다. 이 경우 'getEvalClosure'함수는 eval이 작동하는 새로운 범위를 작성하여 나머지 코드와 한 단계 더 멀리 유지합니다. 필자는 AJAX 요청에서 문자열 화 된 JSON을 모든 라이브러리가 자동으로 처리하기 전에 eval을 사용하여 광범위하게 사용했습니다. 사실 구현에 있어도 eval() 또는 2가 여전히 존재할 것입니다.

행운을 빈다!

0

원하는 모든 기능을 미리 알고있는 경우 (즉, 가능한 모든 기능을 미리 알고있는 경우) string-> function 맵을 만들어 문자열 키를 기반으로 함수를 조회 할 수 있습니다.

이 방법을 사용하면 위험한 eval()을 사용자가 입력하지 않고도 안전하게 호출 할 수 있습니다.예를 들어

:

$(document).ready(function(){ 

    savecallback = function() { 
     alert("testing savecallback"); 
    } 

    anothercallback = function() { 
     alert("testing anothercallback"); 
    } 

    var availableFunctions = { 
     "savecallback()": savecallback, 
     "anothercallback()": anothercallback 
    }; 

    var stringname = "savecallback()"; 

    jQuery(".divclass").click(function() { 
     if (stringname in availableFunctions) { 
      availableFunctions[stringname].call(); 
     } 
    }); 

}); 
관련 문제