私は Enyo Web アプリケーションを開発しており、ユーザーがブラウザで Javascript コードを記述して実行できるようにしたいと考えています。
を使用してこれを行うことができますwindow.eval
。しかし、私は eval の弊害について読んだことがあります。
http://learn.knockoutjs.com/、http://jsfiddle.netなどの例がブラウザの実行で安全に行われる方法と、ベストプラクティスとは何かを明らかにできる人はいますか?
私は Enyo Web アプリケーションを開発しており、ユーザーがブラウザで Javascript コードを記述して実行できるようにしたいと考えています。
を使用してこれを行うことができますwindow.eval
。しかし、私は eval の弊害について読んだことがあります。
http://learn.knockoutjs.com/、http://jsfiddle.netなどの例がブラウザの実行で安全に行われる方法と、ベストプラクティスとは何かを明らかにできる人はいますか?
Evalは、実行時(またはメタプログラミング)中にプログラムを生成する1つの特定のケースを除いて、すべて悪と見なされます。唯一の代替手段は、パーサー/インタープリターを作成することです(これは、JavaScriptで比較的簡単に実行できますが、JavaScript自体よりも単純な言語で実行できます。私が作成したので楽しかったです)。したがって、eval()
ここで関数を使用することは正当です(ブラウザー側のコンパイラーを適度に高速なコードにするためには、生成されたコンパイル済みJavaScriptにevalを使用する必要があります)。
ただし、評価されたコードには、それを実行するスクリプトと同じ特権と環境へのアクセス権があるため、evalの問題はセキュリティです。これは最近非常にホットなトピックであり、EcmaScript 5は、strictモードのコードを静的に分析して危険な操作を行うことができるため、strictモードを導入することでこの問題に部分的に対処するように設計されています。
これは通常十分ではない(または下位互換性の理由で問題がある)ため、サーバー上のコードを分析することでセキュリティを解決し、JavaScriptの厳密で安全なサブセットのみを使用できるようにするCajaのようなアプローチがあります。
<iframe>
もう1つのよく使用されるアプローチは、ユーザーを保護することですが、親ページに埋め込まれた要素(通常はjsfiddleなどのサイトで使用される)でユーザー生成のJavaScriptを実行することで、悪意のある攻撃から保護することはできません。iframe
ただし、親ページにアクセスしてコンテンツにアクセスできるのは安全ではありません。
このiframe
アプローチでも、最近、sandbox
属性を使用して脆弱性を軽減するために、たとえばChromeでいくつかの進歩がありました。
<iframe src="sandboxedpage.html" sandbox="allow-scripts"></iframe>
ここでは、さまざまな特権を指定することもできます。
うまくいけば、安全で簡単なメタプログラミングをすぐに使用する簡単な方法がありますが、まだそこにはありません。