문자열로 저장된 JavaScript 코드 실행


173

문자열 인 JavaScript를 어떻게 실행합니까?

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    // how do I get a browser to alert('hello')?
}

답변:



134

함수를 사용하여 실행할 수 있습니다. 예:

var theInstructions = "alert('Hello World'); var x = 100";

var F=new Function (theInstructions);

return(F());

3
그러나 결국-전화하는 것과 같지 var F=function(){eval(theInstructions);};않습니까?
Jörn Berkefeld

14
예와 아니오 : eval 코드도 함께 실행되고 Function () 코드는 F ()까지 실행되지 않습니다 (사용 사례? 구문 오류를 확인하지만 코드를 실행하고 싶지 않음)
G3z

2
@stefan It 's beatifull ...new Function("alert('Hello World');")()
Andrés Morales

나는 try / catch 블록 안에서 이것을 시도했고 완벽하게 작동합니다. 이제 텍스트 블록에 입력 된 JavaScript 코드를 가져 와서 내 함수에 전달하고 실행할 수 있습니다. catch 블록은 JavaScript 엔진의 오류 메시지를 DOM 요소에 삽입하고 코드에 오류를 표시 할 수 있습니다. 누군가 내가 작성한 기능을 원한다면 일단 정리하면 여기에 게시 할 수 있습니다.
David Edwards

@DavidEdwards 아직 가지고 있고 게시하면 멋질 것입니다.
Anoop

60

eval기능 전달 된 문자열을 평가합니다.

그러나 사용하는 eval것은 위험 할 수 있으므로 주의해서 사용하십시오.

편집 : annakata 좋은 포인트가 -입니다뿐만 아니라 eval 위험 , 그것이 느린 . 평가할 코드를 그 자리에서 파싱해야하기 때문에 일부 컴퓨팅 리소스가 필요하기 때문입니다.


34
매우 위험하고 느리게-대담하고 기울임 꼴, 밑줄 및 h1
annakata

5
페이지의 다른 곳에서 JavaScript를로드하는 것보다 느리다는 것이 의심 스럽습니다. 파싱해야합니다. 속도가 느리면 다른 범위에서 수행되기 때문에 해당 범위에 대한 리소스를 만들어야 할 수 있습니다.
cgp

6
말하면 eval()위험합니다. 대안이 있습니까?
white_gecko

4
@ coobird 나는 이것이 조금 늦다는 것을 알고 있지만 왜 위험한가요? 사용자는 콘솔을 사용하여 웹 사이트에서 JavaScript 코드를 쉽게 실행할 수 있습니다.
jkd

7
보안이 클라이언트 측 자바 스크립트에 전혀 의존한다면 큰 시간을 허비했으며 eval과는 아무런 관련이 없습니다.
Matthew

20

eval ()을 사용하십시오.

평가의 W3 학교 투어 . 사이트에는 사용 가능한 평가 예가 있습니다. 모질라 문서는 이것을 자세히 다루고 있습니다.

이것을 안전하게 사용하는 것에 대해 많은 경고를받을 것입니다 . 사용자가 eval ()에 모든 것을 삽입하는 것을 허용하지 마십시오 . 큰 보안 문제입니다.

또한 eval ()의 범위 가 다르다는 것을 알고 싶을 것 입니다.


11
w3fools.com . W3C는 평가에 대해 할 말조차 없습니다. 공식적으로 연결하려면 ecma-international.org/ecma-262/5.1/#sec-15.1.2.1
Bergi

7
나는 "공식적인 어떤 것에도 링크하고 싶지 않다, 나는 읽을 수있는 것에 링크하고 싶었다- 당신이 링크 한 것을보고 , 그것이 어떻게 사용되는지에 대한 설명이없고, 예제가없고, 어설프게 할 수있는 방법이 없으며, 그 방법을 따로 설명하고있다 초보자에게는 완전히 부적절한 링크입니다 .. @bjorninge가되지 않겠습니까?
cgp

1
사양은 evalW3Schools 기사보다 나에게 더 잘 설명 됩니다. 좋은 설명과 예제로 읽을 수있는 것은 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 입니다. 그리고 아니, 나는 bjorninge 아니에요
Bergi

나는 그것이 문서가 아니라는 것에 동의 할 것이며, mozilla의 페이지가 전체적으로 더 나은 그림이라는 데 동의 할 것입니다. 의견을 바탕으로 답변을 약간 조정했습니다
cgp

