javascriptコードのように文字列を実行するにはどうすればよいですか?
//The user inputs javascript code and clicks run and it runs the javascript code
function getCode () {
retrun code();
}
funciton runCode() {
run(getCode());
}
javascriptコードのように文字列を実行するにはどうすればよいですか?
//The user inputs javascript code and clicks run and it runs the javascript code
function getCode () {
retrun code();
}
funciton runCode() {
run(getCode());
}
欲しい機能はeval
.
function funCode() {
eval(getCode());
};
eval()
確かに機能しますが、コードを取得してコンストラクターに渡すという別のオプションもありますFunction
。これにより、コードを関数本体として使用して新しい関数が作成されます。
これを行うと、いくつかの利点があります。
window
とself
識別子を隠して、グローバル変数の作成を困難にすることができますfunciton runCode() {
// create `window` param---v v--- and `self` param
var f = new Function("window", "self", " 'use strict'; " + getCode())
// force strict mode -----------^
var self = {}
f.call(self, self, self); // pass an object to the `window` and `self` param
// and set the same object as the `this` value
}
これは確かに完全なセキュリティを提供するわけではありませんが、コードを実行するための「サンドボックス」をもう少し提供できます。
self
呼び出し後にオブジェクトを調べて、グローバルを作成しようとしたかどうかを確認することもできます。
try/catch
コードまたは関数の実行を でラップし、スローされたエラーを調べることも役立つ場合があります。
eval() は、探している関数です。
ただし、セキュリティ リスクを伴うため、賢明に使用するか、まったく使用しないでください。
var exec_string = 'alert(\'Hello, World!\')';
eval(exec_string);
「Hello, World!」を出力します。アラートで
組み込みeval
関数を使用できます:
function runCode() {
eval(getCode());
}
この関数は少し「魔法」であることに注意してください。インタプリタは、周囲の字句コンテキストから情報を提供します。その結果、次のように呼び出す必要がありeval
ます。run = eval
設定してから呼び出すことはできませんrun
。(ただし、 と書くこともできますfunction run(s) { return eval(s); }
。)
他のポスターが示しているようeval
に、この目的のために存在する方法です。ただし、eval
有害であるかどうかに関係なく、すべての JavaScript コードを実行します (たとえば、サード パーティ ソースからの JavaScript には無限ループが発生するか、悪意のある動作が発生する可能性があります)。共通のリフレインがあります
eval == evil
そのため、eval は一般的にアンチパターンと見なされます。しかし、このような単純化したアプローチは間違っています。代わりに、評価したい文字列が信頼できる場合は、 eval を使用しても問題ありません。ただし、これが当てはまるケースは比較的少ないことがわかります。明らかに、サードパーティのサイトからのものはすべて危険です (所有者を信頼していても、ハッキングされている可能性があります)。自分のサーバーからでも、「中間者」攻撃の影響を受ける可能性がありますが、これはほとんどのサイトではほとんどありません.
JavaScript 文字列を評価する必要がある最も一般的な理由は、サード パーティの Web ページをレンダリングすることです。この場合、通常は、サーバー (例: http://phantomjs.org/ ) でページをレンダリングしてから、結果をブラウザーに送信することをお勧めします。こうすることで、ブラウザーは安全でないコードの実行から保護されます。
ますます一般的になっているもう 1 つのユース ケースは、ユーザーが入力したコードの結果を確認できるインタラクティブなチュートリアル Web サイトです。 /彼女は自分自身を入力しました。しかし、この場合でも、サイトの機能を壊してしまう間違い (無限ループなど) が心配なので、入力された JavaScript が何かを破壊しないように、(適切な保護手段を使用して) サーバーで評価を実行することをお勧めします。 .
eval
これらすべての問題を解決することを目的としたGoogle caja
( https://code.google.com/p/google-caja/ ) の代替案が考えられますが、私は自分で使用したことがなく、その有用性についてコメントすることはできません。