[解決済み】JavaScriptのeval()が悪でないのはどんなとき?
質問
私は、ユーザーが入力した関数を解析するJavaScriptコードを書いています(スプレッドシートのような機能用)。数式を解析した後、私は
ができた。
をJavaScriptに変換して実行します。
eval()
を実行し、結果を得ることができます。
しかし、私はこれまでずっと
eval()
評価されるコードがユーザーによって変更される可能性があるためです)。
では、どのような場合に使用してもよいのでしょうか。
どのように解決するのですか?
ご質問の前提である、eval()が"であることについて、少し触れておきたいと思います。 悪 ということです。という言葉は、quot; 悪 プログラミング言語関係者が使う「"」は、通常「危険な」、より正確には「簡単そうなコマンドで多くの損害を与えることができる」ことを意味します。では、どのような場合に危険なものを使ってもいいのでしょうか?危険なものが何であるかを知っていて、適切な予防策をとっているときです。
要は、eval()の使い方における危険性を見てみましょう。他のものと同じように小さな危険はたくさん隠れているでしょうが、大きなリスク、つまりeval()が悪とされる理由は、パフォーマンスとコードインジェクションの2つです。
- パフォーマンス - eval()はインタープリタ/コンパイラを実行します。もしあなたのコードがコンパイルされているなら、これは大きな打撃です。なぜなら、実行時間の途中で、おそらく重いコンパイラを呼び出す必要があるからです。しかし、JavaScript はまだほとんどインタプリタ言語なので、一般的なケースでは eval() の呼び出しは大きなパフォーマンス上の問題にはなりません (ただし、以下の私の特別な指摘を参照してください)。
- コードインジェクション - eval()は、昇格した特権の下でコード列を実行する可能性があります。例えば、管理者/ルートとして実行されているプログラムは、ユーザからの入力を eval() したくはないでしょう、なぜならその入力は "rm -rf /etc/important-file" またはそれ以上のものになる可能性があるからです。繰り返しますが、ブラウザのJavaScriptにはこのような問題はありません。なぜなら、そのプログラムはどのみちユーザー自身のアカウントで実行されているからです。サーバーサイドのJavaScriptは、そのような問題を抱える可能性があります。
あなたの具体的なケースについてです。私が理解したところでは、あなたは自分で文字列を生成しているので、 "rm -rf something-important" のような文字列が生成されないように注意していれば、コードインジェクションのリスクはありません(ただし、この場合は 非常に難しい を使用すると、一般的なケースでこれを保証することができます)。また、ブラウザで実行しているのであれば、コードインジェクションのリスクはかなり小さいと思います。
パフォーマンスに関しては、コーディングの容易さと比較検討する必要があるでしょう。私の意見としては、数式を解析するのであれば、別のパーサー(eval()内のもの)を実行するよりも、解析中に結果を計算したほうがよいのではないかと思います。しかし、eval()を使ってコーディングする方が簡単かもしれませんし、パフォーマンスへの打撃はおそらく気づかないほどでしょう。この場合、eval()は時間を節約できる可能性のある他の関数よりも悪者ではないように見えます。
関連
-
[解決済み】React Js: Uncaught (in promise) SyntaxError: 位置 0 の JSON で予期しないトークン < が発生しました。
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] URLを新しいタブで開く(新しいウィンドウではない)
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] JavaScriptで、数値が精度を失うことなく到達できる最も高い整数値は何ですか?
-
[解決済み] JavaScriptの "new "キーワードは有害とみなされるか?
-
[解決済み] なぜJavaScriptのeval関数を使うとダメなのか?
-
[解決済み] eval、exec、compileの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】リソースはドキュメントと解釈されるが、MIMEタイプはapplication/zipで転送される
-
[解決済み】PhantomJS 2.1.1を使用してReactJSアプリケーションをレンダリングできない理由とは?
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート
-
[解決済み】module.exports "モジュールが定義されていません"