Skip to main content

JavaScript の eval 構文を避ける

一段落説明

eval()setTimeout()setInterval()、そして new Function() は Node.js でしばしば利用される、JavaScript の式、文そして連続した文を表す文字列パラメータを受け取るグローバル関数です。これらの関数を利用することをセキュリティ的な懸念は、ユーザーのコードを評価することは本質的には攻撃者にあらゆるアクションを実行することを許すことなので、信頼されていないユーザーの入力がコード実行の中に入り込み、サーバーを危険にさらす可能性があるということです。ユーザーの入力が渡されて実行されるような関数の利用に依存しないようにコードをリファクタすることが推奨されています。

コード例

// 攻撃者が入力できる悪意のあるコードの例
const userInput = "require('child_process').spawn('rm', ['-rf', '/'])";

// 悪意のあるコードが実行される
eval(userInput);

他のブロガーが言っていること

Liran Tal による書籍 Essential Node.js Security より:

セキュリティの観点から見ると、eval() 関数はおそらく JavaScript の中でもっとも忌み嫌われている部分でしょう。 それは JavaScript の文字列をテキストにパースし、まるで JavaScript コードのように実行します。 これを、eval() へ渡されることが分かっているかもしれない信頼されていないユーザー入力と混ぜることは、サーバーを危険にさらすことになる、崩壊へのレシピといえるでしょう。