JavaScript の eval() が悪ではないのはいつですか? 質問する

JavaScript の eval() が悪ではないのはいつですか? 質問する

ユーザーが入力した関数を解析する JavaScript コードを作成しています (スプレッドシートのような機能のため)。数式を解析したら、それを JavaScript に変換して実行し、結果eval()を生成します。

しかし、私はそれが悪であるため、避けられる場合は常に使用を避けてきましたeval()(そして、正しいか間違っているかは別として、評価されるコードがユーザーによって変更される可能性があるため、JavaScript ではそれがさらに悪であると私は常に思っていました)。

では、いつ使用しても問題ないのでしょうか?

ベストアンサー1

少し時間を取って、あなたの質問の前提である eval() が「悪」であるという点について説明したいと思います。プログラミング言語の人々が使用する「」という言葉は、通常「危険」、より正確には「単純に見えるコマンドで多くの害を引き起こす可能性がある」という意味です。では、危険なものを使用しても問題ないのはいつでしょうか。危険が何であるかを知っていて、適切な予防措置を講じている場合です。

では、eval() の使用における危険性について見てみましょう。他のすべてと同様に、おそらく多くの小さな隠れた危険性がありますが、eval() が悪と見なされる理由である 2 つの大きなリスクは、パフォーマンスとコード インジェクションです。

  • パフォーマンス - eval() はインタープリタ/コンパイラを実行します。コードがコンパイルされる場合、実行時におそらく重いコンパイラを呼び出す必要があるため、これは大きな打撃となります。ただし、JavaScript は依然として主にインタープリタ言語であるため、一般的に eval() を呼び出してもパフォーマンスに大きな打撃は生じません (ただし、以下の私の具体的なコメントを参照してください)。
  • コード インジェクション - eval() は、昇格された権限でコードの文字列を実行する可能性があります。たとえば、管理者/ルートとして実行されているプログラムは、ユーザー入力を eval() することは決してありません。その入力は、"rm -rf /etc/important-file" またはそれよりも悪いものである可能性があるからです。繰り返しますが、ブラウザの JavaScript では、プログラムはユーザー自身のアカウントで実行されるため、この問題は発生しません。サーバー側の JavaScript では、この問題が発生する可能性があります。

あなたの特定のケースについて。私が理解しているところによると、あなたは自分で文字列を生成しているので、「rm -rf something-important」のような文字列が生成されないように注意すれば、コード インジェクションのリスクはありません (ただし、一般的なケースでこれを保証するのは非常に難しいことを覚えておいてください)。また、ブラウザで実行している場合、コード インジェクションのリスクは非常に小さいと思います。

パフォーマンスに関しては、コーディングのしやすさとのバランスを考慮する必要があります。数式を解析する場合は、別のパーサー (eval() 内のパーサー) を実行するのではなく、解析中に結果を計算したほうがよいというのが私の意見です。ただし、eval() を使用してコーディングする方が簡単な場合があり、パフォーマンスの低下はおそらく気付かないでしょう。この場合、eval() は、時間を節約できる可能性のある他の関数よりも悪くないようです。

おすすめ記事