質問: 初めての投稿になります。よろしくお願いします。 PHPのプログラミングで良く 「eval関数はセキュリティ上問題があるので、使用不可」 といったようなコメントを見かけるのですが、eval関数と同様の事は例えば下記のような事を行えば出来てしまいます。 「ソースコードを一時テキストファイルに保存してincludeする」 eval関数は推奨されないけれども、上記のような処理は問題無いのでしょうか?それともそもそもコードテキスト等をPHPコードとして読み込むこと自身がいけない事なのでしょうか? 使い方を誤った時のセキュリティの課題はもちろんあると思いますが、結局はどれだけシステム全体がセキュリティを考慮した作りになっているかでは無いかと思っております。 テンプレートHTML等の関係からシステム内で生成したコードの読み込みの必要があり、一番良い解決方法を模索しています。ご意見をお持ちの方がおられましたらお願いいたします。
回答: 「evalは何が何でも危険」なのではなく「evalはコードインジェクション等の危険性がある為危険」であると私は理解しています。 例えばevalの引数に変数を含まず固定値ならば(指定するPHPコードにもよりますが)基本的に安全であると考えています。 同様にincludeはディレクトリトラバーサルや同じようにコードインジェクションの危険性があります。 こちらも動的な値が使われていない場合は危険性はない認識です。 (相対パスで指定する場合は、includeパスに余計なファイルが置き得ないか注意する必要がありますが。) 動的な値を指定する場合もサニタイズ(特殊文字の無効化)を行えば問題ありませんが。 その際の処理漏れを懸念して、初心者の方向けに「とりあえずevalは危険」と言っているサイトさんが多いのだと思います。 > > システム内で生成したコードの読み込み > > > こちらの処理ですが 「htmlコードを生成し文字列変数で渡すようなモジュールをinclude」 であれば問題ありませんが 「モジュールがhtmlコードを生成しファイル化、そのファイルをinclude」であれば includeに変数を使う必要が出てくると思いますのでサニタイズ処理等の考慮が必要になって来るかと思います。