Evalは、実行時(またはメタプログラミング時)にプログラムを生成した場合の1つの特定の場合を除いて悪いとみなされます。唯一の選択肢は、パーサー/インタープリタを書くことです(javascriptでは比較的簡単に行うことができますが、javascript自体よりも単純な言語で行うことができます)。したがって、ここでeval()
関数を使用することは合理的です(ブラウザ側のコンパイラを合理的に高速なコードにするためには、生成されたコンパイル済みのjavascriptにはevalを使用する必要があります)。
しかし、評価されたコードは、実行されるスクリプトと同じ特権とその環境へのアクセス権を持つため、evalの問題はセキュリティです。最近、EcmaScript 5は厳密モードを導入することでこの問題に部分的に対処するように設計されました。厳密モードコードを危険な操作について静的に解析できるためです。
これは通常、サーバーのコードを分析してセキュリティを解決し、JavaScriptの厳密な安全なサブセットのみを使用できるようにするCajaのようなアプローチがあります(下位互換性の理由で問題があります)。
よく使用されるもう1つのアプローチは、親ページに埋め込まれた要素(通常はなどのサイトで使用される)でユーザーが生成したjavascriptを実行して悪意のある攻撃から保護しないことです。しかし、iframe
がその親ページにアクセスしてコンテンツにアクセスすることは安全ではありません。
このiframe
のアプローチであっても、最近、いくつかの進歩があった。クロームであなたも異なる権限を指定することができますsandbox
属性
<iframe src="sandboxedpage.html" sandbox="allow-scripts"></iframe>
を使用して、それを受けにくいようにします。
安全に簡単にメタプログラミングを使用する簡単な方法がありますが、まだありません。
http://jsbin.comはオープンソースで、[gedub](https://github.com/remy/jsbin)でホストされています。そのコードを勉強するのがとても簡単になります。 – Sampson
ちょうど別のドメインでコードが実行されていると、あなたはかなり完了しています。 – Yoshi
あなたはevalの邪悪について何をお読みになりましたか? – user123444555621