2

私はよく(javascriptで、しかし多くの言語にはevalのような機能がある)evalの使用は「悪い」という議論を聞いたことがあります。evalを使用すると思われるほとんどのことは他の方法で実行できるという議論、ほとんどの場合evalは非常に遅いという事実、ユーザーが実行するコードを入力できるという事実(適切な予防策が講じられていない場合) )。ほとんどの機能は本質的に「悪い」だけでなく、評価にスポットライトを当てることができます。

evalの有効な用途にはどのようなものがありますか?(アプリケーションをデバッグする開発者に優れた機能を提供することに加えて)

4

7 に答える 7

7

read-eval-printループは通常、evalを使用して実装されます。

于 2009-08-26T22:24:54.990 に答える
6

eval() には良い点と悪い点があります。eval をサポートするすべての言語での eval の最悪の側面は、セキュリティ ホールへの扉を大きく開いてしまうことです。悪用者が、アプリケーションの eval ステートメントに記述したカスタム コードを取得する方法を理解できる場合、プライベート データを盗んだり、アプリケーションが提供するサービスを無効にしたりするなど、あらゆる種類の極悪なことを実行できる可能性があります。パフォーマンスは、あなたが既に表明したもう 1 つの懸念事項です。

Eval は、複雑なタスクを簡単に実行するために、コードが他のコードを動的に生成する必要がある分野で真価を発揮します。今は例が思い浮かびませんが、これを行う必要がある場合は、おそらく簡単ではありません。ただし、前の段落で述べた点のリスクを最小限に抑えるために、絶対に必要な場合にのみこれを行うことをお勧めします。可能であれば、eval を使用するのに十分安全であるとしてユーザー入力を信頼しないでください。

于 2009-08-26T22:32:50.967 に答える
2

eval の落とし穴は、SQL インジェクションに伴う落とし穴と同じです。コード内で文字列を動的に構築し、その上で eval を呼び出す場合。しかし、あなたのコードが評価対象の文字列に盲目的にユーザー入力を連結している場合は、それを求めています。eval が役立つケースは数多くありますが、eval の必要性を回避する他の方法があるため、eval を避ける傾向があります。

于 2009-08-26T22:28:48.290 に答える
1

それはメタプログラミングを簡単にします。何らかの方法でプログラムを分析したい場合(つまり、デバッグまたはプロファイリングの目的で)に最適です。

于 2009-08-26T22:53:26.290 に答える
0

私はかつて、別のマシン上の別のスクリプトによって取得され、eval() された perl コードを出力する perl CGI スクリプトを作成しました。私が両方のエンドを制御していたので安全でしたが、XML が広く知られる前の時代に何らかのシリアライゼーション形式を発明する必要があった問題を確実に解決しました。

于 2009-08-26T22:41:11.027 に答える
0

信頼できるソースからの json のデコード。グラフ電卓のように、ユーザーが入力した式を評価します。90 年代後半に、ページ要素にアクセスする正しい方法を学びたくない人々によってかなり乱用されましたが、他にはあまり考えられません。

于 2009-08-26T22:29:09.413 に答える
0

の唯一の正当な使用法は、制御できないコードを実行することです (これは、 javascript サンドボックスevalを作成している場合を除き、絶対に行うべきではありません)。

于 2009-08-27T03:03:35.273 に答える