Eval はプログラミングで使用される関数です。これは、多くのインタープリター言語 (PHP や Javascript など) に存在します。 Eval を使用すると、プログラム実行時にプログラム自身が生成した文字列 (または String) からコマンドを実行できます。以下に例を示します。これらの 2 行は完全に同等です。
a = 1 + b; cを印刷します。
eval("a = 1 + b; print c:");
実行中に文字列を介して評価すると、次のことが簡単に可能になります。
- 後で実行できるようにコードをデータベースに配置します
- プログラミングを簡素化するために、いくつかのショートカットまたは「ヒント」の記述を許可します。
- 外部ファイルを実行する
- 名前から変数または関数に動的にアクセスする
- コードの保護 (保護されたソース コードをオンザフライでデコードすることによる)
eval を使用するプログラムは完全にコンパイルできないため ( evalには常に何かが必要になる可能性があるため、通常の最適化の多くは非常に複雑です)、これらのプログラムは本質的にコンパイルされたプログラムよりも遅くなります。これは、eval を必要とせずにeval を使用することを考慮したものです。これは、eval の作成ショートカットにより、より高速なプログラミングが可能になるためです。さらに、使用される言語はこの関数を最適化できるため、 eval を使用せずに同じ結果を達成しようとするよりも、この関数を使用する方が望ましい場合があります。
この関数の強力さと可能性にもかかわらず、 eval は広く使用されていません。これは、この関数を使用するとコードが理解するのがより複雑になるためであり、部分的には、この関数が「余分」で「汚い」と考えられているためです。
セキュリティの問題
Eval はセキュリティの点で大きな問題です。特に機密データにアクセスできるプログラムの場合はそうです。実行されるチェーンの生成方法を可能な限り確認することを強くお勧めします。
PHPでのeval攻撃の例
PHPコード: $imput = POST['アクション']; eval($imput)
HTML コード: “Connection()”、”Disconnection()”、および “Read()” のみを許可します
攻撃: 「 HiddingAcces() 」のような別の値を入力する独自の HTML ページを作成します。
保護: eval を実行する前に、 $imput が許可された値の 1 つであることを確認してください。
eval に関する問題を回避するためのヒント:
- evalに入力された値が外部データから取得されたものであるか、外部データから計算されたものであるかを常に確認してください。
- $imput が値のリスト内の値である場合は、その中に$imputが含まれていることを確認します (これは、PHP のinclude 関数とrequire関数にも当てはまります)。
- ユーザー入力を決して信用しないでください (これはすべてのプログラムのすべての入力に当てはまりますが、特にこれらの場合に当てはまります) ユーザーはプログラムをテストすることを躊躇しません。
- できる限りエスケープ文字を使用してください (PHP では、 mysql_escape_string関数がデータベース アクセスを保護し、 html_entities がHTML表示を保護します)。
- $imput が作成中のプログラムに危険をもたらさないからといって、他のリンクされたプログラム (PHP コードにリンクされることが多い HTML やデータベース) について考えるべきではありません。
- 数値が期待される場合は、それが数値であることを確認し、名前が期待される場合は、それが名前であることを確認してください。 eval を使用する言語には、型付き変数が存在しないことがよくあります。そして、 is_digitまたはis_boolean はこれらの場合のために作成されます。

