2009-08-26 14 views
2

私はしばしば(JavaScriptで、しかし多くの言語は評価のような機能を持っています)、evalを使うのは「悪い」という意見を聞いてきました。あなたがevalを使うと思うほとんどの事柄は、他の方法、evalがほとんどの場合非常に遅いという事実、そしてユーザが実行されるコードを入力できるようにすることができるという議論がある(適切な予防措置が取られなかった場合)。ほとんどの機能は本質的に「悪い」だけではなく、評価にスポットライトを当てていることがわかっています。いつevalを使うべきですか(実行時に文字列をコードとして実行する)?

evalの有効な用途は何ですか? (アプリケーションをデバッグする開発者にとって素晴らしい機能を提供する以外に)

答えて

6

eval()には良い点と悪い点があります。それをサポートするどの言語でもevalの最悪の側面は、セキュリティホールのためにドアを広げることです。エクスプロライターがカスタムコードを取得する方法を理解できれば、アプリケーションのevalステートメントに書き込むと、プライベートデータを盗んだり、アプリケーションが提供するサービスを無効にするなど、さまざまな悪質なことを行う可能性があります。パフォーマンスは、あなたがすでに発声したもう一つの懸念事項です。

複雑なタスクを簡単に実行するために、コードが動的に他のコードを生成する必要がある領域で、Evalが本当に輝きます。私は今の例を考えることができませんが、あなたがこれを行う必要があった場合はおそらく些細なことにはならないでしょう。私は前の段落で述べたような問題のリスクを最小限にするために絶対に必要なときにのみこれを行うことをお勧めします。可能であれば、ユーザー入力がevalを使用するのに十分安全であるとは決して信用しないでください。

7

read-eval-print loopは通常evalを使用して実装されます。

+0

あなたが話していることを読者に知らせるためには、リンク先のページの最も関連性の高い部分を常に引用する必要があります。 http://stackoverflow.com/help/how-to-answerを参照してください。 –

2

evalの落とし穴は、SQLインジェクションと同じです。あなたのコードで文字列を動的に構築し、その罰金についてevalを呼び出すのであれば。しかし、あなたのコードが盲目的にユーザー入力をevalされる文字列に連結しているなら、あなたはそれを求めています。 evalが有用であることは数多くありますが、evalの必要性を回避する他の方法があるため、人々はそれを避ける傾向があります。

0

信頼できるソースのjsonをデコードします。グラフ計算機のようにユーザーが入力した式を評価する。あまりにも多くのことを考えることはできませんが、それは90年代後半にページ要素にアクセスする正しい方法を習得したくない人々によってかなり酷使されました。

+0

evalを使用せずにJSONをデコードできます。 json2.jsがevalを使用するだけです。 –

0

私はかつてperl CGIスクリプトを書いていました。そのスクリプトの出力は別のマシンの別のスクリプトとeval() 'によって検索されたperlコードでした。私は両端を管理していたため安全だっただけですが、XMLが広く知られる前に何らかの種類のシリアル化フォーマットを作成する必要があったという問題を確かに解決しました。

1

metaprogrammingをシンチにします。プログラムを何らかの方法で分析したい場合(つまり、デバッグやプロファイリングの目的のために)

0

evalの唯一の正当な使用法は、あなたが制御できないコードを実行することです(あなたがjavascript sandboxを作っていない限り、これを行うべきではありません)。

関連する問題