回答:
関数を使用して実行できます。例:
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()を使用してください。
evalのW3学校ツアー。サイトにはevalの使用可能な例がいくつかあります。これについてはMozillaのドキュメントで詳しく説明されています。
おそらくます警告をたくさん得る安全にこれを使用してについてを。セキュリティ上の大きな問題であるため、ユーザーがeval()に何かを注入することを許可しないでください。
また、eval()には別のスコープがあることも知りたいでしょう。
eval
、W3Schoolsの記事よりも私によく説明しています。良い説明と例で読みやすいものは、developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/… です。いいえ、私はビョルニンゲではありません
これを試して:
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 = delay to run
function ExecStr(cmd, InterVal) {
try {
setTimeout(function () {
var F = new Function(cmd);
return (F());
}, InterVal);
} catch (e) { }
}
//sample
ExecStr("alert(20)",500);
Val
でInterVal
大文字?
nodeを使用していて、eval()
nodejsが提供するコンテキストの影響に関心があるユーザー向けvm
。別のコンテキストでコードの実行をサンドボックス化できるV8仮想マシンを作成します。
さらに一歩物事を取ることでvm2
硬化されvm
たVMは、信頼できないコードを実行することができます。
https://nodejs.org/api/vm.html-公式のnodejs / vm
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
私は同様の質問に答えていて、これを使用せずにこれを達成する方法についてさらに別のアイデアを得ました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(ブラウザーのメモリ内のファイルまたはBlobオブジェクトの表現)を作成するために、基本的にスクリプトを含むBlobを作成します。タグにsrc
プロパティがあるため<script>
、スクリプトは他のURLからロードされた場合と同じように実行されます。
evalはそれを行うべきです。
eval(s);
eval(s);
ただし、このevalは非常に強力であり、非常に危険です。実行しているスクリプトが安全であり、ユーザーが変更できないことをよりよく確信することができます。
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のevalを使用しません。バージョン3以前では、コンパイルステップにevalを使用していました。これは直接セキュリティの問題ではありませんが、攻撃対象領域が拡大する可能性があります。
evalと新しい関数の作成の両方を使用してjavascriptを実行すると、多くのセキュリティリスクが伴います。
const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);
文字列として受け取ったJavascriptを実行するには、このメソッドを使用します。