1
ecma-international.org 링크와 관련하여 15 분 이상 JS를 경험 한 모든 사람이 읽을 수 있고 이해할 수있는 것으로 설명하겠습니다. 아주 좋다.
i336_

16

이 시도:

  var script = "<script type='text/javascript'> content </script>";
  //using jquery next
  $('body').append(script);//incorporates and executes inmediatelly

개인적으로 테스트하지는 않았지만 작동하는 것 같습니다.


1
스크립트에서>를 닫는 것을 잊었습니다. var script = "<script type = \"text / javascript \ "> content </ script \>";
rlib

1
폐쇄를 피해야하는 이유는 무엇입니까?
Jools

11

@Hossein Hajizadeh 와 조금 alerady가 말한 하지만 더 자세하게 :

대안이 있습니다 eval() 있습니다.

함수 setTimeout() 는 밀리 초 간격으로 무언가를 실행하도록 설계되었으며 실행되는 코드는 문자열로 형식화됩니다.

다음과 같이 작동합니다.

ExecuteJavascriptString(); //Just for running it

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    setTimeout(s, 1);
}

1 문자열을 실행하기 전에 1 밀리 초 동안 대기한다는 의미입니다.

가장 올바른 방법은 아니지만 작동합니다.


0에 0을 전달할 때 왜 1 밀리 초를 낭비 setTimeout합니까? 어쨌든 실행이 비동기 적으로 이루어집니다. 즉, setTimeout호출 을 따르는 모든 코드 는 코드가 전달 되기 전에 호출됩니다 setTimeout(0으로 호출 된 경우에도).
jox

🤷‍♀️ setTimeout 작동 방식에 대한 설명이 더 좋다고 생각했습니다
Anton Juul-Naber

8
new Function('alert("Hello")')();

이것이 최선의 방법이라고 생각합니다.


7

아래와 같이 eval 을 사용하십시오 . Eval은주의해서 사용해야하며, " eval is evil " 에 대한 간단한 검색은 몇 가지 포인터를 던져야합니다.

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    eval(s);
}

2
"eval is evil"에 대한 간단한 검색에 대한 좋은 팁 감사합니다!
Taptronic

5

복잡하고 난독 화 된 많은 스크립트에서이를 확인했습니다.

var js = "alert('Hello, World!');" // put your JS code here
var oScript = document.createElement("script");
var oScriptText = document.createTextNode(js);
oScript.appendChild(oScriptText);
document.body.appendChild(oScript);

5

특정 시간 이후에 특정 명령 (문자열)을 실행하려면-cmd = your code-InterVal = 지연 실행

 function ExecStr(cmd, InterVal) {
    try {
        setTimeout(function () {
            var F = new Function(cmd);
            return (F());
        }, InterVal);
    } catch (e) { }
}
//sample
ExecStr("alert(20)",500);

@SteelBrain은 ExecStr ( "alert (20)", 500);
Hossein Hajizadeh 2016 년

1
ValInterVal대문자로?
레드 울프 프로그램 19 :

4

노드를 사용하고 있으며 eval()nodejs 오퍼 의 컨텍스트 의미와 관련이있는 사용자에게 적합합니다 vm. 별도의 컨텍스트에서 코드 실행을 샌드 박스 할 수있는 V8 가상 머신을 만듭니다.

한 단계 더 일을 복용입니다 vm2굳어있는 vmVM을 신뢰할 수없는 코드를 실행할 수.

const vm = require('vm');

const x = 1;

const sandbox = { x: 2 };
vm.createContext(sandbox); // Contextify the sandbox.

const code = 'x += 40; var y = 17;';
// `x` and `y` are global variables in the sandboxed environment.
// Initially, x has the value 2 because that is the value of sandbox.x.
vm.runInContext(code, sandbox);

console.log(sandbox.x); // 42
console.log(sandbox.y); // 17

console.log(x); // 1; y is not defined.

2
"eval is evil"라고 말하고 상황이나 해결책을 제시하지 않고 실제로 문제를 해결하려고합니다. +1
레드 울프 프로그램 1

3
eval(s);

그러나 사용자가 데이터를 가져 오는 경우 위험 할 수 있지만 문제가 자체 브라우저에서 충돌하는 경우가 있습니다.


1
바로 그거죠. 서버 측에서는 평가가 위험합니다. 클라이언트에서 ... 별로는 아닙니다. 사용자는 브라우저 및 붐의 주소에 javascript : someevilcode를 입력하면됩니다. 바로 거기에 있습니다.
Esben Skov Pedersen

