답변:
함수를 사용하여 실행할 수 있습니다. 예:
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
var F=function(){eval(theInstructions);};않습니까?
new Function("alert('Hello World');")()
eval기능 전달 된 문자열을 평가합니다.
그러나 사용하는 eval것은 위험 할 수 있으므로 주의해서 사용하십시오.
편집 : annakata 좋은 포인트가 -입니다뿐만 아니라 eval 위험 , 그것이 느린 . 평가할 코드를 그 자리에서 파싱해야하기 때문에 일부 컴퓨팅 리소스가 필요하기 때문입니다.
eval()위험합니다. 대안이 있습니까?
eval ()을 사용하십시오.
평가의 W3 학교 투어 . 사이트에는 사용 가능한 평가 예가 있습니다. 모질라 문서는 이것을 자세히 다루고 있습니다.
이것을 안전하게 사용하는 것에 대해 많은 경고를받을 것입니다 . 사용자가 eval ()에 모든 것을 삽입하는 것을 허용하지 마십시오 . 큰 보안 문제입니다.
또한 eval ()의 범위 가 다르다는 것을 알고 싶을 것 입니다.
evalW3Schools 기사보다 나에게 더 잘 설명 됩니다. 좋은 설명과 예제로 읽을 수있는 것은 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 입니다. 그리고 아니, 나는 bjorninge 아니에요
이 시도:
var script = "<script type='text/javascript'> content </script>";
//using jquery next
$('body').append(script);//incorporates and executes inmediatelly
개인적으로 테스트하지는 않았지만 작동하는 것 같습니다.
@Hossein Hajizadeh 와 조금 alerady가 말한 하지만 더 자세하게 :
대안이 있습니다 eval() 있습니다.
함수 setTimeout() 는 밀리 초 간격으로 무언가를 실행하도록 설계되었으며 실행되는 코드는 문자열로 형식화됩니다.
다음과 같이 작동합니다.
ExecuteJavascriptString(); //Just for running it
function ExecuteJavascriptString()
{
var s = "alert('hello')";
setTimeout(s, 1);
}
1 문자열을 실행하기 전에 1 밀리 초 동안 대기한다는 의미입니다.
가장 올바른 방법은 아니지만 작동합니다.
setTimeout합니까? 어쨌든 실행이 비동기 적으로 이루어집니다. 즉, setTimeout호출 을 따르는 모든 코드 는 코드가 전달 되기 전에 호출됩니다 setTimeout(0으로 호출 된 경우에도).
아래와 같이 eval 을 사용하십시오 . Eval은주의해서 사용해야하며, " eval is evil " 에 대한 간단한 검색은 몇 가지 포인터를 던져야합니다.
function ExecuteJavascriptString()
{
var s = "alert('hello')";
eval(s);
}
특정 시간 이후에 특정 명령 (문자열)을 실행하려면-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);
Val에 InterVal대문자로?
노드를 사용하고 있으며 eval()nodejs 오퍼 의 컨텍스트 의미와 관련이있는 사용자에게 적합합니다 vm. 별도의 컨텍스트에서 코드 실행을 샌드 박스 할 수있는 V8 가상 머신을 만듭니다.
한 단계 더 일을 복용입니다 vm2굳어있는 vmVM을 신뢰할 수없는 코드를 실행할 수.
https://nodejs.org/api/vm.html- 공식 nodejs / vm
https://github.com/patriksimek/vm2- 확장 된 vm2
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.
eval(s);
그러나 사용자가 데이터를 가져 오는 경우 위험 할 수 있지만 문제가 자체 브라우저에서 충돌하는 경우가 있습니다.
eval코드 를 작성하는 사이트와 달리 사용자 작업이 필요합니다. 예를 들어 사용자가 페이지를로드하는 것만으로도 다른 사용자의 계정을 훔칠 수 있습니다.
부정 행위인지 확실하지 않은 경우 :
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
새로운 함수와 apply ()도 함께 작동
var a=new Function('alert(1);')
a.apply(null)
eval(). developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
나는 비슷한 질문에 대답하고 그것을 사용하지 않고 이것을 달성하는 방법에 대한 또 다른 아이디어를 얻었습니다 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에서로드 된 것처럼 동일한 방식으로 실행됩니다.
eval(s);
그러나 그 평가는 매우 강력하고 안전하지 않습니다. 사용자가 실행중인 스크립트가 안전하고 변경 불가능하다는 것을 확신하는 것이 좋습니다.
하나는 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을 사용했습니다. 이것은 직접 보안 문제는 아니지만 가능한 공격 영역이 더 커집니다.
eval을 사용하고 새로운 함수를 생성하여 자바 스크립트를 실행 하면 많은 보안 위험이 따릅니다.
const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);
문자열로받은 Javascript를 실행하려면이 방법을 선호합니다.