@EsbenSkovPedersen 최소한 크롬에서는 방지되며 사용자가 eval코드 를 작성하는 사이트와 달리 사용자 작업이 필요합니다. 예를 들어 사용자가 페이지를로드하는 것만으로도 다른 사용자의 계정을 훔칠 수 있습니다.
1j01

1
@ 1j01 공정한 의견은 5 살입니다.
Esben Skov Pedersen 7:27에

@EsbenSkovPedersen 그건 사실이야 :)
1j01

2

부정 행위인지 확실하지 않은 경우 :

window.say = function(a) { alert(a); };

var a = "say('hello')";

var p = /^([^(]*)\('([^']*)'\).*$/;                 // ["say('hello')","say","hello"]

var fn = window[p.exec(a)[1]];                      // get function reference by name

if( typeof(fn) === "function") 
    fn.apply(null, [p.exec(a)[2]]);                 // call it with params


2

나는 비슷한 질문에 대답하고 그것을 사용하지 않고 이것을 달성하는 방법에 대한 또 다른 아이디어를 얻었습니다 eval().

const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);

위의 코드에서 기본적으로 객체 URL (브라우저 메모리에서 File 또는 Blob 객체 표현)을 만들기 위해 스크립트를 포함하는 Blob을 생성합니다. 당신이 이후 src에 자산 <script>태그, 스크립트가 다른 URL에서로드 된 것처럼 동일한 방식으로 실행됩니다.


2
function executeScript(source) {
    var script = document.createElement("script");
    script.onload = script.onerror = function(){ this.remove(); };
    script.src = "data:text/plain;base64," + btoa(source);
    document.body.appendChild(script);
}

executeScript("alert('Hello, World!');");


0
eval(s);

그러나 그 평가는 매우 강력하고 안전하지 않습니다. 사용자가 실행중인 스크립트가 안전하고 변경 불가능하다는 것을 확신하는 것이 좋습니다.


1
JS에서는 사용자가 "javascript : document.write ("Hello World ");"를 입력하여 모든 것을 변경할 수 있습니다. 거의 모든 브라우저의 주소 표시 줄에
UnkwnTech

1
예, 그러나 전역 변수를 사용하지 않고 클로저 등에 함수를
숨기면 어려움을 겪을 수 있습니다

0

하나는 mathjs 를 사용할 수 있습니다

위 링크의 스 니펫 :

// evaluate expressions
math.evaluate('sqrt(3^2 + 4^2)')        // 5
math.evaluate('sqrt(-4)')               // 2i
math.evaluate('2 inch to cm')           // 5.08 cm
math.evaluate('cos(45 deg)')            // 0.7071067811865476

// provide a scope
let scope = {
    a: 3,
    b: 4
}
math.evaluate('a * b', scope)           // 12
math.evaluate('c = 2.3 + 4.5', scope)   // 6.8
scope.c                                

scope모든 객체입니다. 따라서 전역 범위를 evalute 함수에 전달하면 alert ()을 동적으로 실행할 수 있습니다.

또한 mathjs는 샌드 박스에서 실행되므로 eval ()보다 훨씬 좋습니다.

사용자는 표현식 파서를 통해 악성 JavaScript 코드를 삽입하려고 시도 할 수 있습니다. mathjs의 표현식 파서는 표현식을 실행할 수있는 샌드 박스 환경을 제공하여이를 불가능하게합니다. 알려지지 않은 보안 취약점이있을 수 있으므로 특히 서버 측에서 임의의 표현식을 실행할 때주의해야합니다.

최신 버전의 mathjs는 eval () 또는 Function ()을 사용하지 않습니다.

파서는 적극적으로 보안 공격의 주요 원인 인 JavaScript 내부 평가 및 새로운 기능에 대한 액세스를 차단합니다. Mathjs 버전 4 이상은 기본적으로 JavaScript의 평가를 사용하지 않습니다. 버전 3 이하에서는 컴파일 단계에 eval을 사용했습니다. 이것은 직접 보안 문제는 아니지만 가능한 공격 영역이 더 커집니다.


0

eval을 사용하고 새로운 함수를 생성하여 자바 스크립트를 실행 하면 많은 보안 위험이 따릅니다.

const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);

문자열로받은 Javascript를 실행하려면이 방법을 선호합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.